-1

Prologを使って自然言語処理のDCG文法を勉強しているのですが、正しく理解できているのか、何か抜けているのか疑問に思っています。

これは私の DCG 文法です:

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

/* A noun phrase is a proper name of a person (that is unified in the Name variable) */
noun_phrase2(Name) --> properName(Name).

/* A verb_phrase can be an intransitive verb */
verb_phrase2(Actor, VP) --> intrans_verb(Actor, VP).

/* A verb_phrase can be a transitive verb followed by an object complement
verb_phrase2(Somebody, VP) --> trans_verb(Somebody, Something, VP),
                               noun_phrase2(Something).

/* The meaning of a proper name john is john
   The meaning of a proper name mary is mary */
properName(john) --> [john].
properName(mary) --> [mary].

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

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

したがって、この文法は次のような句を受け入れることができます: [john, paints]意味: paints(john)

この意味に到達する方法についての私の考えが正しいかどうかを確認します。

したがって、次のクエリを実行すると、これが起こると思います。

?- sentence2(Meaning, [john, paints], []).
Meaning = paints(john) 

[ジョン・ペイント]それが私の言語に属しているかどうかを評価し、言わなければならないのは私の最後の文です.

文は次のように形成する必要があります。

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

(名詞句である何かの後に動詞句である何かが続く.

名詞句は次のように構成されます。

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

だから名詞句固有名詞

適切な名前の意味は単純です。なぜなら、次の行によるからです。

properName(john) --> [john].

ジョンは固有名詞であり、その意味を指定するパラメーターを DCG 文法に追加しているだけです。つまり、固有名詞 john の意味的な意味は john です。

したがって、名詞意味固有名詞の意味と同じであるため (変数が統一されるため)

したがって、前のケースでは、noun_phrase2述語の意味はjohnであり、元の文の最初の評価ステップは end です。

次に、述語verb_phrase2(Actor, VP)によって、2 番目の部分が動詞句であることを評価する必要があります。

この場合のように、動詞句は自動詞動詞である可能性があります。

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

自動詞動詞は次のように定義されます。

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

したがって、paints という単語自動詞であり、その意味はpaints (Actor)です。ここで、Actorはコンテキストに依存する変数です (この場合、アクションを実行するActor rappresent 、誰がペイントするか) 。

したがって、verb_phrase2(Actor, VP) にバックトラックして、verb_phrase2(Actor, VP)を確認します。

現在、Actor はまだ統一されていない変数のままであり、その意味はVP = paints(Actor)です。

したがって、paintsは自動詞動詞であり、その意味はpaints(Actor)であることが検証されます。

したがって、 noun_phrase2(Actor)述語を確認したばかりで、 Actor = johnである元の statement2( VP)述語にバックトラックを実行します。

だから私はこのような状況があります:

sentence2(VP) --> noun_phrase2(john),
                  verb_phrase2(john, paints(john)).

最終的なVP は paints(john) に統一されます。

それは私の推論が正しいですか、それとも何かが欠けていますか? Prolog の方法で推論するのは良い方法ですか?

4

1 に答える 1

3

具体的で短い質問をしてください。過度のコメントなしで関連するコードを含めます。

方法は次のとおりです。


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

以下はどのようにその結果を達成しますか?

?- sentence2(Meaning, [john, paints], []).
Meaning = paints(john) 

答え:

上記のルールは次と同等です

sentence2(VP, L, Z):- noun_phrase2(Actor, L, L2), 
                      verb_phrase2(Actor, VP, L2, Z).
noun_phrase2(Name, L, Z):- properName(Name, L, Z).    
verb_phrase2(Actor, VP, L, Z):- intrans_verb(Actor, VP, L, Z). 
verb_phrase2(Somebody, VP, L, Z):- trans_verb(Somebody, Something, VP, L, L2),
                                   noun_phrase2(Something, L2, Z).    
properName(john, L, Z):- 
    L = [john | Z].         %// 'john' is present in the input stream
properName(mary, L, Z):- 
    L = [mary | Z].         %// 'mary' is present in the input stream
/* an alternative definition 
properName(X) --> [X], { member(X, [john, mary]) }.
   %% would be translated as
properName(X, L, Z):- L = [X | Z], member(X, [john, mary]). 
*/    
intrans_verb(Actor, paints(Actor), L, Z):- 
    L = [paints | Z].       %// 'paints' is present in the input stream    
trans_verb(Somebody, Something, likes(Somebody, Something), L, Z):-
    L = [likes | Z].        %// 'likes' is present in the input stream

特に、

?- sentence2(Meaning, [john, paints], []).    

?- noun_phrase2(Actor, [john, paints], L2),                    
   verb_phrase2(Actor, Meaning, L2, []).

  ?- noun_phrase2(Actor, [john, paints], L2).
  ?- properName(Actor, [john, paints], L2).   
  ?- properName(john, [john, paints], L2).            { Actor=john }
  !- [john, paints] = [john | [paints]]               { L2=[paints] }

  ?- verb_phrase2(john, Meaning, [paints], []).
  ?- intrans_verb(john, Meaning, [paints], []).
  ?- intrans_verb(john, paints(john), [paints], []).  { Meaning=paints(john) }
  !- [paints] = [paints | []]

!- 
于 2013-05-19T17:10:41.890 に答える