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)统一。