如何阅读prolog中的谓词

use*_*190 7 logic prolog

在学习命题逻辑和谓词逻辑后,我转向Prolog.

我想知道是否有人可以为我澄清语法,因为我无法阅读它.

我可以轻松地阅读下面的内容.所以它说

如果X是Y的子,则X是Y的下降.

然后它继续说

如果X是Z的子节点并且Z是Y的下降,则X是Y的下降.

descend(X,Y) :-
   child(X,Y).
descend(X,Y) :-
   child(X,Z),
   descend(Z,Y).
Run Code Online (Sandbox Code Playgroud)

但是一旦我开始研究列表编程,我就很难阅读谓词的语法.例如下面的内容

remove([], _, []).
remove([X | Xs], X, Ys) :- remove(Xs, X, Ys).
remove([Y | Xs], X, [Y | Ys]) :- X \== Y, remove(Xs, X, Ys).
Run Code Online (Sandbox Code Playgroud)

从测试开始,它会删除第二个项目,例如,如果我输入

remove([a,b,c], b, Ys).
Run Code Online (Sandbox Code Playgroud)

我会的 Ys = [a,c].

但我不知道如何阅读语法,如果有人可以为我分解,那就太好了.

lur*_*ker 2

事实上,您需要测试它只是为了看看它做了什么,这说明remove/3它的名字可能不太好。remove非常通用,并且留下了“删除什么?”的问题。而且,它是命令式的,Prolog 想要是关系式的。也许更好的名称是list_without/3第三个参数中的列表是第一个参数中的列表,但没有第二个参数。

不管怎样,让我们​​读一下你所拥有的。

读取您的remove/3谓词可以按如下方式完成:

remove([], _, []).
Run Code Online (Sandbox Code Playgroud)

如果我删除任何元素,空列表仍然是空列表。

remove([X | Xs], X, Ys) :- remove(Xs, X, Ys).
Run Code Online (Sandbox Code Playgroud)

该列表是删除了元素的Ys列表,如果是从 中删除所有元素后得到的列表。[X|Xs]X YsXXs

remove([Y | Xs], X, [Y | Ys]) :- X \== Y, remove(Xs, X, Ys).
Run Code Online (Sandbox Code Playgroud)

[Y|Ys]是删除了元素[Y|Xs]的列表,如果与 不同,是从 中删除所有元素后得到的列表。X XYYsXXs

作为练习,您应该尝试再次阅读这些内容,但使用更相关的名称,例如我提供的重命名示例。

  • @false 谢谢你。仍在学习“dif/2”的微妙之处。 (2认同)
  • @lurker:你修好它吗? (2认同)