Logische und funktionale Programmierung Vorlesung 8: Arithmetik, Listenprädikate, weitere Prolog Prädikate Babeş-Bolyai Universität, Department für Informatik, Cluj-Napoca csacarea@cs.ubbcluj.ro 1/67
ARITHMETIK IN PROLOG Die meisten Prologimplementierungen stellen Operatoren zur Verarbeitung von Zahlen zur Verfügung. Hierzu gehören die arithmetischen Operatoren + (Addition), - (Subtraktion), * (Multiplikation), / (Division), // (ganzzahlige Division), mod (modulo) und ˆ (Exponent). Alle Operatoren können auch als Funktoren verwendet werden: Statt 3+4 kann man auch +(3,4) schreiben. Die verwendeten Symbole für die Operatoren hängen von dem jeweiligen Prolog-Interpreter ab (hier angegeben für SWI-Prolog). Vorsicht: Arithmetische Operationen gehören nicht zu den Kernkonzepten von Prolog. Mit ihnen verlässt man das auf Unifikation basierende Grundprinzip der deklarativen Programmierung. 2/67
RECHNEN IN PROLOG 3/67
ARITHMETISCHE OPERATOREN UND DIE EVALUATION 4/67
DER EVALUATIONSOPERATOR IS/2 5/67
VERGLEICH IS/2 MIT NORMALEN PROLOGPRÄDIKATEN 6/67
ARITHMETISCHE VERGLEICHOPERATOREN 7/67
EVALUATION ERZWINGENDE OPERATOREN IN PRÄDIKATSDEFINITIONEN 8/67
LISTENLÄNGE BESTIMMEN OHNE AKKUMULATOR 9/67
TRACE: LISTENLÄNGE OHNE AKKUMULATOR 10/67
LISTENLÄNGE BESTIMMEN MIT AKKUMULATOR 11/67
TRACE: LISTENLÄNGE MIT AKKUMULATOR 12/67
VERGLEICH LÄNGE MIT UND OHNE AKKUMULATOR 13/67
MAXIMALES LISTENELEMENT BESTIMMEN MIT AKKUMULATOR 14/67
MAXIMALES LISTENELEMENT BESTIMMEN OHNE AKKUMULATOR 15/67
AKKUMULATOREN: STRUKTUR DER PROGRAMME 16/67
ZUSAMMENFASSUNG Keywords: Rechnen in Prolog mit dem Evaluationsoperator is, arithmetische Vergleichsoperatoren, Akkumulatoren. Wichtig: Die rekursive Verarbeitung von Listen mit Akkumulatoren ist eine zentrale Programmiertechnik in Prolog. Vorsicht: Die arithmetischen Vergleichsoperatoren und der Operator is fordern zwingend sofort evaluierbare Terme. Uninstantiierte Terme führen zu einem Abbruch mit Fehlermeldung. 17/67
WIEDERHOLUNG 18/67
WIEDERHOLUNG KONKATENATION VON LISTEN: APPEND/3 19/67
APPEND/3 DEKLARATIV 20/67
APPEND/3 PROZEDURAL 21/67
VERWENDUNG VON APPEND/3 22/67
BESONDERHEITEN VON APPEND/3 Mit dem Prädikat append/3 können sehr unterschiedliche Funktionen implementiert werden. Dennoch muss man beachten, dass bei jedem Aufruf von append/3 die Liste im ersten Argument komplett abgearbeitet werden muss. aufgrund der kompletten Listenabarbeitung Programme mit vielen Aufrufen von append/3 sehr schnell ineffizient werden können. Man sollte also bei der Verwendung von append/3 in rekursiven Prädikaten vorsichtig sein. 23/67
SUFFIXE, PRÄFIXE UND ALLGEMEINE SUBLISTEN: PREFIX/2, SUFFIX/2, SUBLIST/2 24/67
SUFFIXE, PRÄFIXE UND ALLGEMEINE SUBLISTEN: PREFIX/2, SUFFIX/2, SUBLIST/2 25/67
SUFFIXE, PRÄFIXE UND ALLGEMEINE SUBLISTEN: PREFIX/2, SUFFIX/2, SUBLIST/2 26/67
LÖSCHEN EINES ELEMENTS: DELETE/3 27/67
UMDREHEN VON LISTEN: NAIVEREV/2 (NAIVE DEFINITION) 28/67
WARUM NAIVES REVERSE? Das naive naiverev/2 wird naiv genannt, weil das zu lösende Problem eigentlich mit linearer Laufzeit gelöst werden könnte. Das naive naiverev/2 benötigt jedoch durch den Einsatz von append/3 kubische Laufzeit. Betrachte den Trace von naiverev([a,b,c,d],x). 29/67
REVERSE/2 MIT AKKUMULATOR 30/67
REVERSE/2 PROZEDURAL 31/67
LISTENVERARBEITUNG MIT AKKUMULATORLISTE 32/67
DIFFERENZLISTEN 33/67
BEISPIEL: [1,2,3] ALS DIFFERENZLISTE 34/67
VORTEIL VON DIFFERENZLISTEN: KONKATENATION IN EINEM SCHRITT 35/67
VORTEIL VON DIFFERENZLISTEN: KONKATENATION IN EINEM SCHRITT 36/67
VORTEIL VON DIFFERENZLISTEN: KONKATENATION IN EINEM SCHRITT 37/67
VORTEIL VON DIFFERENZLISTEN: KONKATENATION IN EINEM SCHRITT 38/67
VORTEIL VON DIFFERENZLISTEN: KONKATENATION IN EINEM SCHRITT 39/67
VORTEIL VON DIFFERENZLISTEN: KONKATENATION IN EINEM SCHRITT 40/67
VORTEIL VON DIFFERENZLISTEN: KONKATENATION IN EINEM SCHRITT 41/67
VORTEIL VON DIFFERENZLISTEN: KONKATENATION IN EINEM SCHRITT 42/67
WIEDERHOLUNG TERME 43/67
ZUSAMMENGESETZTE BZW. KOMPLEXE TERME 44/67
WIEDERHOLUNG: BESONDERE TERME LISTEN UND ARITHMETISCHE AUSDRÜCKE 45/67
WIEDERHOLUNG: MATCHING-/ UNIFIKATIONSOPERATOR 46/67
WIEDERHOLUNG: ARITHMETISCHER GLEICHHEITSOPERATOR 47/67
Vergleich von Termen 48/67
BERSICHT MATCHING- UND VERGLEICHSOPERATOREN 49/67
ANALYSE VON NICHT ZUSAMMENGESETZTEN TERMEN 50/67
ANALYSE ZUSAMMENGESETZTER TERME 51/67
DAS PRÄDIKAT: FUNCTOR/3 52/67
DAS PRÄDIKAT: FUNCTOR/3 53/67
TESTEN OB EIN TERM ZUSAMMENGESETZT IST 54/67
DAS PRÄDIKAT: ARG/3 55/67
DAS UNIV-PRÄDIKAT: =../2 56/67
BILDSCHIRMAUSGABE: WRITE CANONICAL/1 UND WRITE/1 57/67
STRUKTURIERTE BILDSCHIRMAUSGABE: NL/0 UND TAB/1 58/67
OPERATOREN EXTERNE UND INTERNE NOTATION 59/67
TYPEN VON OPERATOREN 60/67
PRÄZEDENZ VON OPERATOREN 61/67
ASSOZIATIVITÄT VON OPERATOREN 62/67
DEFINITION EIGENER OPERATOREN 63/67
DEFINITION BESTEHENDER OPERATOREN 64/67
BEISPIEL: ZWEI VERSCHIEDENE OPERATOREN 65/67
BEISPIEL 66/67
DEFINITION EINES EIGENEN OPERATORS 67/67