jul*_*les 5 grammar prolog dcg
我想在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还是陌生的,老实说,我想不出更好的方法。我对更好的替代品非常感兴趣!(所以我有点半信半疑,这就是我想要的;-)非常感谢您到目前为止的支持...)
您希望将诸如x
(无需编写'x'
) 之类的基本术语与未实例化的变量相关联。当然,这并不构成纯粹的关系。所以我不太清楚你是否真的想要这个。
[x, &&, x]
您首先从哪里获得该列表?您可能有某种标记器。如果可能,请尝试在实际解析之前将变量名称与变量关联起来。如果您坚持在解析期间执行该关联,则必须在整个语法中穿插一对变量。也就是说,而不是像这样的干净语法
power(P) --> factor(F), power_r(F, P).
Run Code Online (Sandbox Code Playgroud)
你现在必须写
power(P, D0,D) --> factor(F, D0,D1), power_r(F, P, D1,D).
% ^^^^ ^^^^^ ^^^^
Run Code Online (Sandbox Code Playgroud)
因为您正在将上下文引入上下文无关的语法中。
解析Prolog文本时,也会出现同样的问题。变量名称和具体变量之间的关联已在标记化过程中建立。实际的解析器不必处理它。
在标记化期间基本上有两种方法可以执行此操作:
1mo 收集Name=Variable
列表中的所有出现情况并稍后将它们统一:
v(N-V, [N-V|D],D) --> [N], {maybesometest(N)}.
unify_nvs(NVs) :-
keysort(NVs, NVs2),
uniq(NVs2).
uniq([]).
uniq([NV|NVs]) :-
head_eq(NVs, NV).
uniq(NVs).
head_eq([], _).
head_eq([N-V|_],N-V).
head_eq([N1-_|_],N2-_) :-
dif(N1,N2).
Run Code Online (Sandbox Code Playgroud)
2.尽早使用一些显式字典来合并它们。
这个问题有点相关。
归档时间: |
|
查看次数: |
541 次 |
最近记录: |