Prolog で文法を直接エンコードするのは、かなり面倒なプロセスです。はい、これはできますが、Prolog を学び始めたばかりの場合は最適な立場にありません。実際、科学が特に効率的なエンコーディングを考え出すのに何年もかかりました。そして、このエンコーディングが理解されたとき、Prolog が誕生しました!
必要なのは文法です –明確な句の文法 dcg . 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(テリー))) ...