Ivan Bratko の本「Programming for Artificial Intelligence」を使用して、PrologでDCG 文法と構文木を勉強しています。
構文解析木を生成するこの DCG 文法の解釈について、私は疑問を持っています。
sentence(Number, sentence(NP, VP)) --> noun_phrase(Number, NP),
verb_phrase(Number, VP).
verb_phrase(Number, verb_phrase(Verb, NP)) --> verb(Number, Verb),
noun_phrase(_, NP).
noun_phrase(Number, noun_phrase(Det, Noun)) --> determiner(Number, Det),
noun(Number, Noun).
determiner(singular, determiner(a)) --> [a].
determiner(_,determiner(the)) --> [the].
noun(singular, noun(cat)) --> [cat].
noun(singular, noun(mouse)) --> [mouse].
noun(plural, noun(cats)) --> [cats].
noun(plural, noun(mice)) --> [mice].
verb(singular, verb(scares)) --> [scares].
verb(singular, verb(hates)) --> [hates].
verb(plural, verb(scare)) --> [scare].
verb(plural, verb(hate)) --> [hate].
たとえば、次のクエリを実行できるとします。
[debug] ?- sentence(singular, Tree, [a, cat, scares, the, mice],[]).
Tree = sentence(noun_phrase(determiner(a), noun(cat)), verb_phrase(verb(scares), noun_phrase(determiner(the), noun(mice))))
TRUE であり、文をルートとする解析ツリーを生成する
私は、Prolog がこの文法を一連のルールに変換する方法についてではなく、以前の DCG 文法形式のみを使用して構文解析ツリーが構築される方法について推論しようとしています (なぜなら、私にとってこれは難しいことであり、おそらくそうすることでさらにステップを追加します)
自動変換されたルールではなく、DCG の文法で読んだ方が良いのでしょうか?
だから私はこのように読みます:
文はnoun_phraseとverb_phraseで構成されているため、DCG 文法の最初の「ルール」を int に指定します。文は、左にnoun_phraseを持つツリー (自然言語のサブセットの文を表す) のルートであることを指定します。 child とverb_phraseを右の子として
次に、noun_phraseは決定子の後に名詞が続くものとして定義されるため、noun_phraseは決定子を左の子とし、名詞を右の子とする別のツリーのルートになります。
その場合、決定子は単一のノードで構成されるツリーです:見つかった決定子が "a" であることが TRUE の場合は決定子(a)、見つかった決定子が "the" であることが TRUE の場合は **determiner(the)
*verb_phrase** についても同じ理由
それが正しいか?