Prolog Operator =: =
Gibt es einige Besondere Operatoren in Prolog, einer von Ihnen ist "ist", aber, vor kurzem stieß ich auf die =:= Operatoren, und ich habe keine Ahnung, wie es funktioniert.
Kann mir jemand erklären, was der Betreiber macht, und auch wo finde ich eine vordefinierte Liste mit solchen speziellen Operatoren und was Sie tun?
Dank.
InformationsquelleAutor der Frage nubela | 2009-09-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bitte auch docs http://www.swi-prolog.org/pldoc/man?predicate=is/2
InformationsquelleAutor der Antwort Xonix
Ich denke, die obige Antwort verdient ein paar Worte der Erklärung trotzdem hier.
Einen kurzen Hinweis im Voraus: Arithmetische Ausdrücke in Prolog sind nur Begriffe ("Alles ist ein Begriff, der in Prolog"), die nicht ausgewertet automatisch. (Wenn Sie einen Lisp-hintergrund, denke der zitierten Listen). So
3 + 4
ist genau das gleiche wie+(3,4)
die nichts anderes tut als auf seinem eigenen. Es liegt in der Verantwortung der einzelnen Prädikate zu bewerten diese Begriffe.Mehrere built-in-Prädikate machen die implizite Bewertung, unter Ihnen der arithmetischen Vergleich-Operatoren wie
=:=
undis
. Während=:=
wertet beide Argumente und vergleicht das Ergebnisis
akzeptiert und wertet nur seine Recht argument als arithmetischen Ausdruck.Den Links argument ist ein atom, das entweder eine numerische Konstante (das ist dann im Vergleich dazu das Ergebnis der Auswertung des rechten Operanden) oder eine variable. Wenn es ein gebunden variable, deren Wert muss numerisch sein und ist im Vergleich zu den rechten Operanden als im ersten Fall. Wenn es eine ungebundene variable, die das Ergebnis der Auswertung des rechten Operanden gebunden ist, die variable.
is
wird Häufig verwendet, in diesem Fall, zu bind-Variablen.Abholen an einem Beispiel aus der oben verlinkten Prolog Wörterbuch: um Zu testen, ob eine Zahl N gerade ist, könnten Sie beide Operatoren:
Aber wenn Sie wollen, um zu erfassen das Ergebnis der operation können Sie nur die erste Variante. Wenn X ungebunden ist, dann:
Faustregel: Wenn man nur einen arithmetischen Vergleich, die Verwendung
=:=
. Wenn Sie möchten, erfassen Sie das Ergebnis einer Auswertung, Nutzungis
.InformationsquelleAutor der Antwort ThomasH
Ergänzung der bestehenden Antworten, ich möchte ein paar weitere Punkte:
Ein operator ist ein operator
Zunächst die Betreiber
=:=
ist, wie der name schon sagt, ein Betreiber. In Prolog können wir das Prädikatcurrent_op/3
erfahren Sie mehr über die Betreiber. Zum Beispiel:Dies bedeutet, dass der Betreiber
=:=
hat Vorrang 700 und ist von Typxfx
. Dies bedeutet, dass es sich um eine binäre infix Betreiber.Dies bedeutet, dass Sie kannwenn Sie wollenschreiben einen Begriff wie
=:=(X, Y)
gleichbedeutend alsX =:= Y
. In sowohl Fällendie Funktor der Begriff ist=:=
und die stelligkeit der Begriff ist 2. Sie könnenwrite_canonical/1
um dies zu überprüfen:Ein Prädikat ist nicht ein Betreiber
So weit, So gut! Dies wurde alles rein syntaktische Funktion. Allerdings ist, was Sie eigentlich Fragen ist die Prädikat
(=:=)/2
dessen name=:=
- und das dauert 2 Argumente.Wie andere bereits erklärt haben, das Prädikat
(=:=)/2
bezeichnet arithmetische Gleichheit von zwei arithmetischen - Ausdrücken. Es ist wahr iff seine Argumente bewerten der gleichen Anzahl.Zum Beispiel, lassen Sie uns versuchen, die Allgemeine Abfrage, durch die wir bitten, für jede Lösung auch immer, mit Variablen als Argumente:
Daher, dieses Prädikat ist nicht eine wirkliche Beziehung, da wir Sie nicht nutzen es für generieren Ergebnisse! Das ist eine ganz schwere Nachteil dieses Prädikat, Zusammenstößen mit, was man im Allgemeinen als "deklarative Programmierung".
Das Prädikat, das funktioniert nur im sehr bestimmten situation, dass beide Argumente sind komplett instanziert. Zum Beispiel:
Nennen wir solche Prädikate veraltetendenn Sie können nur verwendet werden, insbesondere Modi der Nutzung. Für die überwiegende Mehrheit der Anfänger, veralteten Prädikaten sind ein Alptraum zu zu verwenden, weil Sie verlangen, dass Sie überlegen, Ihre Programme prozeduraldas ist ganz hart an der erste und bleibt hart, auch später. Auch, veralteten Prädikaten stark Grenze der Allgemeingültigkeit Ihre Programme, weil Sie nicht verwenden können Sie auf allen Richtungen, in denen Sie könnte Verwendung der reinen Prädikate.
Einschränkungen sind eine Allgemeine alternative
Prolog bietet auch viel mehr Allgemeine arithmetische Prädikate in form von arithmetischen Einschränkungen.
Beispielsweise im Fall von Ganzzahlenversuchen Sie Ihr Prolog-system CLP(FD) - Einschränkungen. Eine der wichtigsten CLP(FD) constraints bezeichnet arithmetische Gleichheit und heißt
(#=)/2
. In völliger Analogie zu(=:=)/2
die Betreiber(#=)/2
ist auch definiert als ein infix Betreiber, und so können Sie zum Beispiel schreiben:Ich benutze GNU Prolog als ein spezielles Beispiel, und viele andere Prolog-Systeme bieten auch CLP(FD) - Implementierungen.
Eine große Attraktion der Einschränkungen findet sich in Ihrer Allgemeingültigkeit. Zum Beispiel, im Gegensatz zu
(=:=)/2
bekommen wir mit der Prädikat(#=)/2
:Und wir können sogar Fragen, die die meisten Allgemeinen - Abfrage:
Hinweis, wie selbstverständlich diese Prädikate mischen in Prolog und Akt als Beziehungen zwischen integer - Ausdrücken abgefragt werden können, in alle Richtungen.
Je nach domain von Interesse, meine recommendition ist die Verwendung von CLP(FD), CLP(Q), CLP(B) etc. statt von mehr low-level-Arithmetik Prädikate.
Siehe auch clpfdclpq und clpb für mehr Informationen.
Zufällig die Betreiber
=:=
wird von CLP(B) mit einem komplett andere Bedeutung:Zeigt dies, dass Sie müssen unterscheiden zwischen Betreiber und Prädikate. In der oben Fall, die Prädikat
sat/1
hat, interpretiert den gegebenen Ausdruck als eine aussagenlogische Formel, und in diesem Zusammenhang=:=
kennzeichnet die Gleichheit von booleschen - Ausdrücken.InformationsquelleAutor der Antwort mat
Fand ich meine eigene Antwort, http://www.cse.unsw.edu.au/~billw/prologdict.html
InformationsquelleAutor der Antwort nubela
=:= ist ein Vergleichsoperator.A1 =:= A2 dann erfolgreich, wenn die Werte der Ausdrücke A1 und A2 gleich sind.
A1 == A2 erfolgreich, wenn der Bezug auf A1 und A2 identisch sind;
InformationsquelleAutor der Antwort Ayyappa Boligala
Erste operator =:= ist prüfen Sie gleich ?
zum Beispiel
geben Sie eine Bild-Beschreibung hier
es"s true zurück.
aber dies gibt false zurück
geben Sie eine Bild-Beschreibung hier
InformationsquelleAutor der Antwort Okan Çiftçi