考虑以下代码:
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/