Напишите грамматику Prolog DCG, которая обрабатывает среднее значение предложения, а также построит его дерево разбора.

У меня есть эта грамматика DCG, которая понимает и соглашается с такими фразами, как: [Джон, Пейнтс] и [Джон, Лайк, Мэри], управляя семантическим значением непосредственно в грамматике 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, paintts] будет: paintts (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].

1 ответ

Я думаю, что ваш вопрос некорректен. Если вы говорите

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

Теперь исследуй, играй! Сделайте что-то, что разбирает часть вашего родного языка (итальянский, верно?) На "значимые" структуры. Разберите несколько предложений турецкого на "значение" и создайте из него итальянский. Вы будете удивлены, насколько легко все это объединится.

Другие вопросы по тегам