快速解释失败

时间:2014-05-30 09:49:12

标签: prolog

我对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.

任何人都可以解释这是如何工作的?

1 个答案:

答案 0 :(得分:3)

fail总是false,没有更多内容。我认为你应该考虑回溯和!如何工作。

带剪切的第一个代码就是这样:

  • ?- f1(X)已扩展为?- a(X),!, fail, b(X)
  • 发现{li> 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).适用于45