编写一个Prolog-DCG语法来处理句子的平均值,并构建其解析树

编写一个Prolog-DCG语法来处理句子的平均值,并构建其解析树,prolog,dcg,Prolog,Dcg,我有一个DCG语法,可以理解并同意如下短语:[john,Paint]和[john,likes,mary]通过使用参数直接将语义管理到DCG语法中 sentence2(VP) --> noun_phrase2(Actor), verb_phrase2(Actor, VP). noun_phrase2(Name) --> properName(Name). verb_phrase2(Actor, VP) --> intrans_verb(Ac

我有一个DCG语法,可以理解并同意如下短语:[john,Paint][john,likes,mary]通过使用参数直接将语义管理到DCG语法中

sentence2(VP) --> noun_phrase2(Actor),
                  verb_phrase2(Actor, VP).

noun_phrase2(Name) --> properName(Name).

verb_phrase2(Actor, VP) --> intrans_verb(Actor, VP).

verb_phrase2(Somebody, VP) --> trans_verb(Somebody, Something, VP),
                               noun_phrase2(Something).

properName(john) --> [john].
properName(mary) --> [mary].

intrans_verb(Actor, paints(Actor)) --> [paints].

trans_verb(Somebody, Something, likes(Somebody, Something)) --> [likes].
例如,短语[john,Paint]平均值将是:Paint(john),事实上这是查询的结果:

?- sentence2(Meaning, [john,paints],[]).
Meaning = paints(john) 
好的,这不需要构建解析树就可以处理含义

我有一个练习,要求我修改前面的语法,从句子的句法树中获得平均值。因此,我的查询必须返回解析树,以及句子的含义

但我发现这样做有问题…我尝试过这样的方法,但不起作用:

/** Adding the meaning into the Parse Tree: */

sentence2(sentence(Name, VerbPhrase)) --> noun_phrase2(Name),
                                  verb_phrase2(VerbPhrase).

noun_phrase2(noun_phrase(Name)) --> properName2(Name).


verb_phrase2(verb_phrase(IntransVerb)) --> intrans_verb2(IntransVerb).

verb_phrase2(verb_phras(TransVerb, ProperName)) --> trans_verb2(TransVerb),
                                    noun_phrase2(ProperName).

/* properName, intrans_verb ant trans_verb are LEAVES: */
properName2(properName(john)) --> [john].

properName2(properName(mary)) --> [mary].

intrans_verb2(Actor, intrans_verb2(paints(Actor))) --> [paints].

trans_verb2(Somebody, Something, trans_verb2(likes(Somebody, Something))) --> [likes].

我认为你的问题不恰当。如果你说

?- sentence2(Meaning, [john,paints], []).
Meaning = paints(john).
您清楚地说,解析的结果是一个“意义”,而不是一个解析树。我希望解析树看起来更像这样:

Parse = s(np(properNoun(john)), vp(intrans(paints))).
通过使用一些结构信息扩充DCG,您可以轻松生成解析树:

sentence(s(NounPhrase, VerbPhrase)) --> 
    noun_phrase(NounPhrase), 
    verb_phrase(VerbPhrase).

noun_phrase(proper_noun(john))    --> [john].
verb_phrase(intransitive(paints)) --> [paints].
如果您想要一个或另一个,只需生成一个您想要的。如果两者都需要,可能应该在解析后使用树收集含义。否则,获取解析树就没有多大意义了,是吗?这是一张草图:

meaning(s(proper_noun(Noun), intransitive(Verb)), Meaning) :-
  Meaning =.. [Verb, Noun].
当然,这必须变得更加健壮,但这是如何使用它的:

?- phrase(sentence(S), [john, paints]), meaning(S, Meaning).
S = s(proper_noun(john), intransitive(paints)),
Meaning = paints(john).
现在探索,玩!把你的母语(意大利语,对吧?)解析成“有意义的”结构。将几个土耳其语句子解析成“意思”,并由此生成意大利语。你会惊讶于这一切是多么容易地结合在一起