2016-12-06 87 views
2

我在prolog中編寫了DCG(形容詞短語和介詞短語),當我試圖運行它時,通過輸入ip([every,boy,loved,some,girl]),它顯示出本地堆棧。我意識到nbar有問題。有人可以幫我嗎?非常感謝。Prolog如何消除左遞歸

%tree 
treeP(Term):- 
    % Print the tree assuming indentation 0 
    treeP(0,Term), 
    % Tidy up with linefeed 
    nl. 

treeP(_N,Tree):- 
    % Tree is just a variable 
    var(Tree),!, 
    write(Tree). 

treeP(N,[Tree|Trees]):- 
    proper_list([Tree|Trees]),!, 
    write('['), 
    N1 is N+1, 
    treePNEL(N1,[Tree|Trees]), 
    write(']'). 

treeP(N,Tree):- 
    % Nonatomic case 
    Tree=..[Functor,Argument|Arguments], 
    !, 
    % Write the functor and opening parenthesis 
    write(Functor),write('('), 
    % Set N1 to new indentation for arguments 
    atom_length(Functor,M), N1 is N+M+1, 
    % Pretty-print the arguments 
    treePNEL(N1,[Argument|Arguments]), 
    % Write right parenthesis 
    write(')'). 

treeP(_N,Tree):- 
    % Noncompound case 
    write(Tree). 

treePNEL(N,[Tree1,Tree2|Trees]):- 
    treeP(N,Tree1), 
    % Go to correct position for further printing 
    nl, tab(N), 
    treePNEL(N,[Tree2|Trees]). 

treePNEL(N,[Tree]):- 
    treeP(N,Tree). 

ip(Sentence):- 
    setof(IP, 
      ip(IP,Sentence,[]), 
      IP), 
    treeP(IP). 


ip(SSem) --> np(NPSem), ibar(IbarSem), 
    {var_replace(NPSem,NPSem1), 
    beta([email protected],SSem)}. 

ibar(VPSem) --> i(MvdVbL),vp(VPSem,MvdVbL). 

i([]) --> []. 
i([]) --> [Aux],{isAux(Aux)}. 
i([Verb]) --> [InflVerb],{pastInfl(Verb,InflVerb),isVerb(Verb)}. 
pastInfl(see,saw). 
pastInfl(love,loved). 

vp(VbarSem,MvdVbL) --> vbar(VbarSem,MvdVbL). 
vbar(VbarSem,MvdVbL) --> v(VSem,MvdVbL), np(NPSem), 
    {var_replace(VSem,VSem1), 
    beta([email protected],VbarSem)}. 

v(lbd(s, lbd(x,[email protected](y,Fla))),[]) --> [Verb], 
    {isVerb(Verb),Fla=..[Verb,x,y]}. 

v(lbd(s,lbd(x,[email protected](y,Fla))),[MvdVb])--> [], 
    {Fla=..[MvdVb,x,y]}. 

np(NbarSem) --> nbar(NbarSem). 
nbar(NbarSem) --> adj(AdjSem),nbar(NbarSem1), 
    {var_replace(AdjSem,AdjSem1),beta([email protected],NbarSem)}. 
nbar(NbarSem) --> det(DetSem),nbar(NbarSem1), 
    {var_replace(DetSem,DetSem1),beta([email protected],NbarSem)}. 
nbar(NSem) --> n(NSem). 


nbar(NbarSem) --> nbar(NbarSem1),pp(PPSem), 
    {var_replace(PPSem,PPSem1),beta([email protected],NbarSem)}. 
nbar(NSem) --> n(NSem). 
pp(PPSem) --> pbar(PPSem). 
pbar(NbarSem) --> po(PPSem),np(NbarSem1), 
    {var_replace(PPSem,PPSem1),beta([email protected],NbarSem)}. 

isVerb(love). 
n(lbd(x,boy(x))) --> [boy]. 
n(lbd(x,girl(x))) --> [girl]. 
det(lbd(q,lbd(p,exists(x,([email protected] & [email protected]))))) --> [some]. 
det(lbd(q,lbd(p,forall(x,([email protected] -> [email protected]))))) --> [every]. 

NBAR(NbarSem) - >(指AdjSem),NBAR(NbarSem1)

NBAR(NbarSem) - > DET(DetSem),NBAR(NbarSem1)

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

+1

*當我試圖運行* ...你輸入什麼查詢到底是什麼? – lurker

+0

我輸入了ip([every,boy,loved,some,girl])。 – Britishgoat

回答