句子解析器 - Prolog

时间:2017-04-20 17:42:54

标签: prolog

在我之前提交的一些格式投诉后,我决定重新发布。

程序应该将列表[a,命令,移动,到,更高,目录]解析为:

DET(a)中,名词(命令),动词(移动),准备(至),DET(a)中,可调节(较高),名词(目录)。

然而程序在尝试分配det(to)之后失败了,相反它应该通过并指定为介词短语(prep)。

这绝对是一个回溯问题,但任何人都可以发现我的代码有什么问题吗?

程序:

/* Facts */
det(the).
det(a).
det(more).

prep(in).
prep(to).

noun(detail).
noun(command).
noun(directory).
noun(file).
noun('08226txt').

adj(moving).
adj(parent).
adj(current).
adj(fine).
adj(higher).
adj(short).
adj(very).

verb(moves).
verb(print).
verb(types).
verb(viewed).
verb(listing).
verb(moving).


/* S -> NP VP
   S -> VP */
sentence(Sentence,sentence(np(Noun_Phrase),vp(Verb_Phrase))):-
  np(Sentence,Noun_Phrase,Rem),
  vp(Rem,Verb_Phrase).

/* NP -> Det NP2
   NP -> NP2
   NP -> NP PP */
np([X|T],np(det(X),NP2),Rem):-
  det(X),
  np2(T,NP2,Rem).
np(Sentence,Parse,Rem):- np2(Sentence,Parse,Rem).
np(Sentence,np(NP,PP),Rem):-
  np(Sentence,NP,Rem1),
  pp(Rem1,PP,Rem).

/* NP2 -> Noun
   NP2 -> Adj NP2 */
np2([H|T],np2(noun(H)),T):- noun(H).
np2([H|T],np2(adj(H),Rest),Rem):-
      adj(H),
      np2(T,Rest,Rem).

/* PP -> Prep NP */
pp([H|T],pp(prep(H),Parse),Rem):-
  prep(H),
  np(T,Parse,Rem).

/* VP -> Verb
   VP -> Verb NP
   VP -> VP PP */
vp([H|[]],verb(H)):-
  verb(H).
vp([H|Rest],vp(verb(H),RestParsed)):-
  verb(H),
  np(Rest,RestParsed,_).
vp([H|Rest],vp(verb(H),RestParsed)):-
  vp(H,Rest),
  pp(Rest,RestParsed,_).

使用跟踪编程输出:Ouput

非常感谢任何帮助。

0 个答案:

没有答案