句子分析器-Prolog
在对我上一次提交的内容提出了一些格式问题后,我决定重新发布 程序应将列表[a,命令,移动,到,a,更高,目录]解析为: det(a)、名词(命令)、动词(移动)、prep(to)、det(a)、adj(更高)、名词(目录) 然而,程序在尝试分配一个det(to)之后失败了,相反,它应该通过并分配to作为一个介词短语(prep) 这肯定是一个回溯问题,但有人能发现我的代码有什么问题吗 节目:句子分析器-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
/* 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
。谢谢你的回答并调查我的问题,这确实是个问题,在查看之前设法找到了它,很抱歉浪费了你的时间!再次感谢:)不是浪费时间!我很高兴你能弄明白。