Syntax Prolog分辨率验证程序删除括号

Syntax Prolog分辨率验证程序删除括号,syntax,prolog,logic,Syntax,Prolog,Logic,我正在用prolog编写一个分辨率验证程序,它接受以下形式的输入 [[(a or b) equiv neg(c and d)]] 等,并将其转换为CNF。所有逻辑运算符都可以正常工作,但当程序尝试展开equiv操作时,括号将丢失。例如,在上执行算法的一个步骤 [[(a and b) equiv c]] 给出了结果 [[neg(a and b) or c], [neg c or a and b]] 在第二条中,a和b周围的括号已删除,而它们仍保留在第一条中。为什么会这样 作为参考,是我的代码

我正在用prolog编写一个分辨率验证程序,它接受以下形式的输入

[[(a or b) equiv neg(c and d)]]
等,并将其转换为CNF。所有逻辑运算符都可以正常工作,但当程序尝试展开
equiv
操作时,括号将丢失。例如,在上执行算法的一个步骤

[[(a and b) equiv c]]
给出了结果

[[neg(a and b) or c], [neg c or a and b]]
在第二条中,
a和b
周围的括号已删除,而它们仍保留在第一条中。为什么会这样


作为参考,是我的代码,给出输出的命令是单步([[(a和b)等价于c]],X)。关于如何处理
等价物的具体代码在第93行,函数
单步
在第108行。

之所以发生这种情况,是因为运算符优先级的定义方式如下:

neg c or (a and b)

它们是等价的。您不包括运算符声明,但它们可能是具有同等优先级的
xfy

要测试等效性,可以尝试简单的模式匹配:

?- neg c or a and b = X or Y.
X = neg c,
Y = a and b?

?- neg c or a and b = X and Y.
no.

确认运算符的解释方式。

这可能是因为您在运算符中定义的优先级,因为这些括号是多余的。所有运算符都具有相同的优先级,但
neg
的优先级更高。那么,当运算符具有相同的优先级时,肯定需要括号吗?好的,右边的一个是从左到右的,所以
((neg c)或a)和b)
@WillemVanOnsem:我认为你的评论在技术上有点不正确。当我查询
F=(negc或a和b)时,F=。。G
,我得到的结果是
G=[或,负c,a和b]
。因此,带括号的表达式是
(neg c)或(a和b)
。因此,内森的代码似乎是正确的。通常,如果使用Prolog运算符,Prolog系统会关心括号。@tphilipp:arrghh是的,它的方向相反,抱歉,不知怎么搞混了。谢谢
?- neg c or a and b = X or Y.
X = neg c,
Y = a and b?

?- neg c or a and b = X and Y.
no.