我想在 Prolog 中使用 DCG 解析逻辑表达式。
逻辑术语表示为列表,例如['x','&&','y']
,x ∧ y
结果应该是解析树and(X,Y)
(过去X
和Y
现在都是未分配的 Prolog 变量)。
我实现了它,一切都按预期工作,但我有一个问题:
我无法弄清楚如何解析变量'x'
并'y'
获取真正的 Prolog 变量X
以及Y
以后分配真值。
我尝试了以下规则变体:
v(X) --> [X].
:
这当然行不通,它只会返回and('x','y')
.
但是我可以用 Prolog 变量统一替换这个术语中的逻辑变量吗?我知道谓词term_to_atom
(它被提议作为类似问题的解决方案),但我认为它不能在这里使用来达到预期的结果。v(Y) --> [X], {nonvar(Y)}.
:
这确实会返回一个未绑定的变量,但当然每次都会返回一个新变量,即使逻辑变量('x','y',...)已经在术语中,所以['X','&&','X']
被评估and(X,Y)
为不是所需的结果,要么.
这个问题有什么优雅或惯用的解决方案吗?
提前谢谢了!
编辑:
这个问题的背景是我正在尝试在 Prolog中实现DPLL 算法。我认为将逻辑术语直接解析为 Prolog 术语以方便使用 Prolog 回溯工具会很聪明:
- 输入:一些逻辑项,例如 T =
[x,'&&',y]
- 解析后的术语:(
[G_123,'&&',G_456]
现在具有“真实”的 Prolog 变量) - 将 { boolean(t), boolean(f) } 中的值赋给 T 中的第一个未绑定变量。
- 简化术语。
- ...重复或回溯,直到
v
找到分配,v(T) = t
或者搜索空间被耗尽。
我对 Prolog 很陌生,老实说,我想不出更好的方法。我对更好的选择非常感兴趣!(所以我有点半信半疑,这就是我想要的 ;-) 非常感谢你到目前为止的支持......)