4

現時点では、noun_phrasefromへのループバックに問題がありnp2ます。誰かがループバックを手伝ってくれるかどうか疑問に思っていましたnoun_phrase。ここにいくつかのコードがあります:

noun_phrase([X|T],(det(X), NP2),Rem):-
   det(X),
   np2(T,NP2,Rem).

np2([H|T],np2(adj(H),Rest),NP) :-
   adj(H),
   np2(T,Rest,Rem),
   noun_phrase(NP,Rem,_).

np2から にループしたいnoun_phrasenp2一緒にハッキングしただけなので、のコードが間違っていると思います。

4

1 に答える 1

9

Prolog で文法を直接エンコードするのは、かなり面倒なプロセスです。はい、これはできますが、Prolog を学び始めたばかりの場合は最適な立場にありません。実際、科学が特に効率的なエンコーディングを考え出すのに何年もかかりました。そして、このエンコーディングが理解されたとき、Prolog が誕生しました!

必要なのは文法です –明確な句の文法 . Prolog (現在) でエンコーディングを理解しようとしないでくださいphrase/2

これは、Fernando CN Pereira と Stuart M. Shieber によるProlog and Natural-Language Analysis のProgram 3.11です。Pereira は、私たちが現在使用している DCG ルールのスタイルそのものを設計しました。この本は、最も過小評価されている Prologbook の 1 つです。そしてそれは無料です!

s(s(NP,VP)) --> np(NP), vp(VP)。

np(np(Det,N,Rel)) -->
   det(デット)、
   n(N)、
   optrel(Rel)。
np(np(PN)) --> pn(PN)。

vp(vp(TV,NP)) --> テレビ(TV)、np(NP)。
vp(vp(IV)) --> iv(IV)。

optrel(rel(イプシロン)) --> [].
optrel(rel(それ,VP)) --> [それ], vp(VP).

pn(pn(テリー)) --> [テリー].
pn(pn(shrdlu)) --> [shrdlu].

iv(iv(停止)) --> [停止].

det(det(a)) --> [a].

n(n(プログラム)) --> [プログラム].

tv(tv(writes)) --> [writes].

辞書を Prolog の事実として表現したい場合は、

n(n(プログラム)) --> [プログラム].

それよりも

n(n(W)) --> [W],{名詞(W)}.

名詞(プログラム)。

それでは、それを使用しましょう:

?-フレーズ (s(P), Xs)。
P = s(np(det(a),n(プログラム),rel(イプシロン)),vp(tv(書き込み),np(det(a),n(プログラム),rel(イプシロン)))),
Xs = [a,program,writes,a,program];
P = s(np(det(a),n(プログラム),rel(イプシロン)),vp(tv(書き込み),np(det(a),n(プログラム),rel(それ,vp(tv(書き込み)) ),np(det(a),n(プログラム),rel(イプシロン)))))),
Xs = [a,program,writes,a,program,that,writes,a,program] ...

なんて自己言及的な言説だ!しかし今、すべての文を長さで並べると、もう少し啓発的になります。

?-長さ (Xs、N)、句 (s(P)、Xs)。
Xs = [テリー、停止]、
N = 2、
P = s(np(pn(テリー)),vp(iv(停止))) ;
Xs = [shrdlu,停止],
N = 2、
P = s(np(pn(shrdlu)),vp(iv(停止))) ;
Xs = [a、プログラム、停止]、
N = 3、
P = s(np(det(a),n(プログラム),rel(イプシロン)),vp(iv(停止)));
Xs = [テリー、書き込み、テリー]、
N = 3、
P = s(np(pn(テリー)),vp(tv(書き込み),np(pn(テリー))));
Xs = [テリー、書き込み、shrdlu]、
N = 3、
P = s(np(pn(テリー)),vp(tv(書き込み),np(pn(shrdlu))));
Xs = [shrdlu、書き込み、テリー]、
N = 3、
P = s(np(pn(shrdlu)),vp(tv(書き込み),np(pn(テリー))) ...
于 2012-05-01T17:27:22.047 に答える