句子分析器-Prolog

句子分析器-Prolog,prolog,Prolog,在对我上一次提交的内容提出了一些格式问题后,我决定重新发布 程序应将列表[a,命令,移动,到,a,更高,目录]解析为: det(a)、名词(命令)、动词(移动)、prep(to)、det(a)、adj(更高)、名词(目录) 然而,程序在尝试分配一个det(to)之后失败了,相反,它应该通过并分配to作为一个介词短语(prep) 这肯定是一个回溯问题,但有人能发现我的代码有什么问题吗 节目: /* Facts */ det(the). det(a). det(more). prep(in). p

在对我上一次提交的内容提出了一些格式问题后,我决定重新发布

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

det(a)、名词(命令)、动词(移动)、prep(to)、det(a)、adj(更高)、名词(目录)

然而,程序在尝试分配一个det(to)之后失败了,相反,它应该通过并分配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,_).
带跟踪的程序输出:


任何帮助都将不胜感激

使用编写此解析器可能更容易。但是,我想,此解析器用于保存我的课程作业中的大量值,因此指定它以这种方式执行。我查看了更完整的跟踪(运行代码)和您的
np
谓词定义。这表明代码进入了一个循环。我想麻烦可能就在这里:
np(句子,np(np,PP),Rem):-np(句子,np,Rem1),PP(Rem1,PP,Rem)。
这个递归调用可能是循环的,它从来没有机会检查
PP
。谢谢你的回答并调查我的问题,这确实是个问题,在查看之前设法找到了它,很抱歉浪费了你的时间!再次感谢:)不是浪费时间!我很高兴你能弄明白。