2015-12-08 4 views
5

Ich studiere Grammatik mit definierter Klausel, aber ich habe ein Problem zu verstehen, wie Prolog DCG-Regeln in bestimmte Klauseln übersetzt. Zum Beispiel, hier ist ein wenig Grammatik als DCG geschrieben:Wie übersetzt Prolog DCG-Regeln in bestimmte Klauseln?

s --> np, vp. 

np --> det, n. 

vp --> v, np. 
vp --> v. 

det --> [the]. 
det --> [a]. 

n --> [woman]. 
n --> [man]. 

v --> [kisses]. 

Wenn ich die Abfrage stellen:

?-listing(s). 

Es mir antworten mit:

s(A,C) :- 
    np(A,B), 
    vp(B,C). 

Was bedeutet das? Warum gibt es zwei Argumente?

Auch, was bedeutet 'C' bedeutet hier:

det(A,B) :- 
    'C'(A,the,B). 

?

Vielen Dank!

+1

Wo siehst du "C" (A, das, B) .'? Die Liste für Ihre ursprüngliche DCG-Quelle zeigt diese Definition von "det/2" nicht an, als ich es ausprobierte. Aber in der direkten Antwort auf die Frage ist "C" ein Atom, also ist "C" (A, das, B) "ein Aufruf zu einem Prädikat namens" C "mit drei Argumenten:" A "(Variable), 'das' (Atom) und' B' (Variable). 's (A, C)' hat zwei Argumente, weil Prolog intern ein Argument für eine Differenzliste hinzufügt und so die DCG implementiert. Normalerweise würden Sie die DCG mit "Phrase (s, L)" aufrufen. – lurker

+0

es nur aus Neugier. Ich habe gelesen, dass Prolog-Implementierungen manchmal Regeln wie zum Beispiel: det -> [the] übersetzen. nicht in det ([die | W], W). aber in det (A, B): - 'C' (A, die, B). –

+1

OK, interessant. Wie schon erwähnt, ist "C" ein Atom, genau wie jedes andere Atom, also ist es nur der Name eines Prädikats. Es hat keine besondere Bedeutung. Du könntest ein Prädikat sagen: "Das ist mein großartiges Prädikat" (X, Y), wenn du willst. :) – lurker

Antwort

4

Die nutzt ein Konzept namens Differenzlisten. Nehmen wir an, Sie möchten Parsing durchführen (Sie können auch Listen mit diesen Prädikaten erzeugen, aber lassen Sie uns das jetzt ignorieren).

Wenn Sie eine Liste analysieren, wie [the,man,kisses,the,woman]. Sie können dies als Zug der Wörter sehen, ich "entlehnt" die Zug-Analogie von @Vikramnath Venkatasubramani, also Kredite an ihn/sie. Jetzt, wenn wir s([the,man,kisses,the,woman],C) anrufen. C wird [] zurückgegeben.

Was passiert ist, dass bei jedem Prädikat wird Null, ein oder mehrere Waggons zu trennen. So bedeutet dies, dass im Falle von:

s(A,C) :- 
    np(A,B), 
    vp(B,C). 

np/2 werden die Wagen [the,man] trennen, was dazu führt, dass es immer noch die restlichen Zug B=[kisses,the,woman] speichert. Jetzt wird die vp/2 alle verbleibenden Wagen, die C=[], einen leeren Zug ergeben, trennen.

Wie dies implementiert ist

Lassen Sie uns die Umsetzung eines Teils der Grammatik betrachten.

s(A,C) :- 
    np(A,B), 
    vp(B,C). 

np(A,B) :- 
    det(A,D), 
    n(D,B). 

vp(B,C) :- 
    v(B,E), 
    np(E,C). 
vp(B,C) :- 
    v(B,C). 

det([the|W],W). 
det([a|W],W). 

n([woman|W],W). 
n([man|W],W). 

v([kisses|W],W). 

So sagte wie zuvor, rufen Sie np([the,man,kisses,the,woman],B) und np/2 werden die Wagen trennen, die das Nomen-Sätze bilden: [the,man].

an seiner Reihe ruft det/2 und n/2.Jetzt trennen det/2 den Bestimmer: the und n/2 das Substantiv man trennen, so macht es noch deutlicher:

np([the,man,kisses,the,woman],[kisses,the,woman]) :- 
    det([the,man,kisses,the,woman],[man,kisses,the,woman]), 
    n([man,kisses,the,woman],[kisses,the,woman]). 

Jetzt det/2 nicht mehr leitet seine Verantwortung wird umgesetzt als:

det([the|W],W). 

Jetzt, wenn wir einen Musterabgleich durchführen, wird dies geerdet zu:

det([the,man,kisses,the,woman],[man,kisses,the,woman]). 

Das heißt, es hat die the getrennt.

Der Vorteil dieses Ansatzes besteht darin, dass das Trennen in konstanter Zeit erfolgen kann. Tatsächlich ist sich das Prädikat des gesamten Schwanzes der Liste nicht bewusst.

Darüber hinaus würde es ermöglichen, mehrere Wörter in einer Tatsache zu trennen. Zum Beispiel sagt, fügen Sie Ihren Namen als Substantiv:

n([s,dallapalma|W],W). 

in diesem Fall n/2 zwei Wagen auf einmal trennen werden. Andere Prädikate müssen sich dessen nicht bewusst sein, und auch s/2 müssen zum Beispiel entscheiden, an welchem ​​Punkt sie den Zug zwischen und vp/2 aufteilen: sie lässt so viele Waggons abschalten, wie sie wollen, und vp/2 zielt darauf ab zu arbeiten mit dem Rest des Zuges.

+0

Vielen Dank. Jetzt ist alles klar: D –