2011-04-02 104 views
0

我有一個大學分配做出Prolog程序分析自然語言,也就是說,它應該輸出序言自然語言解析

P = np(det(the), np2(noun(cat))), vp(verb(sat), pp(prep(on), np(det(the), np2(noun(mat))))) 
L = [] 

當我輸入NP([中,貓,坐,上,中,墊] ,P,L)。

相反,動詞和名詞短語被拆分並走出seperatly,如:

P = np(det(the), np2(noun(cat))), 
L = [sat, on, the, mat] 

我想知道如果有人能指出我要去的地方錯了,它會很感激,我的代碼是:

sentence(Sentence,sentence(np(Noun_Phrase)), (vp(Verb_Phrase))):- 
/* so take a sentence (first arg) and parse it into a noun phrase and a verb phase */ 
    np(Sentence,Noun_Phrase, Rem), 
    vp(Rem, Verb_Phrase). 

np([X|T],np(det(X),NP2),Rem):- 
    det(X), 
    np2(T,NP2,Rem). 
np(Sentence,Parse,Rem):- np2(Sentence,Parse,Rem). 
np(Sentence,np(NP,PP),Rem):- 
    np(Sentence,NP,Rem1), 
    pp(Rem1,PP,Rem). 

np2([H|T],np2(noun(H)),T):- noun(H). 
np2([H|T],np2(adj(H),Rest),Rem):- adj(H),np2(T,Rest,Rem). 
pp([H|T],pp(prep(H),Parse),Rem):- 
    prep(H), 
    np(T,Parse,Rem). 

vp([H|[]],vp(verb(H))):- verb(H). 
vp([H|Rest],vp(verb(H),RestParsed),Rem):- verb(H), pp(Rest, RestParsed, Rem). 
vp([H|Rest],vp(verb(H),RestParsed),Rem):- verb(H), np(Rest, RestParsed, Rem). 

det(the). 
det(with). 
noun(cat). 
noun(mat). 
noun(mouse). 
noun(rabbit). 
noun(moon). 
verb(sat). 
verb(ate). 
verb(ran_away). 
prep(on). 
adj(big). 
adj(fat). 
adj(comfy). 
adj(yellow). 
adj(silvery). 
adj(orange). 
+0

這是一個相當奇怪的解析結構,你確定這是它應該出來的嗎? – Raceimaztion 2011-04-02 08:25:33

+2

你爲什麼不使用DCG? – Kaarel 2011-04-03 08:06:54

回答

1

那麼,你真的確定你想得到NP「貓坐在墊子上」。這不是一個NP,它是一個完整的句子,不是嗎?其次,我還沒有在Prolog中寫過很長一段時間。我認爲代碼應該沿着這些線:

sentence(S, sentence(np(NP), vp(VP))) :- 
    np(S, NP, R), 
    vp(R, VP, []). /* Changed here - added the third argument */ 

np([X | S], np(det(X), NP2), R) :- 
    det(X), 
    np2(S, NP2, R). 
np(S, NP, R) :- 
    np2(S, NP, R). 
np(S, np(NP, PP), R) :- 
    append(X, Y, S), /* Changed here - otherwise possible endless recursion */ 
    pp(Y, PP, R), 
    np(X, NP, []). 

np2([X | R], np2(noun(X)), R) :- 
    noun(X). 
np2([X | S], np2(adj(X), NP), R) :- 
    adj(X), 
    np2(S, NP, R). 

pp([X | S], pp(prep(X), NP), R):- 
    prep(X), 
    np(S, NP, R). 

vp([X | R], vp(verb(X)), R) :- /* Changed here - added the third argument */ 
    verb(X). 
vp([X | S], vp(verb(X), PP), R) :- 
    verb(X), 
    pp(S, PP, R). 
vp([X | S], vp(verb(X), NP), R) :- 
    verb(X), 
    np(S, NP, R). 

det(the). 
det(with). 
... 

對不起,更改的名稱。我無法按照原來的方式處理代碼。

1

仔細查看代碼後,我發現至少有兩個錯誤。

首先,也是最重要的一點,你需要更加小心如何定義你的'vp'謂詞,我注意到你已經定義了兩個不同的版本,它們不會做同樣的事情。你可以告訴他們不同,因爲一個只有arity 2,而另一個是arity 3.

我建議定義所有重要的和功能性的'vp'謂詞定義爲arity 3,保留「Tail」參數,然後使用一個單一的元數2謂詞,看起來像這樣:

vp(T, Parse) :- vp(T, Parse, []). 

其次,我認爲你需要檢查你是如何嵌套的括號內您的「句子謂詞的定義。我認爲你已經混合了其中幾個。