Biorąc przykład z Introduction to Latin Wikiversity Rozważmy zdanie:analizowaniem odmieniane języki inne niż słowo zamówienie (np łacińskie)
the sailor gives the girl money
Możemy obsłużyć to w Prologu z DCG dość elegancko z tego stosu zasad:
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].
i widzimy, że to działa:
?- phrase(sentence(S), [the,sailor,gives,the,girl,money]).
S = s(sailor, vp(gives, money, girl)) ;
wydaje mi się, że jest DCG naprawdę zoptymalizowany do obsługi języków w kolejności alfabetycznej. Jestem w całkowitej utraty, jak obsługiwać to zdanie łac
nauta dat pecuniam puellae
Oznacza to samo (marynarz dziewczyna daje pieniądze), ale kolejność słowo jest całkowicie za darmo: wszystkie z tych permutacji także znaczy dokładnie to samo:
nauta dat puellae pecuniam
nauta puellae pecuniam dat
puellae pecuniam dat nauta
puellae pecuniam nauta dat
dat pecuniam nauta puellae
pierwszą rzeczą, która przychodzi mi do głowy jest wyliczyć permutacje:
sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP).
sentence(s(NP, VP)) --> verb_phrase(VP), noun_phrase(NP).
ale to nie wystarczy, ponieważ podczas nauta
należeć s do rzeczownika fraza rzeczownikowa, puellae
, która należy do frazy rzeczownikowej obiektu, podporządkowana jest czasownikowi, ale może ją poprzedzić. Zastanawiam się, czy powinienem podejść do niego budując jakąś nadana liście pierwszy tak:
?- attributed([nauta,dat,pecuniam,puellae], Attributed)
Attributed = [noun(nauta,nom), verb(do,3,s), noun(pecunia,acc), noun(puella,dat)]
Wydaje się to okaże się konieczne (i nie widzę dobry sposób, aby to zrobić), ale gramatycznie to popycha jedzenie na moim talerzu. Może mógłbym napisać parser z jakimś przerażającym-DCG non ustrojstwo jak ten:
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)
Wydaje się, że to działa, ale tylko tak długo, jak nie mam rekurencji; jak tylko wprowadzę podrzędną klauzulę, zamierzam ponownie użyć przedmiotów w niezdrowy sposób.
Po prostu nie widzę sposobu, w jaki można uzyskać od zdania niepasującego do drzewa parse. Czy istnieje książka, która to omawia? Dzięki.
ja nie, rzeczywiście. –