Syntax Prolog分辨率验证程序删除括号
我正在用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周围的括号已删除,而它们仍保留在第一条中。为什么会这样 作为参考,是我的代码
[[(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.