鉴于以下事实和谓词:
sound(time1).
sound(time2).
sun(time3).
relax(X):-sound(X),!,sun(X).
relax(_):-sun(_).
执行
relax(S).
时我希望得到 S=time1
由于 !
,这就是说(如果我错了,请纠正我),如果满足'X',则停止回溯。这是跟踪:
3 ?- trace.
true.
[trace] 3 ?- relax(S).
Call: (6) relax(_G1831) ? creep
Call: (7) sound(_G1831) ? creep
Exit: (7) sound(time1) ? creep
Call: (7) sun(time1) ? creep
Fail: (7) sun(time1) ? creep
Fail: (6) relax(_G1831) ? creep
false.
那么为什么 Prolog 还要检查
sun(time1)
,即使它在满足 sound(X)
后遇到感叹号(因为 sound(time1)
是事实)。
最佳答案
为了更清楚地说明这一点,如果有人仍然对感叹号运算符的工作方式感到困惑(就像我所做的那样),这里有一个例子:
sound(time3).
sound(time1).
sun(time1).
relax(X):-sound(X),!,sun(X).
对于这个特定的例子,如果你向 Prolog 询问
?-relax(S).
这导致 假 .我们可以这样描述 Prolog 的工作方式:在我们的示例中使用 S))。
X 和 S 现在已绑定(bind)。
满足声音(X)。
存在。
反对,就像我在 4. 中所说的那样没有!运算符,结果为 成功 .
sound(time3).
sound(time1).
sun(time1).
relax(X):-sound(X),sun(X).
如果我在某些时候错了,请随时纠正我。
关于prolog - Prolog中的感叹号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15065663/