鉴于以下事实和谓词:
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)
是事实)。