Prolog /真假定义

时间:2018-04-17 13:43:59

标签: 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

我的问题是,地狱后test2(X,Y)如何返回X=7,Y=8

1 个答案:

答案 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。

猜猜它说明了使用!时必须要小心谨慎。