DCG:优先解析……基于特殊性或上下文

问题描述

鉴于下面的语法,我有 3 个问题:

%placeholder : gobble everything
p([]) --> [].
p([H|T]) --> [H],p(T).

struct(isx(A,or(on(B),under(B)))) --> p(A),[is,on,or,under],p(B).
struct(isx(A,not(on(B)))) --> p(A),not,on],on(B))) --> p(A),p(B).

struct(C) --> p(X),[Fun],p(Y),{ C =.. [Fun,X,Y],connector(Fun) }.
struct(C) --> p(X),logical(Fun) }.

connector(C) :- member(C,[on,in,into,after,before,under,above]).
logical(C) :- member(C,[or,and]).

一个最抽象也是最重要的。 您如何组织 DCG 语法,以便首先匹配最具体的规则。 目前我只是使用声明顺序来执行此操作,但我怀疑很快我会找到需要对上下文进行选择性而不是特异性的示例。

第二次 ONCE 匹配成功我想停止尝试其他选项。试图在规则的末尾加上 'cut',但没有帮助。 (有时可能不是)

?- phrase(struct(T),[the,Box,is,the,table]).
T = isx([the,Box],or(on([the,table]),under([the,table]))) ;
T = isx([the,on([or,table])) ;
T = on([the,is],table]) ;
T = under([the,or],table]) ;
T = or([the,[under,table]) ;
false.

只有第一个必须成功。

对于最简单的结构,我使用 =..member()。 对于更复杂的情况,我如何做同样的事情,即“是,在,或,在”,“是,在,或,在”,“是,在,或,出”,“之前,和,之后”,“ get,out"..... "is,on","is,in",above" ... "sat,"got,in" ...

 sat(he,on(...))
 got(sally,in([big,trouble]))

正在进行的第三点工作解决方

lol2term([H|T],R) :- maplist(lol2term,T,Rest),R =.. [H|Rest].
lol2term(L,L) :- \+ is_list(L).


%is,under
struct(R) --> p(A),C1,CL,C2],p(B),{
    lst2str(A,A1),lst2str(B,B1),lol2term( [isx,A1,[CL,[C1,B1],[C2,B1]]],R),connector(C1),connector(C2),logical(CL) 
}.
%is,on  
struct(R) --> p(A),C1],[not,connector(C1) 
}.

%is,on
struct(R) --> p(A),B1]],connector(C1) 
}.

我之前问过这个:complex term

现在的问题是占位符不能是列表;(/我必须将它们转换为str/,因为每个列表都被转换为结构。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)