我对prolog很新,我很难理解其中fail
的工作方式。
我在下面有一个简单的代码,我输入查询得到错误的结果:
?- f1(X).
false.
a(1).
a(2).
a(3).
a(4).
a(5).
b(2).
b(3).
b(4).
b(5).
c(3).
c(4).
c(5).
d(4).
d(5).
f1(X):- a(X),!, fail, b(X).
f1(X):- d(X).
但如果f1(X)被定义为:
f1(X):- a(X), b(X), fail.
f1(X):- d(X).
同一查询的输出将是:
X = 4 ;
X = 5.
任何人都可以解释这是如何工作的?
答案 0 :(得分:3)
fail
总是false
,没有更多内容。我认为你应该考虑回溯和!
如何工作。
带剪切的第一个代码就是这样:
?- f1(X)
已扩展为?- a(X),!, fail, b(X)
a(X)
对于1
属实
!
表示a(1),!, fail, b(1)
被裁减为?- fail, b(1)
,并且f1/1
的任何其他条款都不会被检查< / strong>(例如。d(X)
将不会被查询)fail, b(1)
始终为false
,因为fail
始终为false
你的第二个代码:
?- a(X), b(X), fail.
始终为false
,因为fail
始终为false
false
,所以我们尝试另一个条款 ?- d(X).
适用于4
和5
。