以從Introduction to Latin Wikiversity例如,考慮了一句:解析活用非詞序語言(如拉丁語)
the sailor gives the girl money
我們可以在序言與DCG用這堆規則處理這個相當優雅:
sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP).
noun_phrase(Noun) --> det, noun(Noun).
noun_phrase(Noun) --> noun(Noun).
verb_phrase(vp(Verb, DO, IO)) --> verb(Verb), noun_phrase(IO), noun_phrase(DO).
det --> [the].
noun(X) --> [X], { member(X, [sailor, girl, money]) }.
verb(gives) --> [gives].
而且我們看到,這個工程:
?- phrase(sentence(S), [the,sailor,gives,the,girl,money]).
S = s(sailor, vp(gives, money, girl)) ;
在我看來,該是DCG真正爲處理詞序語言而優化。我在一個完全不知如何處理這個拉丁句子:
nauta dat pecuniam puellae
這意味着同樣的事情(水手給女孩錢),但詞序是完全免費的:所有這些排列也意思是完全一樣的東西:
nauta dat puellae pecuniam
nauta puellae pecuniam dat
puellae pecuniam dat nauta
puellae pecuniam nauta dat
dat pecuniam nauta puellae
發生在我的第一件事是枚舉排列:
sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP).
sentence(s(NP, VP)) --> verb_phrase(VP), noun_phrase(NP).
,但是這不會做,因爲雖然nauta
屬於s到主語名詞短語,puellae
屬於對象名詞短語從屬於動詞,但可以在它之前。我不知道我是否應該首先建立某種原因列表,像這樣來解決:
?- attributed([nauta,dat,pecuniam,puellae], Attributed)
Attributed = [noun(nauta,nom), verb(do,3,s), noun(pecunia,acc), noun(puella,dat)]
這似乎是它會變成是必要的(我沒有看到一個很好的辦法做到這一點),但從語法上講,它是在我的盤子上推動食物。也許我可以寫了某種可怕的非DCG玩意兒像這樣的解析器:
parse(s(NounPhrase, VerbPhrase), Attributed) :-
parse(subject_noun_phrase(NounPhrase, Attributed)),
parse(verb_phrase(VerbPhrase, Attributed)).
parse(subject_noun_phrase(Noun), Attributed) :-
member(noun(Noun,nom), Attributed).
parse(object_noun_phrase(Noun), Attributed) :-
member(noun(Noun,acc), Attributed)
這似乎是它的工作,但只要只因爲我沒有遞歸;只要我介紹一個從屬條款,我就會以不健康的方式重用主題。
我只是看不出如何從一個非單詞順序句子到一個分析樹。有沒有討論這個問題的書?謝謝。
我沒有,真的。 –