7

考虑以下代码:

a(X) :- b(X),!,c(X),fail.
a(X) :- d(X).

b(1).
b(4).
c(1).
c(3).

d(4).

查询a(X).产生

1 ?- a(X).
false.

2 ?-

但有了这段代码

a(X) :- b(X),!,c(X).
a(X) :- d(X).

b(1).
b(4).
c(1).
c(3).

d(4).

查询a(X).结果:

1 ?- a(X).
X = 1.

所以我的问题是,为什么fail/1产生错误?它应该强制回溯,对吗?然后b(1)c(1).被检查,我想,那为什么会失败呢?

4

4 回答 4

3

它失败了,因为fail 必须失败。

剪切删除了替代项,然后禁止通过X绑定“返回”的值。尝试

a(X) :- b(X),c(X),fail.
...

你会得到

?- a(X).
X = 4.
于 2013-02-28T15:12:14.117 回答
3

例子 :

a(X):- b(X),!,fail. %is the same as \+ a(X):- b(X).

“!”的合并 和“失败”给你a(X) 的否定

它被称为失败的否定

于 2019-01-22T18:46:25.017 回答
1

正如@CapelliC 所说, must 的规则a(X) :- b(X),!,c(X),fail. 失败了,因为他有failcomponent 。

在第一个代码示例中 - 检查开始1,组件b(1)满足,然后它到达!,因此不再执行可选检查。

有关 的更多说明,您可以检查cut!a(X) :- b(X),!,c(X),fail.

像这样 -

a(X) :- b(X),c(X),fail,!.
a(X) :- d(X).

b(1).
b(4).
c(1).
c(3).

d(4).

现在 -

?- a(X).
X = 4.

因为fail是 在 之前!所以!不可达所以cut不 影响 还是 另一个 可选 的 考虑 .

编辑 :

fail只与他在那里写的规则有关,所以会a(X) :- b(X),c(X),fail,!.永远导致失败,而不是a(X) :- d(X).规则。

于 2013-02-28T17:15:50.087 回答
0
a(X) :- b(X),c(X),fail.
a(X) :- d(X).

b(1).
b(4).
c(1).
c(3).

d(4).

a(X). 
X = 4


a(X) :- b(X),!,c(X).
a(X) :- d(X).

b(1).
b(4).
c(1).
c(3).

d(4).

a(X).
X = 1

a(X) :- b(X),!,c(X),fail.
a(X) :- d(X).

b(1).
b(4).
c(1).
c(3).

d(4).

a(X).
false
于 2017-01-17T00:36:58.440 回答