Prolog Left Corner Parser调试求助:特定句子解析失败排查
Prolog左上角解析器调试求助
我是Prolog初学者,针对句子**"The little pigs were safe inside"**编写了左上角解析器(Top Left Corner Parser),但运行测试后解析失败。以下是我的代码、测试跟踪日志及期望输出,恳请帮忙定位问题并指明解决方向。
问题代码
% The little pigs were safe inside. % ------------------------------------------------ TERMINALS ------------------------------------------------ leaf(determiner) --> [the]. leaf(adjective) --> [little]. leaf(adjective) --> [safe]. leaf(noun) --> [pigs]. leaf(verb) --> [were]. leaf(adverb) --> [inside]. % ------------------------------------------------ NON-TERMINALS ------------------------------------------------ lcd(noun_phrase,sentence):-!. lcd(determiner,noun_phrase):-!. lcd(adjective,adjective_phrase):-!. lcd(adverb,adjective_phrase):-!. lcd(verb,verb_phrase):-!. lc(X,X):-!. lc(X,Y):-lcd(X,Y),!. lc(X,Y):-lcd(X,Z),lc(Z,Y). % ------------------------------------------------ RULES ------------------------------------------------ parse(Nterm,As,[W0|W1],Wn):- leaf(Pterm,[W0|W1],W1), lc(Pterm,Nterm), Ap=..[Pterm,W0], P=..[Pterm,Nterm,Ap,As,W1,Wn], call(P). noun_phrase(Nt,NP,As)-->{lc(sentence,Nt)},parse(verb_phrase, VP),sentence(Nt,sentence(NP,VP),As),!. noun_phrase(noun_phrase,E,E)-->[]). determiner(Nt,D,As)-->{lc(noun_phrase,Nt)},parse(adjective_phrase,N),noun_phrase(Nt,noun_phrase(D,N),As). adjective(Nt,A,As)-->{lc(adjective_phrase,Nt)},parse(adjective_phrase,N),adjective_phrase(Nt,adjective_phrase(A,N),As). adverb(Nt,A,As)-->{lc(adjective_phrase,Nt)},parse(adjective_phrase,N),adjective_phrase(Nt,adjective_phrase(A,N),As). noun(Nt,N,As)-->{lc(adjective_phrase,Nt)},adjective_phrase(Nt,adjective_phrase(N),As). adjective_phrase(adjective_phrase,A,A)-->[]). verb(Nt,V,As)-->{lc(verb_phrase,Nt)},parse(noun_phrase,N),verb_phrase(Nt,verb_phrase(V,N),As). verb(Nt,V,As)-->{lc(verb_phrase,Nt)},verb_phrase(Nt,verb_phrase(V),As). verb_phrase(verb_phrase,A,A)-->[]). sentence(s,A,A)-->[]). test(S,A):-parse(S,A,[the, little, pigs, were, safe, inside],[]).
测试跟踪日志
trace,test(S,A). Call: (9) test(_4648, _4650) ? creep Call: (10) parse(s, _4650, [the, little, pigs, were, safe, inside], []) ? creep Call: (11) leaf(_5024, [the, little, pigs, were, safe, inside], [little, pigs, were, safe, inside]) ? creep Exit: (11) leaf(determiner, [the, little, pigs, were, safe, inside], [little, pigs, were, safe, inside]) ? creep Call: (11) lc(determiner, s) ? creep Call: (12) lcd(determiner, s) ? creep Fail: (12) lcd(determiner, s) ? creep Redo: (11) lc(determiner, s) ? creep Call: (12) lcd(determiner, _5026) ? creep Exit: (12) lcd(determiner, noun_phrase) ? creep Call: (12) lc(noun_phrase, s) ? creep Call: (13) lcd(noun_phrase, s) ? creep Fail: (13) lcd(noun_phrase, s) ? creep Redo: (12) lc(noun_phrase, s) ? creep Call: (13) lcd(noun_phrase, _5026) ? creep Exit: (13) lcd(noun_phrase, sentence) ? creep Call: (13) lc(sentence, s) ? creep Call: (14) lcd(sentence, s) ? creep Fail: (14) lcd(sentence, s) ? creep Redo: (13) lc(sentence, s) ? creep Call: (14) lcd(sentence, _5026) ? creep Fail: (14) lcd(sentence, _5026) ? creep Fail: (13) lc(sentence, s) ? creep Fail: (12) lc(noun_phrase, s) ? creep Fail: (11) lc(determiner, s) ? creep Redo: (11) leaf(_5024, [the, little, pigs, were, safe, inside], [little, pigs, were, safe, inside]) ? creep Fail: (11) leaf(_5024, [the, little, pigs, were, safe, inside], [little, pigs, were, safe, inside]) ? creep Fail: (10) parse(s, _4650, [the, little, pigs, were, safe, inside], []) ? creep Fail: (9) test(_4648, _4650) ? creep false.
期望输出
S = [the, little, pigs, were, safe, inside],A = s(np(d(the), adjp(adj(little), n(pigs))), vp(v(were), adjp(adj(safe), adv(inside)))) .
问题定位与解决方向
语法错误修正:所有DCG规则末尾存在多余的右括号,需删除:
- 将
noun_phrase(noun_phrase,E,E)-->[]).改为noun_phrase(noun_phrase,E,E)-->[] - 将
adjective_phrase(adjective_phrase,A,A)-->[]).改为adjective_phrase(adjective_phrase,A,A)-->[] - 将
sentence(s,A,A)-->[]).改为sentence(s,A,A)-->[]
- 将
Top Left Corner链缺失映射:
跟踪日志显示lc(sentence, s)失败,因为lcd规则中没有定义sentence到s的映射。需在lcd规则中添加:lcd(sentence, s):-!.这样就能打通
determiner → noun_phrase → sentence → s的合法链,解决初始匹配失败问题。DCG规则与普通谓词调用不匹配:
代码中parse是普通4参数谓词,但在DCG规则(如noun_phrase)中直接以parse(verb_phrase, VP)形式调用,缺少输入输出列表参数,导致参数数量不匹配。需将parse重构为DCG谓词,或在调用时显式传递列表参数:% 重构parse为DCG形式 parse(Nterm, As) --> [W0], {leaf(Pterm, [W0], [])}, {lc(Pterm, Nterm)}, {Ap =.. [Pterm, W0]}, call(Pterm, Nterm, Ap, As).同时调整所有DCG规则中对
parse的调用,使其符合DCG语法。非终结规则参数与构造调用匹配:
检查determiner、adjective等非终结规则的参数,确保与parse中构造的call(P)调用参数一致,避免参数数量或语义不匹配。
内容的提问来源于stack exchange,提问作者Vlad Timu
相关产品推荐
相关产品推荐

