序言中缺失事实的否定

Negation of absent fact in prolog

假设我有;

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) 并只挑选那些错误的。

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

谢谢。

尝试根据您的问题进行猜测,假设我们有:

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

并且您想查询所有 p/2 其中第二个参数是 而不是 2,您可以这样做:

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

或:

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

阅读文档看看有什么区别。 SO 上有很多问题讨论这个问题。