9: Terme
Vergleich von Termen
Der Gleichheitsoperator für Terme „==“ vergleicht zwei Terme auf Gleichheit.
Der Ungleichheitsoperator für Terme „==“ gelingt genau dann, wenn „==“ nicht gelingt.
Übersicht Matching- und Vergleichsoperatoren
Operator | Negation | Vergleichstyp |
---|---|---|
= | \= | Unifikation |
=:= | =\= | arithmetische Gleichheit |
== | \== | Termgleichheit |
Analyse von nicht zusammengesetzten Termen
Mit den folgenden eingebauten Prädikaten kann man den Typ eines nicht zusammengesetzten Terms überprüfen:
Prädikat | Funktion |
---|---|
atom/1 | Testet ob das Argument ein Atom ist. |
integer/1 | Testet ob das Argument eine natürliche Zahl ist |
number/1 | Testet ob das Argument eine Zahl ist |
atomic/1 | Testet ob das Argument eine Konstante ist |
var/1 | Testet ob das Argument eine uninstantiierte Variable ist |
nonvar/1 | Testet ob das Argument keine uninstantiierte Variable ist |
Analyse zusammengesetzter Terme
- Die Struktur eines zusammengesetzten Terms besteht aus (1) dem Funktor, (2) der Stelligkeit und (3) dem Typ der Argumente.
- Die folgenden eingebauten Prädikate ermöglichen die Analyse der Struktur zusammengesetzter Terme:
- Das Prädikat functor/3 ermöglicht den Zugriff auf den Funktor und die Stelligkeit eines komplexen Terms.
- Das Prädikat arg/3 ermöglicht den Zugriff auf einzelne Argumente eines komplexen Terms.
- Zusätzlich kann man mit dem univ genannten Prädikat „=../2“ einen komplexen Term in eine Liste umwandeln.
Testen ob ein Term zusammengesetzt ist
Wie können wir testen, ob ein Term zusammengesetzt ist?
Das Prädikat: arg/3
Das Prädikat arg/3 ermögliche den Zugriff auf einzelne Argumente eines komplexen Terms.
Das Prädikat arg/3 kann auch zur Instantiierung von Argumenten genutzt werden.
Das Prädikat: functor/3
Das Prädikat functor/3 ermöglicht den Zugriff auf den Funktor und die Stelligkeit eines komplexen Terms.
Prolog wäre nicht Prolog, wenn man das Prädikat functor/3 nicht auch zur Generierung komplexer Terme einsetzen könnte.
Allerdings muss entweder das erste oder das zweite und dritte Argument instantiiert sein:
Das univ-Prädikat: =../2
- Das univ genannte Prädikat =../2 ermöglicht die Umwandlung eines komplexen Terms in eine Liste und umgekehrt.
- Der Funktor des komplexen Terms wird zum ersten Element der Liste.
- Das univ-Prädikat kann auch als Infixoperator verwendet werden.
Bildschirmausgabe: write_canonical/1 und write/1
Das Prädikat write_canonical/1 gibt die Struktur eines (zusammengesetzten Terms) auf dem Bildschirm aus:
Das Prädikat write/1 schreibt einen Term in der externen Notation auf den Bildschirm:
strukturierte Bildschirmausgabe: nl/0 und tab/1
Das Prädikat nl/0 erzeugt einen Zeilenumbruch und das Prädikat tab/1 erzeugt die angegebene Menge an Leerzeichen auf dem Bildschirm.
Ausgabe von Bäumen: pprint/1
In Kapitel 8 haben wir gesehen, wie man einen Ableitungsbaum als komplexen Prologterm repräsentieren kann:
Das Prädikat pprint/1 nimmt als Argument einen Baum in Prolog-Term-Notation und erzeugt dazu eine Ausgabe auf dem Bildschirm, die besser lesbar ist.
Operatoren – externe und interne Notation
Operatoren sind Prädikate, die eine zusätzliche nutzerfreundliche externe Notation erlauben:
interne Notation | nutzerfreundliche externe Notation |
---|---|
+(1,2) | 1+2 |
is(X,+(2,3)) | X is 2+3 |
+(8,-(2)) | 8 + -2 |
(4,1) | 4 > 1 |
==(a,a) | a == a |
=(X,a) | X = a |
Operatoren werden durch den Typ, die Priorität und die Assoziativität definiert.
Assoziativität von Operatoren
Die Assoziativität bestimmt die Klammerung der Argumente in einem Ausdruck mit mehreren Operatoren gleicher Präzedenz.
links-assoziative Operatoren fordern, dass ihr rechtes Argument eine kleinere Präzedenz hat (d.h. Prolog klammert den Ausdruck von links):
rechts-assoziative Operatoren fordern, dass ihr linkes Argument eine kleinere Präzedenz hat (d.h. Prolog klammert den Ausdruck von rechts):
nicht-assoziative Operatoren fordern, dass beide Argumente eine kleinere
Präzedenz haben (Prolog kann solche Ausdrücke nicht klammern):
Definition eines eigenen Operators
Definition eines neuen Infixoperators in, welcher testet ob etwas Element einer Liste ist (analog zum member/2-Prädikat).
Beispiel:

Typen von Operatoren
Der Typ eines Operators bestimmt ob der Operator vor, zwischen oder nach seinen Argumenten geschrieben wird.
- Infix-Operatoren wie =, <, is, +, \== usw. sind zweistellig und werden zwischen die Argumente geschrieben (3<4).
Bsp: x Op y - Präfix-Operatoren wie -, + usw. sind einstellig und werden vor das Argument geschrieben (z.B. -3).
Bsp: Op x - Postfix-Operatoren sind einstellig und werden hinter das Argument geschrieben.
Bsp: x Op
Präzedenz von Operatoren
- Die Präzedenz eines Operators legt fest, in welcher Reihenfolge die Operatoren binden.
- Der Operator mit der höchsten Präzedenz ist der Hauptoperator eines Ausdrucks. Beispiel:
- Operatoren geordnet nach absteigender Präzedenz:
Hinweis: einfache Terme und Terme in Klammern haben die Präzedenz 0. Die Präzedenz von komplexen Termen wird durch die Präzedenz des Hauptoperators bestimmt.
Definition eigener Operatoren
Eigene Operatoren können definiert werden:
- Praezedenz ∈ {1, ….1200}
- Typ (+Assoz) ∈
- {xfx, xfy, yfx} wenn f Infix ist,
- {fx, fy} wenn f Präfix ist,
- {xf , yf } wenn f Postfix ist
- x bedeutet das die Präzedenz dieses Arguments kleiner als die des Operators ist.
- y bedeutet das die Präzedenz dieses Arguments kleiner oder gleich der des Operators ist.
- Name: Name des Operators oder Liste von Operatornamen, die alle dieselbe Eigenschaft bekommen sollen.
yfx: links-assoziativ, xfy: rechts-assoziativ, xfx: nicht-assoziativ.
Definition bestehender Operatoren
Zusammenfassung Kapitel 9
- Wir haben verschiedene Prädikate zur Analyse vor zusammengesetzten Termen kennengelernt:
- functor/3
- arg/3
- =../2 (univ)
- Wir haben gesehen, wie wir verschiene Ausgaben auf dem Bildschirm erzeugen können und damit ein Prädikat pprint/1 zur Ausgabe von Bäumen definiert.
- write_canonical/1 und write/1
- nl/0 und tab/1
- Wir haben gesehen, wie Operatoren definiert werden und die zentralen Eigenschaften von Operatoren kennengelernt:
- Typ
- Präzedenz
- Assoziativität
- Keywords: functor/3, arg/3, =../2, pprint/1, Operatoren