我想在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回溯功能:
[x,'&&',y][G_123,'&&',G_456]现在具有“真实” Prolog变量)v找到一个分配,以使v(T) = t搜索空间耗尽。我对Prolog还是陌生的,老实说,我想不出更好的方法。我对更好的替代品非常感兴趣!(所以我有点半信半疑,这就是我想要的;-)非常感谢您到目前为止的支持...)
有没有办法配置YAP(和/或SWI prolog),以便它们在任何调用term_to_atom/2?中保留变量名称.
例如,当我执行此操作时:
term_to_atom(member(X, [1,2]), A).
Run Code Online (Sandbox Code Playgroud)
我得到了这个答案:
A = 'member(_131405,[1,2])'
Run Code Online (Sandbox Code Playgroud)
哪里X被其内部代表所取代.
但是,我想得到这个答案:
A = 'member(X,[1,2])'
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!