Prologで直接文法をエンコードすることは、かなり面倒なプロセスです。はい、あなたはこれを行うことができますが、Prologを学び始めたばかりの人は最良の立場にいません。実際には、特に効率的なエンコーディング–を考案するには何年もの科学が必要でしたが、このエンコーディングが理解されたら、Prologが生まれました!
文法は– definite clause grammarsdcgです。 Prologでのエンコーディングを理解しようとしないでください。単にphrase/2
で慣れてください!
ここはProgram 3.11からProlog and Natural-Language Analysisと のFernando C. N. PereiraとStuart M. Shieberです。ペレイラは、今日使用しているDCG規則のようなスタイルを設計しました。この本は、最も過小評価されたプロローグブックの1つです。それは無料です!
s(s(NP,VP)) --> np(NP), vp(VP).
np(np(Det,N,Rel)) -->
det(Det),
n(N),
optrel(Rel).
np(np(PN)) --> pn(PN).
vp(vp(TV,NP)) --> tv(TV), np(NP).
vp(vp(IV)) --> iv(IV).
optrel(rel(epsilon)) --> [].
optrel(rel(that,VP)) --> [that], vp(VP).
pn(pn(terry)) --> [terry].
pn(pn(shrdlu)) --> [shrdlu].
iv(iv(halts)) --> [halts].
det(det(a)) --> [a].
n(n(program)) --> [program].
tv(tv(writes)) --> [writes].
あなたは、Prologの事実として辞書を表す
n(n(program)) --> [program].
の代わりに使うという
n(n(W)) --> [W],{noun(W)}.
noun(program).
それでは、それを使用するようにしたい場合:
?- phrase(s(P), Xs).
P = s(np(det(a),n(program),rel(epsilon)),vp(tv(writes),np(det(a),n(program),rel(epsilon)))),
Xs = [a,program,writes,a,program] ;
P = s(np(det(a),n(program),rel(epsilon)),vp(tv(writes),np(det(a),n(program),rel(that,vp(tv(writes),np(det(a),n(program),rel(epsilon))))))),
Xs = [a,program,writes,a,program,that,writes,a,program] ...
どのような自己参照の談話!しかし、今、もう少し啓発の長さによって、すべての文章:
?- length(Xs, N), phrase(s(P), Xs).
Xs = [terry,halts],
N = 2,
P = s(np(pn(terry)),vp(iv(halts))) ;
Xs = [shrdlu,halts],
N = 2,
P = s(np(pn(shrdlu)),vp(iv(halts))) ;
Xs = [a,program,halts],
N = 3,
P = s(np(det(a),n(program),rel(epsilon)),vp(iv(halts))) ;
Xs = [terry,writes,terry],
N = 3,
P = s(np(pn(terry)),vp(tv(writes),np(pn(terry)))) ;
Xs = [terry,writes,shrdlu],
N = 3,
P = s(np(pn(terry)),vp(tv(writes),np(pn(shrdlu)))) ;
Xs = [shrdlu,writes,terry],
N = 3,
P = s(np(pn(shrdlu)),vp(tv(writes),np(pn(terry)))) ...
はあなたが実装したい文法のいくつかのエンコーディング(EBNF)または入力/出力の例をいくつか提供してください。 btw:明確な節の文法をチェックすると、コードを簡略化し、多くの定型文を避けることになります –