1

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_phraseverb_phraseで構成されているため、DCG 文法の最初の「ルール」を int に指定します。は、左にnoun_phraseを持つツリー (自然言語のサブセットの文を表す) のルートであることを指定します。 child とverb_phraseを右の子として

次に、noun_phraseは決定子の後に名詞が続くものとして定義されるため、noun_phraseは決定子を左の子とし、名詞を右の子とする別のツリーのルートになります。

その場合、決定子は単一のノードで構成されるツリーです:見つかった決定子が "a" であることが TRUE の場合は決定子(a)、見つかった決定子が "the" であることが TRUE の場合は **determiner(the)

*verb_phrase** についても同じ理由

それが正しいか?

4

1 に答える 1

2

DCG 形式の要点は、正規化された形式を見る必要がないということです。

したがって、DCG を使用すると、人間にとって解釈するのがかなり簡単な表現になります。

はい、あなたの解釈は正しいです。Prolog は、あなたが期待したものを返すので、あなたに同意しているようです。警告が表示されないと仮定すると、準備完了です。いくつかのエッジ ケースを解析して、何が起こるか見てみませんか?

于 2013-05-16T11:58:35.090 に答える