首页 > 解决方案 > 序言中缺席事实的否定

问题描述

假设我有;

goal(A,B) :- goal1(A,C), \+ goal2(C,B).

但现在让我们说goal(c,b)无法推断。

如果我查询,\+ goal(c,b)那么我得到 true 但是,如果我查询goal(a,B),那么我没有得到B=b,因为它甚至不检查goal2(c,b)(因为它无法推断)。它只是检查所有当前的事实goal2(C,B)并只挑选那些错误的。

现在这就是问题所在。当我查询类似的内容时,我想B=b作为答案goal(a,B)。在序言中是否可能。请注意,我不想像goal(c,b):-false在序言中那样插入负面事实。

谢谢。

标签: prolog

解决方案


试图从你的问题中猜测,说我们有:

p(a, 1).
p(c, 2).
p(d, 1).
p(e, 2).

并且您想查询第二个参数不是2 的所有 p/2,您可以执行以下操作:

?- p(X, Y), Y \== 2.

或者:

?- dif(Y, 2), p(X, Y).

阅读文档以了解有什么区别。这里有很多关于 SO 的问题都在讨论这个问题。


推荐阅读