2011-04-08 32 views
3

OK,所以基本上是3個任務這個程序必須執行:列表路口,Prolog的

  1. 解析以列表的形式給出一個句子,在這種情況下(和整個例子)的判決將是[叛徒,tostig_godwinson,是,被殺]。 (它的歷史,不要問!)所以這看起來像:

    sentence(noun_phrase(det(the),np2(adj(traitorous),np2(noun(tostig_godwinson)))),verb_phrase(verb(slain),np(noun(slain)))). 
    
  2. 使用解析句子提取主語,動詞和賓語,並輸出作爲一個列表,例如使用當前示例的[tostig_godwinson,was,slain]。我也有這個工作,直到我試圖編號3.

  3. 使用目標列表並將其與知識庫進行比較,基本上回答您在第一個問題中提出的問題(請參閱下面的代碼),以便使用此問題和知識基地計劃將打印出「the_battle_of_stamford_bridge」,因爲這是與有問題的最匹配的列表中的知識庫中的句子

所以這裏就是我至今是:

history('battle_of_Winwaed',[penda,  king_of_mercia,was,slain,killed,oswui,king_of_bernicians, took_place, '15_November_1655']). 

history('battle_of_Stamford_Bridge',[tostig_godwinson,herald_hardrada,was,slain, took_place, '25_September_1066']). 

history('battle_of_Boroughbridge',[edwardII,defeated,earl_of_lancaster,execution, took_place, '16_march_1322']). 

history('battle_of_Towton',[edwardIV,defeated,henryVI,palm_Sunday]). 

history('battle_of_Wakefield',[richard_of_york, took_place, 
'30_December_1490',was,slain,war_of_the_roses]). 

history('battle_of_Adwalton_Moor',[earl_of_newcastle,defeats,fairfax, took_place, '30_June_1643',battle,bradford,bloody]). 

history('battle_of_Marston_Moor',[prince_rupert,marquis_of_newcastle,defeats,fairfax,oliver_cromwell,ironsides, took_place, 
'2_June_1644', bloody]). 

noun(penda). 
noun(king_of_mercia). 
noun(oswui). 
noun(king_of_bernicians). 
noun('15_November_1655'). 
noun(tostig_godwinson). 
noun(herald_hardrada). 
noun('25_September_1066'). 
noun(edwardII). 
noun(earl_of_lancaster). 
noun('16_march_1322'). 
noun(edwardIV). 
noun(henryVI). 
noun(palm_Sunday). 
noun(richard_of_york). 
noun('30_December_1490'). 
noun(war_of_the_roses). 
noun(earl_of_newcastle). 
noun(fairfax). 
noun('30_June_1643'). 
noun(bradford). 
noun(prince_rupert). 
noun(marquis_of_newcastle). 
noun(fairfax). 
noun(oliver_cromwell). 
noun('2_June_1644'). 
noun(battle). 
noun(slain). 
noun(defeated). 
noun(killed). 
adj(bloody). 
adj(traitorous). 
verb(defeats). 
verb(was). 
det(a). 
det(the). 
prep(on). 

best_match(Subject,Object,Verb):- 
     history(X,Y), 
     member(Subject,knowledgebase), 
     member(Object,knowledgebase), 
     member(Verb,knowledgebase), 
     write(X),nl, 
     fail. 
micro_watson:- write('micro_watson: Please ask me a question:'), read(X), 
sentence(X,Sentence,Subject,Object,Verb),nl,write(Subject),nl,write(Verb),nl,write(Object). 

sentence(Sentence,sentence(Noun_Phrase, Verb_Phrase),Subject,Object,Verb):- 
    np(Sentence,Noun_Phrase,Rem), 
    vp(Rem,Verb_Phrase), 
    nl, write(sentence(Noun_Phrase,Verb_Phrase)), 
     noun(Subject), 
    member(Subject,Sentence), 
     noun(Object), 
    member(Object,Rem), 
    verb(Verb), 
    member(Verb,Rem), 
     best_match(Subject,Object,Verb). 

member(X,[X|_]). 
member(X,[_|Tail]):- 
    member(X,Tail). 
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|[]],verb(H)):- 
    verb(H). 
vp([H|T],vp(verb(H),Rest)):- 
    verb(H), 
    pp(T, Rest,_). 
vp([H|T],vp(verb(H),Rest)):- 
    verb(H), 
    np(T, Rest,_). 

由於我說我有號碼2工作,直到我嘗試數字3,現在它只是打印解析出來的句子,然後給我一個'錯誤:超出本地堆棧消息'任何幫助非常感謝!因此,頂部是我們用來比較列表以找出最佳匹配的知識庫,這些被best_match方法調用(儘管在這個階段是不正確的),該方法在解析句子並提取關鍵詞。同時我也很抱歉,如果代碼是非常嚴格的! 乾杯

回答

3

我認爲發佈此人的人永遠不會回來,我想提醒自己一些序言,所以在這裏。

這段代碼有兩個主要問題,除了某些謂詞中還存在一些邏輯問題。

問題1: 你忽略了單身人士的警告,他們通常是不容忽視的東西。最佳匹配謂語應該是這樣的:

best_match(Subject,Object,Verb):- 
     history(X,Y), 
     member(Subject,Y), 
     member(Object,Y), 
     member(Verb,Y), 
     write(X),nl, 
     fail. 

另一個警告是關於在sentence謂語Sentence變量,所以它是這樣的:

sentence(X,Subject,Object,Verb),nl,write(Subject),nl,write(Verb),nl,write(Object). 

sentence(Sentence,Subject,Object,Verb):- 

    np(Sentence,_,Rem),  
    vp(Rem,_), 
    nl, 
     noun(Subject), 
    member(Subject,Sentence), 
     noun(Object), 
    member(Object,Rem), 
    verb(Verb), 
    member(Verb,Rem), 
     best_match(Subject,Object,Verb). 

問題2: 我承擔您將np邏輯分爲np和np2以避免無限循環,但是忘記將這個部分應用到必要的地方。最長NP條款應該是:

np(Sentence,np(NP,PP),Rem):- 
     np2(Sentence,NP,Rem1), 
     pp(Rem1,PP,Rem). 

如果你真的想要讓更多的複雜NP在那裏,我懷疑,你可以做這樣的:

np(Sentence,np(NP,PP),Rem):- 
    append(List1,List2,Sentence), 
    List1\=[], 
    List2\=[], 
    np(List1,NP,Rem1), 
    append(Rem1,List2,Rem2), 
    pp(Rem2,PP,Rem). 

這樣你就不會結束一次又一次地用相同的參數調用np,因爲你確保每次檢查的句子更短。

次要問題: (程序是如何工作的,經過無限循環問題已得到修復)

  1. 最後VP重複
  2. 我不知道你的語法,如爲什麼"defeated"是名詞...

只是爲了檢查該程序的作品我用了一句[edwardIV,defeated,henryVI,on,palm_Sunday].

我改變"defeated"一個動詞,並且也改變了過去vp子句:

vp([H|T],vp(verb(H),Rest)):- 
    verb(H), 
    np(T,_,Rest1),  
    pp(Rest1, Rest,_). 

對於例句我得到了battle_of_Boroughbridge和battle_of_Towton的結果。