首先要了解的是:-
操作员。
this_will_be_true :- if_this_is_true
基本上,右边的任何东西都是:-
先决条件。一个很好的例子是:
sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y).
这基本上意味着如果存在父 Z 使得 Z 是 X 和 Y 的父级,则 X 和 Y 是兄弟姐妹。
append([ ], A, A).
这一行基本上意味着将某些内容附加到空列表会返回该内容。这是递归中的基本情况。
append([A|B], C, [A|D]) :- append(B,C,D).
这行意味着将 C 附加到具有 A 和 B 的现有列表会返回具有 A 和 D 的列表,因为将 C 附加到 B 会返回 D。
Build a list:
?- append([a],[b],Y).
Y = [ a,b ]
所以,这里发生的事情是 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 将返回唯一可能的值,X
以便语句返回 true。我们来看看第二条规则。所以我们知道那[a, b]
是[A|D]
。这意味着A
isa
和D
is [b]
。我们也知道C
是[b]
。所以现在,我们需要看看先决条件来弄清楚是什么B
。append(B, C, D)
转换为append(B, [b], [b])
。现在,使用第一条规则,我们知道B
必须是[ ]
。所以现在我们知道[A|B]
与[a|[ ]]
相同 [a]
。因此,X
必须[a]
。
我希望这是一个足够详细的解释。