Prolog 序言中缺席事实的否定
假设我有Prolog 序言中缺席事实的否定,prolog,Prolog,假设我有 goal(A,B) :- goal1(A,C), \+ goal2(C,B). 但是现在让我们假设目标(c,b)无法推断 如果我查询,\+goal(c,b),那么我得到了true 但是,如果我查询goal(a,B),那么我不会得到B=B,因为它甚至不会检查goal2(c,B)(因为无法推断)。它只检查所有当前事实goal2(C,B),只选择那些错误的 这就是问题所在。当我查询类似于goal(a,B)的内容时,我想用B=B作为答案。这在prolog中是可能的。请注意,我不想在prolo
goal(A,B) :- goal1(A,C), \+ goal2(C,B).
但是现在让我们假设目标(c,b)
无法推断
如果我查询,\+goal(c,b)
,那么我得到了true
但是,如果我查询goal(a,B)
,那么我不会得到B=B
,因为它甚至不会检查goal2(c,B)
(因为无法推断)。它只检查所有当前事实goal2(C,B)
,只选择那些错误的
这就是问题所在。当我查询类似于goal(a,B)
的内容时,我想用B=B
作为答案。这在prolog中是可能的。请注意,我不想在prolog中插入负面事实,如goal(c,b):-false
谢谢。试图从您的问题中猜出,请说我们有:
p(a, 1).
p(c, 2).
p(d, 1).
p(e, 2).
如果要查询第二个参数不是2的所有p/2,可以执行以下操作之一:
?- p(X, Y), Y \== 2.
或:
阅读文档,看看有什么不同。这里有很多问题需要讨论。你能试着找一个有效的例子吗?例如,提供goal1/2和goal2/2的示例定义以及您想要使用的查询。好的,一个更简单的示例@TA_intern:-我们可以定义一个父/2关系,但事实很少。那么我想知道所有父亲不是“a”的人。大概是吧?-不是父亲(a,X)。那么我认为挑战在于定义notfather/2。因为如果我定义notfather(A,B):-\+father(A,B)。如果prolog能够将数据库中定义的所有常量替换为要检查的否定规则,而不是仅使用现有的推断规则进行检查,则基本上会出现相同的问题。然后它就可以工作了。我想现在你知道问题出在哪里了。你不能把这个写在问题里吗?很难理解我无法复制粘贴并在计算机上运行的代码。嘿,这似乎对我有用:)。谢谢所以我的想法是,如果我想检查数据库中定义的“所有常量”,它们必须是事实。然后我想用这些事实来检查那个常数。@Tojrah,我不知道。如果没有代码示例,我真的很难理解:(
?- dif(Y, 2), p(X, Y).