我需要引入一个让我否定原子的谓词。到目前为止,我有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)。
我仍然不确定如何解决这个问题。
答案 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.
不确定这会与您的代码合并得多好。