prolog - Prolog 中的剪切和失败

标签 prolog prolog-cut

考虑以下代码:

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).会被检查,我想,那为什么会失败呢?

最佳答案

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

cut 删除替代项,然后禁止通过 X 返回的值。捆绑。尝试

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

你会得到
?- a(X).
X = 4.

关于prolog - Prolog 中的剪切和失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15138706/

相关文章:

list - 什么是Prolog中的 “!”

prolog - 在处理列表时, "-"符号在Prolog中是什么意思?

prolog - 使用削减来提高效率

prolog - 建模约束逻辑程序(用于分析)

list - 删除 Prolog 中元素的第一次出现

prolog - 理解 clause/2 谓词

prolog - 差异列表不完整

prolog - 逻辑编程和自动定理证明之间的区别

在没有剪切的情况下在 Prolog 中解析?

prolog - 在 Prolog 中切入更高层次