我需要引入一个谓词来否定原子。到目前为止,我有neg(Premise) :- \+ Premise.
,这给了我以下结果:
?- assert(a).
true.
?- a.
true.
?- neg(a).
false.
?- neg(neg(a)).
true.
这是有道理的,一切都是花花公子,直到我尝试统一。例如
[a,_] = [a,123].
返回true.
尽管
[a,_] = [neg(neg(a)),123].
返回false.
。
我该如何解决这个问题,以便对neg(neg(X))
零件进行评估或以其他方式统一X
(因为它们在逻辑上都是等效的)?所以基本上,我需要X=neg(a), a=neg(X).
成功。
编辑我找到了一个解释,为什么 not(not(<expression>))
不等同<expression>
于序言。既然<expression>
成功了,not(<expression>)
就失败了。当目标失败时,它实例化的变量将无法实例化。(来源,幻灯片 14)。
我仍然不确定如何解决这个问题。