Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 序言中缺席事实的否定_Prolog - Fatal编程技术网

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).