所以,我正在使用以下代码:
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
?
答案 0 :(得分:3)
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)
的计算结果为真,最终导致X = 7,Y = 8。
猜猜它说明了使用!
时必须要小心谨慎。