You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)))) .

问题定位与解决方向

  1. 语法错误修正:所有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)-->[]
  2. Top Left Corner链缺失映射:
    跟踪日志显示lc(sentence, s)失败,因为lcd规则中没有定义sentence到s的映射。需在lcd规则中添加:

    lcd(sentence, s):-!.
    

    这样就能打通determiner → noun_phrase → sentence → s的合法链,解决初始匹配失败问题。

  3. 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语法。

  4. 非终结规则参数与构造调用匹配:
    检查determiner、adjective等非终结规则的参数,确保与parse中构造的call(P)调用参数一致,避免参数数量或语义不匹配。

内容的提问来源于stack exchange,提问作者Vlad Timu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:55:38