Prolog 扩展术语的统一,双重否定

Prolog 扩展术语的统一,双重否定,prolog,unification,Prolog,Unification,我需要引入一个谓词,让我否定原子。到目前为止,我有negPremise:-\+Premise.,这给了我以下结果: ?- assert(a). true. ?- a. true. ?- neg(a). false. ?- neg(neg(a)). true. 这是有道理的,在我尝试统一之前,一切都是美好的。比如说 [a,z]=[a,123]。返回true 当 [a,z]=[negnega,123]。返回false 我如何解决这个问题,以便对Negx部分进行求值或以其他方式与X统一,因为它

我需要引入一个谓词,让我否定原子。到目前为止,我有negPremise:-\+Premise.,这给了我以下结果:

?- assert(a).
true.

?- a.
true.

?- neg(a).
false.

?- neg(neg(a)).
true.
这是有道理的,在我尝试统一之前,一切都是美好的。比如说

[a,z]=[a,123]。返回true

[a,z]=[negnega,123]。返回false

我如何解决这个问题,以便对Negx部分进行求值或以其他方式与X统一,因为它们在逻辑上是等价的?基本上,我需要X=nega,a=negX。成功

编辑我发现了一个解释,解释为什么notnot不等同于prolog。既然成功了,就不要失败。当目标失败时,它实例化的变量将无法实例化,幻灯片14


但我仍然不知道如何绕过这个问题。

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

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.

不确定这将与您的代码融合得有多好。

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

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.

不确定这与代码的合并程度。

Prolog没有像函数一样执行谓词并返回结果。它尽可能实例化未实例化的变量,并检查真值。所以Nega没有做你可能认为的事。它用nega实例化前提,然后计算\+nega。最终确定neg的真值,以nega作为一个术语。您的数组示例试图将a与nega统一起来,但失败了,因为它们都是完全实例化的术语,不匹配。你需要更清楚地知道你想做什么才能“绕过它”。@mbrach我明白了。基本上我想要的是:如果洛杉矶。等一下,然后是Lnegnga。我们也应该成功。这有意义吗?是的。你想要一个谓词,上面写着,lnegnegX:-lX.@mbrach,如果我想所有谓词都这样?复制粘贴并用l替换每个谓词似乎不是最有效的解决方案。事实上,如果你正在寻找一个通用的解决方案,那就没有效率了。我有点好奇是什么促使这种情况如此普遍。可能需要进行一些重构。Prolog不像函数那样执行谓词并返回结果。它尽可能实例化未实例化的变量,并检查真值。所以Nega没有做你可能认为的事。它用nega实例化前提,然后计算\+nega。最终确定neg的真值,以nega作为一个术语。您的数组示例试图将a与nega统一起来,但失败了,因为它们都是完全实例化的术语,不匹配。你需要更清楚地知道你想做什么才能“绕过它”。@mbrach我明白了。基本上我想要的是:如果洛杉矶。等一下,然后是Lnegnga。我们也应该成功。这有意义吗?是的。你想要一个谓词,上面写着,lnegnegX:-lX.@mbrach,如果我想所有谓词都这样?复制粘贴并用l替换每个谓词似乎不是最有效的解决方案。事实上,如果你正在寻找一个通用的解决方案,那就没有效率了。我有点好奇是什么促使这种情况如此普遍。可能需要进行一些重构。