\ + kann verwendet werden, um weniger zweideutige Grammatiken zu erstellen. Der Vorteil der Verwendung von \ + over! Zum Beispiel ist eine bestimmte Deklaration von \ +, so dass zum Beispiel die resultierenden DCG Regeln neu geordnet werden können.
sich ein Beispiel machen, sollen Sie die folgende Grammatik:
s([X|Y]) --> t(X), s(Y). % 1
s([]) --> []. % 2
t(2) --> [a,a]. % 3
t(1) --> [a]. % 4
Die obige Grammatik ist sehr zweideutig, zum Beispiel ich mehr für die folgende Eingabe analysiert:
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
A = [2,1,2] ;
A = [2,1,1,1] ;
etc..
Jetzt
gehe ich davon wollen den langen Parse von t über die kurze Parse von t bevorzugen. Ich kann dies mit einem Schnitt wie folgt tun:
t(2) --> [a,a], !. % 5
t(1) --> [a]. % 6
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
Leider kann ich nicht neu anordnen. Da das folgende nicht das gewünschte Ergebnis liefert. Obwohl s (A) jetzt die Ergebnisse in einer anderen Reihenfolge ergibt, sind wir eines, auf Platz zurück da die Grammatik wieder zweideutig ist:
t(1) --> [a]. % 7
t(2) --> [a,a], !. % 8
?- phrase(s(A),[a,a,a,a,a]).
A = [1,1,1,1,1] ;
A = [1,1,1,2] ;
A = [1,1,2,1] ;
etc...
läßt nun das gleiche versuchen mit \ +. Wir können den Schnitt durch die folgende Negation ersetzen:
t(2) --> [a,a]. % 9
t(1) --> [a], \+ [a]. % 10
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
können nun versuchen, ob wir neu ordnen können. Wir ordnen die Grammatikregeln von T // 1:
t(1) --> [a], \+ [a]. % 11
t(2) --> [a,a]. % 12
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
Die Deklarativität sehr nützlich ist. Es bedeutet zum Beispiel , dass wir \ + in einem rechts-nach-links-Diagramm-Parser verwenden können, der die Grammatikregeln in einer willkürlichen Reihenfolge auswählt. Die Deklarativität stellt sicher, dass die Bottom-up-Vorwärtsverkettung des Diagrammparsers das gleiche Ergebnis unabhängig von die Reihenfolge der DCG-Regeln ergibt.
Es ist dann möglich, die DCG-Technik in großen Natural Language (NL) -Projekten anzuwenden und es skaliert gut. Die NL-Grammatiken können empirisch auf Determinismus abgestimmt werden. Je deterministischer eine Grammatik desto effizienter ihre Parsing. Komplexe NL-Grammatiken, die sonst sind, werden praktikabel.
Bye
+1, aber ich bin * sehr * skeptisch über Ihren Deklarationsanspruch: 'Satz (s ([1]), [a]).' gelingt, aber 'Satz (s ([1]), L)' scheitert. Genau diese Art von Unreinheit stört mich. – false
Das ist: Wie zeichnen Sie die Grenze zwischen legitimen und nicht legitimen Anwendungen? – false
Ich beanspruche keine allgemeine Deklaration. Ich schrieb "gewisse Deklarativität". Sie können eine Deklarativität für ein Adorament festlegen (= Datenbanksprache für Prolog-Modus-Deklaration). Die Techniken können auch auf Grammatiken angewendet werden. Siehe auch: ftp://ftp.inf.ethz.ch/doc/tech-reports/1xx/177.pdf –