Prendendo un esempio dal Introduction to Latin Wikiversity, si consideri la frase:Analisi flesso lingue non-parola-ordine (ad es latino)
the sailor gives the girl money
Siamo in grado di gestire questa situazione in Prolog con un DCG piuttosto elegante con questo mucchio di regole:
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].
E vediamo che questo funziona:
?- phrase(sentence(S), [the,sailor,gives,the,girl,money]).
S = s(sailor, vp(gives, money, girl)) ;
mi sembra che la DCG è davvero ottimizzato per la gestione delle lingue di ordine delle parole. Sono ad una perdita completa su come gestire questa frase latina:
nauta dat pecuniam puellae
Ciò significa che la stessa cosa (il marinaio dà il denaro ragazza), ma l'ordine delle parole è completamente gratuito: tutte queste permutazioni anche significa esattamente la stessa cosa:
nauta dat puellae pecuniam
nauta puellae pecuniam dat
puellae pecuniam dat nauta
puellae pecuniam nauta dat
dat pecuniam nauta puellae
la prima cosa che mi viene in mente è quello di enumerare le permutazioni:
sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP).
sentence(s(NP, VP)) --> verb_phrase(VP), noun_phrase(NP).
, ma questo non lo farà, perché mentre nauta
appartengono s alla frase di soggetto soggetto, puellae
che appartiene alla frase oggetto oggetto è subordinato al verbo, ma può precederlo. Mi chiedo se devo affrontarlo con la costruzione di una sorta di lista attribuiti prima in questo modo:
?- attributed([nauta,dat,pecuniam,puellae], Attributed)
Attributed = [noun(nauta,nom), verb(do,3,s), noun(pecunia,acc), noun(puella,dat)]
Questo sembra che si rivelerà essere necessario (e non vedo un buon modo per farlo), ma grammaticamente sta spingendo il cibo nel mio piatto. Forse potrei scrivere un parser con una specie di orribile aggeggio non DCG in questo modo:
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)
Questo sembra che avrebbe funzionato, ma solo fino a quando non ho ricorsione; non appena avrò introdotto una clausola subordinata, ho intenzione di riutilizzare i soggetti in modo malsano.
Semplicemente non vedo come passare da una frase non ordinata a un albero di analisi. C'è un libro che discute di questo? Grazie.
non l'ho fatto, in realtà. –