【发布时间】:2014-11-18 14:11:26
【问题描述】:
我想在 Prolog 中使用 DCG 解析一个逻辑表达式。
逻辑术语表示为列表,例如['x','&&','y'] for x ∧ y 结果应该是解析树 and(X,Y)(X 和 Y 是未分配的 Prolog 变量)。
我实现了它,一切都按预期工作,但我有一个问题:
我不知道如何解析变量'x' 和'y' 以获得真正的Prolog 变量X 和Y,以便稍后分配真值。
我尝试了以下规则变体:
v(X) --> [X].:
这当然行不通,它只返回and('x','y')。
但是我可以用 Prolog 变量统一替换这个术语中的逻辑变量吗?我知道谓词term_to_atom(它被提议作为similar problem 的解决方案),但我认为它不能在这里使用来达到预期的结果。v(Y) --> [X], {nonvar(Y)}.:
这确实会返回一个未绑定的变量,但每次都会返回一个新变量,即使逻辑变量 ('x','y',...) 已经在术语中,所以['X','&&','X']被评估为and(X,Y),这也不是想要的结果。
这个问题有什么优雅或惯用的解决方案吗?
提前非常感谢!
编辑:
这个问题的背景是我正在尝试在 Prolog 中实现DPLL-algorithm。我认为将逻辑术语直接解析为 Prolog 术语以方便使用 Prolog 回溯工具会很聪明:
- 输入:一些逻辑术语,例如 T =
[x,'&&',y] - 解析后的术语:
[G_123,'&&',G_456](现在具有“真实”Prolog 变量) - 将 { boolean(t), boolean(f) } 中的值赋给 T 中的第一个未绑定变量。
- 简化术语。
- ...重复或回溯,直到找到分配
v以致v(T) = t或搜索空间耗尽。
我对 Prolog 还很陌生,老实说,我想不出更好的方法。我对更好的选择非常感兴趣! (所以我有点半信半疑,这就是我想要的 ;-) 非常感谢您迄今为止的支持......)
【问题讨论】:
-
您想在什么时候实际查看
X和Y?您是否坚持将'x'映射到X?还是只是想让所有'x'引用最终解析树中的同一个变量? -
@Boris 我编辑了问题以提供更多上下文 - 只要始终引用同一个变量,我就不关心变量名称。