在我之前提交的一些格式投诉后,我决定重新发布。
程序应该将列表[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
非常感谢任何帮助。