2012-05-01 10 views
4

現在、私はnoun_phraseにループして問題があります。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,_). 

私は戻ってnoun_phraseからnp2からループにしたい:ここではいくつかのコードです。私はnp2のコードは間違っていると私はちょうど一緒にそれをハックしたと思います。

+0

はあなたが実装したい文法のいくつかのエンコーディング(EBNF)または入力/出力の例をいくつか提供してください。 btw:明確な節の文法をチェックすると、コードを簡略化し、多くの定型文を避けることになります –

答えて

9

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

文法は– definite clause grammarsです。 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)))) ... 
+0

np2からnounphraseに回帰する方法がありますか?私はそれが働くために必要なこと全てを知っています。ありがとうございます – DorkMonstuh

+0

@ JohnLam:あなたのプログラムには多くの問題があります。最大のものは、DCGを使用しないことです。また、正確に何が欲しいのかは明らかではありません。上記のコードを必要に応じて変更してください。 – false

+0

私はnp2が間違っていて、私はDCGを使用していないことを知っています。私が欲しいのはnp2ですnoun_phraseをもう一度呼びたいので、もう一度やり直すことができます。 – DorkMonstuh