在学习命题逻辑和谓词逻辑后,我转向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].
但我不知道如何阅读语法,如果有人可以为我分解,那就太好了.
事实上,您需要测试它只是为了看看它做了什么,这说明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
Ys
X
Xs
remove([Y | Xs], X, [Y | Ys]) :- X \== Y, remove(Xs, X, Ys).
Run Code Online (Sandbox Code Playgroud)
[Y|Ys]
是删除了元素[Y|Xs]
的列表,如果与 不同,是从 中删除所有元素后得到的列表。X
X
Y
Ys
X
Xs
作为练习,您应该尝试再次阅读这些内容,但使用更相关的名称,例如我提供的重命名示例。
归档时间: |
|
查看次数: |
331 次 |
最近记录: |