In den Grammatikregeln ( dcg ) gibt es mehrere vordefinierte Konstrukte: (',')//2
bedeutet Verkettung, ('|')//2
bedeutet Alternation usw. Ein Konstrukt, das von mehreren, aber nicht allen Prolog-Systemen unterstützt wird, ist (\+)//1
.
Ich persönlich habe es nur benutzt, um es zu benutzen. Ich habe es nie in Code gesehen, der von anderen geschrieben wurde.
Also, gibt es legitime Verwendungen von (\+)//1
?
Edit: Und zusätzlich, gibt es legitime Verwendungen von (\+)//1
innerhalb einer Abfrage phrase(nt, L)
mit L
eine uninstantiierte Variable.
\ + kann verwendet werden, um weniger zweideutige Grammatiken zu erstellen. Der Vorteil von \ + over! zum Beispiel ist ein bestimmter Deklarativität von \ +, so dass zum Beispiel die resultierende DCG Regeln können neu geordnet werden.
Lass uns ein Beispiel geben, beachte die folgende Grammatik:
%Vor%Die obige Grammatik ist sehr zweideutig, zum Beispiel bekomme ich mehrere analysiert für die folgende Eingabe:
%Vor%Nun nehme ich an, ich möchte den langen Parse von t vorziehen kurze Analyse von t. Ich kann das mit einem Schnitt wie folgt machen:
%Vor%Leider kann ich nicht neu anordnen. Seit dem folgenden gibt nicht das gewünschte Ergebnis. Obwohl s (A) jetzt nachgibt die Ergebnisse in einer anderen Reihenfolge, wir sind zurück auf Platz eins, da die Grammatik wieder mehrdeutig ist:
%Vor%Nun können wir das gleiche mit \ + versuchen. Wir können den Schnitt ersetzen durch die folgende Verneinung:
%Vor%Jetzt können wir versuchen, ob wir neu anordnen können. Wir ordnen die Grammatikregeln von t // 1:
%Vor%Die Deklarativität ist sehr nützlich. Es bedeutet zum Beispiel dass wir in einem rechts-nach-links-Diagramm-Parser \ + verwenden können wählt die Grammatikregeln in einer beliebigen Reihenfolge aus. Das die deklaration gewährleistet, dass die bottom-up-kette vorwärts kettet des Diagrammparsers ergibt das gleiche Ergebnis unabhängig von die Reihenfolge der Eingabe der DCG-Regeln.
Es ist dann möglich, die DCG-Technik in großem Umfang anzuwenden natürliche Sprache (NL) Projekte und es skaliert gut. Das NL-Grammatiken können empirisch auf Determinismus abgestimmt werden. Je deterministischer eine Grammatik desto effizienter seine Analyse. Komplexe NL-Grammatiken, die anders sind unlösbar werden machbar.
Tschüss
Wenn L nicht instanziiert wird, wird die Grammatik für die Texterzeugung verwendet. Dann Du brauchst die Grammatik \ + überhaupt nicht. Da gibt es kein Problem mehrdeutig aus irgendeinem Text.
Lass uns ein Beispiel geben, beachte die folgende Grammatik:
%Vor%Jede andere Syntax hat einen anderen Syntaxbaum. Und da ist keine Zweideutigkeit Verwenden von Phrase / 2 zum Generieren von Text. Die folgenden Abfragen geben genau eins an Antwort:
%Vor%Aber es gibt ein kleines Wiederverwendungsproblem. Angenommen, ich habe eine NL-Grammatik mit \ + für Parsing. Ich kann es dann nicht zum Unversuchen verwenden. Seit dem Instanziierungsmuster Das \ + Ziel wird anders sein und daher die Semantik des Konstrukts Änderungen.
Der Ausweg ist wahrscheinlich, nur zwei Grammatiken zu verwenden. Eine für Parsing und eine für ungarisch. Ich denke, Parsing und Unversucht sind zwei verschiedene kognitive Fähigkeiten. Denken Sie daran, in der Schule gab es Leseübungen und Schreibübungen. Das Das gleiche passiert in der Informatik.
Ich denke, dass es in einigen Fällen auch möglich ist, eine einzelne Grammatik zu verwenden und + zu betrachten eine Annotation für die Disambiguierung, die während oder ohne Ausnahme gelöscht wird abgewickelt. Man könnte einen solchen Mechanismus bauen. Aber die Probleme mit dem Unversöhnlichen versus Parsing sind tiefer: Bidirektionale Hilfsbedingungen ({} / 1), linke Rekursion während Unversuchen, etc ...
Tschüss
Tags und Links prolog dcg iso-prolog