syntax - Prolog resolution prover 删除括号

标签 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 两边的括号已被删除,而它们保留在第一个子句中。为什么会这样?

供引用,this是我的代码,给出输出的命令是 singlestep([[(a and b) equiv c]], X). 应该如何处理 equiv with 在第 93 行,函数 singlestep 在第 108 行。

最佳答案

发生这种情况是因为运算符优先级的定义方式是

neg c or (a and b)

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.

确认运算符的解释方式。

关于syntax - Prolog resolution prover 删除括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61684350/

相关文章:

batch-file - "&&"在这个批处理文件中做了什么?

javascript - 没有 TypeError 的深度 Javascript 检查是否未定义

javascript - JS 函数就这么简单,超链接语法

list - Prolog:检查某项是否是列表中的最后一项?

list - Prolog递归谓词结束后返回初始状态

JQuery 改变每次点击选择的背景

php - 为什么我不能在PHP中直接使用函数返回值作为动态类名?

prolog - 补图 - prolog

design-patterns - 游戏(例如 Oblivion)任务是如何建模的?

java - 修复 Java 中的移动逻辑