Prolog/true-false定义
因此,我正在使用以下代码:Prolog/true-false定义,prolog,Prolog,因此,我正在使用以下代码: test:- p(X,Y), r(Y), s(X), write(X), nl, fail. test. test2(X,Y):- p(X,Y), r(Y). p(3,4). p(6,9). p(7,8). r(X):- s(X), t(X). s(7). s(6):-!. s(8). t(9). t(8). t(5):-!. t(4). s(X)返回X=7;X=6。 t(X)返回X=9;X=8;X=5。 显然,r(X)返回false 我的问题是,那么te
test:- p(X,Y), r(Y), s(X), write(X), nl, fail.
test.
test2(X,Y):- p(X,Y), r(Y).
p(3,4).
p(6,9).
p(7,8).
r(X):- s(X), t(X).
s(7).
s(6):-!.
s(8).
t(9).
t(8).
t(5):-!.
t(4).
s(X)
返回X=7;X=6。
t(X)
返回X=9;X=8;X=5。
显然,r(X)
返回false
我的问题是,那么test2(X,Y)
如何返回X=7,Y=8
?r(X)
将失败。。。但是r(8)
不会!这是因为如果使用r(X)
,系统会一直搜索,直到遇到代码>运算符,然后停止搜索。但是如果你直接向它索要r(8)
,它将永远不会遇到首先是代码>运算符
因此,当系统将p(X,Y)
与p(7,8)
相结合时,下一步是尝试r(8)
,这将导致s(8),t(8)
。这两种方法都成功了,因为它们寻找的是s(8)
和t(8)
,而不是s(X)
和t(X)
。这样他们就不会遇到代码>操作员。结果是r(8)
的计算结果为true,最终导致X=7,Y=8
我猜这说明了在使用时必须多么小心代码> 这实际上很搞笑,它将首先寻找r(8)。。。非常感谢,你为我节省了很多时间!不客气!它首先查找r(8)
,因为此时它已经统一为Y=8。如果规则是r(Y),p(X,Y)
,那么它将失败。有时我会想到的全名代码>应小心使用
:-)@Ironwing…它将首先查找r(8)
。。。。实际上,Prolog并没有这样做。当您在Prolog中查询时,它会从断言的事实和谓词的开头开始搜索查询将与之统一的术语。当您查询r(X)
时,Prolog能够将r(X)
与r(6)
相统一,从而产生X=6
,然后它会回溯,并可以将r(X)
与r(7)
相统一,但切割会阻止进一步回溯。当您查询r(8)
时,Prolog无法将其与r(6)
或r(7)
统一,永远无法进入切入点r(7):-
并最终成功地与r(8)统一。