首先要理解的是:-
操作符。
this_will_be_true :- if_this_is_true
基本上,无论是在:-
的权利是一个先决条件。一个很好的例子是:
sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y).
这基本上意味着,X和Y是兄弟姐妹,如果存在一个父Ž使得Z既是X的父和Y.
append([ ], A, A).
此线基本上意味着将某些内容附加到空列表会返回某些内容。这是递归的基本情况。
append([A|B], C, [A|D]) :- append(B,C,D).
此行意味着追加C到A和B的现有列表返回因为追加C到B返回D.
Build a list:
?- append([a],[b],Y).
Y = [ a,b ]
那么,什么是怎么回事A和d列表Prolog返回给定两个初始值满足两个规则的唯一可能值Y
。我们来想想这是如何发生的。这需要先由第二条规则进行评估。所以[A|B]
是[a]
和C
是[b]
。
所以用[A|B]
我们必须回到第一条规则,因为B
是空列表(它是[ ]
)。第一条规则基本上规定我们可以写[a]
为[a|[ ]]
,它们是一样的。所以现在我们可以回到第二条规则。 A
是a
,B
是[ ]
和C
是[b]
。
因此,现在我们来检查append(B, C, D)
的先决条件。这是append([ ], [b], D)
。再次使用第一条规则,我们可以看到D
也是[b]
。
所以Y
,按第二个规则定义,是[A|D]
。现在我们知道D
是[b]
,我们知道Y
是[a, b]
。
我只会做一个分手,因为它们基本上是一回事。
?- append(X,[b],[a,b]).
X = [ a ]
所以在这里,Prolog的打算,这样的语句返回true返回的X
唯一可能的值。我们来看看第二条规则。所以我们知道[a, b]
是[A|D]
。这意味着A
是a
而D
是[b]
。我们也知道C
是[b]
。所以现在,我们需要看一下前提条件来确定B
是什么。 append(B, C, D)
转换为append(B, [b], [b])
。现在,使用第一条规则,我们知道B
必须是[ ]
。所以现在我们知道[A|B]
是[a|[ ]]
这与[a]
相同。因此,X
必须是[a]
。
我希望这是一个足够详细的解释。
请考虑查询'append(X,Y,[a,b])'! – false