ein Beispiel aus den Introduction to Latin Wikiversity nehmen, betrachten Sie den Satz:Parsing gebeugte Unwort Ordnung Sprachen (zB Latein)
the sailor gives the girl money
Wir dies in Prolog mit einem DCG mit diesem Haufen von Regeln ziemlich elegant umgehen können:
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].
Und wir sehen, dass dies funktioniert:
?- phrase(sentence(S), [the,sailor,gives,the,girl,money]).
S = s(sailor, vp(gives, money, girl)) ;
Es scheint mir, dass die DCG ist wirklich optimiert für den Umgang mit Word-Order-Sprachen. Ich bin zu einem vollständigen Verlust, wie dieser lateinischen Satz zu behandeln:
nauta dat pecuniam puellae
Das bedeutet, die gleiche Sache (der Seemann gibt das Mädchen Geld), aber die Wortfolge ist völlig kostenlos: alle diese Permutationen auch bedeutet genau das gleiche:
nauta dat puellae pecuniam
nauta puellae pecuniam dat
puellae pecuniam dat nauta
puellae pecuniam nauta dat
dat pecuniam nauta puellae
Das erste, was mir einfällt, ist die Permutationen aufzuzählen:
sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP).
sentence(s(NP, VP)) --> verb_phrase(VP), noun_phrase(NP).
aber dies wird nicht tun, denn während nauta
gehören s zu dem Subjekt Nominalphrase, puellae
, die zu dem Objekt Nominalphrase gehört, ist dem Verb untergeordnet, kann aber vorausgehen. Ich frage mich, ob ich es durch den Bau eine Art zugeschrieben Liste nähern sollte zunächst etwa so:
?- attributed([nauta,dat,pecuniam,puellae], Attributed)
Attributed = [noun(nauta,nom), verb(do,3,s), noun(pecunia,acc), noun(puella,dat)]
Dies scheint, wie es wird sich herausstellen notwendig sein (und ich sehe nicht ein guter Weg, es zu tun), aber grammatikalisch drückt es Essen auf meinem Teller herum. Ich konnte einen Parser mit irgendeiner Art von schrecklichen Nicht-DCG contraption so schreiben Vielleicht:
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)
Dies scheint, wie es funktionieren würde, aber nur solange ich keine Rekursion haben; Sobald ich einen Nebensatz einführe, werde ich Themen ungesund wiederverwenden.
Ich sehe einfach nicht, wie man von einem Nicht-Wort-Reihenfolge-Satz zu einem Parse-Baum kommt. Gibt es ein Buch, das dies diskutiert? Vielen Dank.
ich nicht, eigentlich. –