2013-07-20 127 views
5

我設法爲給定的句子構建解析樹,這裏是句子:「這個人回家了。」如何將序言樹解析樹轉換回邏輯句子

T = s(np(det(the), n(man)), vp(v(went), np(n(home)))) 

1)如何在這個上使用phrase/2?

How to translate a sentence in a logical language using prolog? - 與我所需要的類似,但它的解決方案對我無效。

2)我想映射這與語法模式,並獲得單詞標籤。 Det=theN(Subject)=manV=wentN(Object)=home

是否有映射此樹與給定的樹形結構,並確定語法的方式。 如何使用解析樹來識別主語,動詞,賓語,語法模式和生成目標語言句子。


編輯後.. 我嘗試此代碼,它給了相當大的答案。對此代碼的任何建議。

sent("(s(np(n(man))) (vp(v(went)) (np(n(home)))))"). 

whitespace --> [X], { char_type(X, white) ; char_type(X, space) }, whitespace. 
whitespace --> []. 

char(C) --> [C], { char_type(C, graph), \+ memberchk(C, "()") }. 

chars([C|Rest]) --> char(C), chars(Rest). 
chars([C]) --> char(C). 

term(T) --> chars(C), { atom_chars(T, C) }. 
term(L) --> list(L). 

list(T) --> "(", terms(T), ")". 

terms([]) --> []. 
terms([T|Terms]) --> term(T), whitespace, !, terms(Terms). 

simplify([s,[np, [n,[Subject]]], [vp,[v,[Verb]],[np,[n,[Object]]]]],Result) :- Result = [Subject,Verb,Object]. 

感謝Mathee

+0

「短語/ 2」涉及DCG規則和某種類型的輸入列表。你可以在任何方向使用它,但是如果你既沒有解析也沒有生成一個列表,它可能不適合這份工作。它在另一個答案中適用於我,因爲Lisp s表達式本質上是列表。 –

+0

請檢查我稍後添加的代碼。我遵循你的方法。它在SWI prolog中起作用。你能否建議對代碼進行改進以匹配幾個語法模式,併爲給定句子確定語法模式。 – Mathee

+0

'白色'是標籤和空格; 'space'包括那些,所以你只需要'空白'中的空格// 0。我將從'simplify/2'中移除'Result',並將列表作爲第二個參數,並且在此規則中沒有任何內容。否則它對我來說很好。令人驚訝的是,這並不是我認爲你所要求的,但它對我來說並不壞。 :) –

回答

3

的更簡單的方法做的是指樹,你有興趣的符號「硬編碼」的訪問。

這裏是一個更通用的工具,使用(=..)/ 2來捕捉樹的命名部分:

part_of(T, S, R) :- T =.. [F|As], 
    ( F = S, 
     R = T 
    ; member(N, As), 
     part_of(N, S, R) 
    ). 

?- part_of(s(np(det(the), n(man)), vp(v(went), np(n(home)))),np,P). 
P = np(det(the), n(man)) ; 
P = np(n(home)) ; 
false. 

這是一種成員/ 2的,只是樹木。順便說一句我不明白你的問題的第一部分:你爲什麼要在語法樹上使用短語/ 2?通常語法(短語/ 2的第一個參數)意味着構建來自'原始'字符流的語法樹...

+0

很高興從你的答案中知道事情。但我需要將給定的樹與語法模式進行比較,在這裏我可以將人作爲主題,把家當作物體。 爲此,我從http://stackoverflow.com/questions/14953960/how-to-translate-a-sentence-in-a-logical-language-using-prolog/17759505#17759505得到了這個短語的想法。 – Mathee