统一扩展术语,双重否定

时间:2013-11-05 17:25:02

标签: prolog unification

我需要引入一个让我否定原子的谓词。到目前为止,我有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>))与prolog中的<expression>不等同的解释。自<expression>成功以来,not(<expression>)失败。当目标失败时,它实例化的变量将被取消实例化。 (source,幻灯片14)。

我仍然不确定如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

真值的具体化将适用于您的简单案例:

4 ?- [user].
|: reify(P, V) :- call(P) -> V = 1 ; V = 0.
% user://1 compiled 0.03 sec, 2 clauses
true.

5 ?- reify(true, V), reify(\+ \+ true, U), V = U.
V = U, U = 1.

使用您的符号:

6 ?- [user].
|: a.
|: neg(P) :- \+ P.
% user://2 compiled 0.02 sec, 3 clauses
true.

7 ?- reify(a, V), reify(neg(neg(a)), U), V = U.
V = U, U = 1.

不确定这会与您的代码合并得多好。