Prolog如何消除左递归

Prolog如何消除左递归,prolog,context-free-grammar,swi-prolog,dcg,left-recursion,Prolog,Context Free Grammar,Swi Prolog,Dcg,Left Recursion,我已经在prolog中编写了DCG(形容词短语和介词短语),当我试图运行它时,通过输入ip([every,boy,loved,some,girl]),它显示在本地堆栈之外。我意识到nbar有问题。有人能帮我吗?非常感谢 %树 treeP(任期):- %假设缩进为0,打印树 treeP(0,术语), %用linefeed整理 荷兰。 树(树):- %树只是一个变量 变量(树),!, 写(树)。 树(N,[树|树]):- 正确的树列表([Tree | Trees]),!, 写入(“[”), N1是N

我已经在prolog中编写了DCG(形容词短语和介词短语),当我试图运行它时,通过输入
ip([every,boy,loved,some,girl])
,它显示在本地堆栈之外。我意识到nbar有问题。有人能帮我吗?非常感谢

%树
treeP(任期):-
%假设缩进为0,打印树
treeP(0,术语),
%用linefeed整理
荷兰。
树(树):-
%树只是一个变量
变量(树),!,
写(树)。
树(N,[树|树]):-
正确的树列表([Tree | Trees]),!,
写入(“[”),
N1是N+1,
treePNEL(N1,[树|树]),
写入(']')。
树梢(N,树):-
%非原子壳
Tree=…[函子,参数|参数],
!,
%写出函子和左括号
write(函子),write(“(”),
%将N1设置为参数的新缩进
原子长度(函子,M),N1是N+M+1,
%漂亮的打印参数
treePNEL(N1,[参数|参数]),
%右括号
写(“)”)。
树(树):-
%非英镑案件
写(树)。
树(N[Tree1,Tree2 | Trees]):-
treeP(N,Tree1),
%转到正确位置进行进一步打印
nl,制表符(N),
树(N,[Tree2 |树])。
树(N,[树]):-
树(N,树)。
ip(句子):-
组(IP,
知识产权(知识产权,句子,[]),
知识产权),
treeP(IP)。
ip(SSem)->np(NPSem),ibar(IbarSem),
{var_replace(NPSem,NPSem1),
贝塔(NPSem1@IbarSem,SSem)}。
ibar(VPSem)-->i(MvdVbL),vp(VPSem,MvdVbL)。
我([])-->[]。
i([])-->[Aux],{isAux(Aux)}。
i([动词])-->[InflVerb],{pastInfl(动词,InflVerb),isVerb(动词)}。
pastInfl(参见,saw)。
pastInfl(爱,被爱)。
vp(VbarSem,MvdVbL)-->vbar(VbarSem,MvdVbL)。
vbar(VbarSem,MvdVbL)-->v(VSem,MvdVbL),np(NPSem),
{var_replace(VSem,VSem1),
贝塔(VSem1@NPSem,VbarSem)}。
v(lbd)(s,lbd)(x,,s@lbd(y,Fla)),[])-->[动词],
{isVerb(动词),Fla=..[动词,x,y]}。
v(lbd)(s,lbd)(x,,s@lbd(y,佛罗里达州)),[MvdVb])-->[],
{Fla=..[MvdVb,x,y]}。
np(NbarSem)->nbar(NbarSem)。
nbar(NbarSem)->adj(AdjSem),nbar(NbarSem1),
{var_replace(AdjSem,AdjSem1),beta(AdjSem1@NbarSem1,NbarSem)}。
nbar(NbarSem)->det(DetSem),nbar(NbarSem1),
{var_replace(DetSem,DetSem1),beta(DetSem1@NbarSem1,NbarSem)}。
nbar(NSem)-->n(NSem)。
nbar(NbarSem)->nbar(NbarSem1),pp(PPSem),
{var_replace(PPSem,PPSem1),beta(PPSem1@NbarSem1,NbarSem)}。
nbar(NSem)-->n(NSem)。
pp(PPSem)->pbar(PPSem)。
pbar(NbarSem)-->po(PPSem),np(NbarSem1),
{var_replace(PPSem,PPSem1),beta(PPSem1@NbarSem1,NbarSem)}。
是动词(爱)。
n(lbd(x,boy(x))-->[boy]。
n(lbd(x,girl(x))-->[girl]。
第二,第三,第三,第三,第三,第三(q@x & p@x)))))-->[一些]。
第(1)部分,第(1)部分,第(2)部分,第(2)部分,第(2)部分(q@x -> p@x)))))-->[every]。
nbar(NbarSem)->形容词,nbar(NbarSem1)

nbar(NbarSem)->det(DetSem),nbar(NbarSem1)

nbar(NbarSem)->nbar(NbarSem1),pp(PPSem)


表格在最新版本的SWI Prolog中实现。通过使用左递归将谓词(或非终端)声明为表谓词(或非终端),可以保留它们的定义。详情请参阅:

当我试图运行它时。。。你到底输入了什么查询?我输入了ip([每个,男孩,爱,一些,女孩])。