Teil 4: Rekursion und Listen

Ähnliche Dokumente
Einführung in das Programmieren Prolog Sommersemester Teil 2: Arithmetik. Version 1.0

Rekursive Listenverarbeitung

Listen. bersicht. Zweck. Listen allgemein Listen in Prolog. Programmiertechniken mit Listen. Erstellen von Prolog-Programmen mit Listen

Reihenfolge von Klauseln

26 Hierarchisch strukturierte Daten

Expertensysteme Sprachverarbeitung Symbolische Informationsverarbeitung Graphentheoretische Probleme Planungsprobleme Rapid Prototyping...

Kapitel 12: Induktive

Fragen zum Nachdenken: Wie könnte man das Fehlen eines Attribut-Wertes interpretieren?

Logische Programmierung

Einführung in PROLOG IV Listen

2 Logikprogrammierung am Beispiel Prolog

Prolog 5. Kapitel: Arithmetik

Gliederung. Programmierparadigmen. Einführung in Prolog: Einführung in Prolog: Programmieren in Prolog. Einführung Syntax Regeln Listen Relationen

LISTEN. Programmierkurs Prolog p.1

Prolog 4. Kapitel: Listen

Künstliche Intelligenz Einführung in Prolog

Übung zu Grundlagen der Logik und Logik-Programmierung

Programmieren in Haskell Programmiermethodik

Prolog 3. Kapitel: Rekursion

Prolog 3. Kapitel: Rekursion

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Musterlösung zur 2. Aufgabe der 4. Übung

Auswahl von Klauseln und Atomen in Prolog

Gliederung. Algorithmen und Datenstrukturen I. Listen in Haskell: Listen in Haskell: Listen in Haskell. Datentyp Liste Strings Listenkomprehension

Methoden zur Interpretation LISPähnlicher. Programmiersprachen. Seminarvortrag / 53 FH AACHEN FACHBEREICH 9 TOBIAS STUMM MATR.-NR.

6. Verkettete Strukturen: Listen

Informatik für Schüler, Foliensatz 18 Rekursion

Prolog Tutorial Norbert E. Fuchs Institut für Informatik Universität Zürich

PROLOG. Lernende Systeme WS 10/11 Crashkurs. Martin Sticht Stephan Weller

Algorithmen & Datenstrukturen Midterm Test 2

Einführung in die Funktionale Programmierung mit Haskell

Einführung in Prolog. Literatur

Kopf und Rest einer Liste (head and tail): Trennung durch. Listenkopf: kann mehrere Elemente umfassen

5 Logische Programmierung

Einführung in die Informatik I

Terme. Heute: Terme vergleichen. Struktur von Termen. Operatoren. Logik in der Praxis Logikprogrammierung (Prolog) p.1

Übungen zu Programmierung I - Blatt 8

Einführung in PROLOG. Christian Stocker

Vorlesung Datenstrukturen

Name und Syntax Was passiert? Anmerkungen / Erklärungen

Funktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS Prof. Dr. Margarita Esponda. Prof. Dr.

Künstliche Intelligenz Unifikation, Backtracking, Rekursion und Listen in Prolog

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Programmieren 1 C Überblick

Folgen und Funktionen in der Mathematik

Lösung: InfA - Übungsblatt 07

5. Übung - Kanalkodierung/Programmierung

Logische Programmierung Einführende Beispiele

Funktionale Programmierung ALP I. Die Natur rekursiver Funktionen SS Prof. Dr. Margarita Esponda. Prof. Dr.

3. Übungsblatt zu Algorithmen I im SoSe 2017

Datenstrukturen und Algorithmen

Fakten, Regeln und Anfragen

Grammatiken in Prolog

Logikprogrammierung und Prolog

Algorithmen & Programmierung. Rekursive Funktionen (1)

Fallstudie: Nim Spiel

Vorkurs Informatik WiSe 17/18

Unifikation. T eine Menge von Termen. σ(t) einelementig ist. Definition: Unifikator. Eine Substitution σ ist Unifikator von T, falls

Listen. M. Jakob. Gymnasium Pegnitz. 20. September Hinführung: Wartenschlangen. Grundprinzip von Listen Rekursion

Anwendungen der Logik: Deklarative bzw. Logik-Programmierung in PROLOG

Inhalt Kapitel 2: Rekursion

Listen. M. Jakob. 20. September Gymnasium Pegnitz

Prolog 2. Kapitel: Matching und Beweisführung

Rekursion. Sie wissen wie man Programme rekursiv entwickelt. Sie kennen typische Beispiele von rekursiven Algorithmen

Tutorium Prolog für Linguisten 8

Java: Eine kurze Einführung an Beispielen

Informatik I: Einführung in die Programmierung

Lösung Probeklausur Informatik I

Bestandteile von Prolog-Programmen. Syntax und Datenstrukturen. Legende Syntaxdiagramme. Lesen von Syntaxdiagrammen. Ein Programm besteht aus

Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen:

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 15 (Linearer Speicher, Listen, Bäume)

7. Syntax: Grammatiken, EBNF

Grundlagen von Datenbanken

Erwin Grüner

Bestandteile von Prolog-Programmen. Syntax und Datenstrukturen. Legende Syntaxdiagramme. Lesen von Syntaxdiagrammen

ADT: Verkettete Listen

Advanced Programming in C

Funktionale Programmierung ALP I. λ Kalkül WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Transkript:

Einführung in das Programmieren Prolog Sommersemester 2006 Teil 4: Rekursion und Listen Version 1.0

Gliederung der LV Teil 1: Ein motivierendes Beispiel Teil 2: Einführung und Grundkonzepte Syntax, Regeln, Unifikation, Abarbeitung Teil 3: Arithmetik Teil 4: Rekursion und Listen Teil 5: Programmfluß Negation, Cut Teil 6: Verschiedenes Ein-/Ausgabe, Programmierstil Teil 7: Wissensbasis Löschen und Hinzufügen von Klauseln Teil 8: Fortgeschrittene Techniken Metainterpreter, iterative Deepening, PTTP, Differenzlisten, doppelt verkettete Listen Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 1 c G. Grieser

Rekursion Rekursion ist wichtiges Konzept bei der Entwicklung von Programmen in Prolog Rekursion auch wichtiges Konzept generell in der Informatik und auch Mathematik Ähnlich der vollständigen Induktion in der Mathematik Prinzip der Rekursion Um ein komplexes Problem zu lösen, gib an 1. die Lösung für das einfachste Problem dieser Art und 2. eine Regel, um ein komplexes Problem in ein einfacheres Problem zu transformieren Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 2 c G. Grieser

Beispiel: Berechnung von n! rekursive Definition von n! In Prolog fakultaet(1,1). fakultaet(n, Result) :- N > 1, N1 is N-1, fakultaet(n1, Result1), Result is N * Result1. 1! = 1 n! = (n 1)! n für n > 1 Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 3 c G. Grieser

Listen eine Liste ist eine Aneinanderreihung beliebig vieler Elemente eine Liste ist eingeschlossen in eckigen Klammern Beispiele: [elefant, pferd, esel, hund] [a, X, [], f(x,y), 89, [w,e,r], aunt(x,hilde)] Elemente der Liste sind Terme Reihenfolge der Listenelemente ist wesentlich eine Liste kann selbst wieder Listen enthalten eine Liste ist ein Term Interne Repräsentation von Listen: Listen sind Terme mit dem Funktor. (Punkt) und dem speziellen Atom [ ] als ein Argument auf innerstem Niveau. Die eckigen Klammern sind nur eine schöne Notation. Intern entspricht die Liste [a, b, c] dem Term.(a,.(b,.(c, []))) Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 4 c G. Grieser

Head-Tail Notation Der zerlegt eine nicht leere Liste in den Kopf und die Restliste. [Kopf Rest] Vor dem können auch mehrere Elemente stehen [a [b, c]] = [a, b, c] [a, b [c]] = [a, b, c] [a, b, c []] = [a, b, c] Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 5 c G. Grieser

Einige Beispiele Stimmen die Gleichheiten? [b, a, d] = [d, a, b]. [a, b, d] = [X]. [a, [b, d]] = [a, b, d]. [a, b, c, d] = [A L]. [a, b, c, d] = [A, L]. [a, b, c, d] = [A, B L]. [[a, b], c, d] = [A L]. [a, b] = [A L]. [a, b] = [A, L]. [a] = [A, L]. [] = [A, L]. Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 6 c G. Grieser

Listen und Rekursion Listen sind rekursive Datenstrukturen: sind leer oder bestehen aus Kopf und Rest, der wieder Liste ist. Operationen über Listen werden auch rekursiv sein. Oft zwei Klauseln zu definieren; eine deckt den rekursiven Fall, die andere den Basisfall ab Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 7 c G. Grieser

Beispiele element(e,l) Teste of ein Element E schon in einer Liste L vorhanden ist. element(e, [E Rest]). element(e, [Kopf Rest]) :- element(e, Rest). Verwendungsmöglichkeiten 1. als Zugehörigkeitstest 2. zur Erzeugung aller Elemente einer Liste 3. Erzeugung von Listen, die bestimmtes Element enthalten Gibt es auch als Built-in Prädikat: member Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 8 c G. Grieser

Verketten von Listen append append(l1, L2, L3) gelingt, falls die Verkettung der Listen L1 und L2 dir Liste L3 ergibt. beispielhaftes Verhalten append([ ], L, L]). append([x L1], L2, [X L3]) :- append(l1, L2, L3). beispielhaftes Verhalten append([1,2], [3], [1,2,3])). Yes append([1,2], [3,4], L)). L = [1,2,3,4] append([1,2], L, [1,2,3,4,5])). L = [3,4,5] append(l, [4,5], [1,2,3,4,5])). L = [1,2,3] Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 9 c G. Grieser

Beispiel Ausgabe aller Elemente einer Liste show (Liste) :- element(element, Liste), write(element), nl, fail. Beachte: fail ist ein Standardprädikat, das immer fehlschlägt. Was geschieht bei folgender Eingabe? [elefant, pferd, esel, hund] Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 10 c G. Grieser

Beispiel?- show([elefant, pferd, esel, hund]). elefant pferd esel hund No. Das fail veranlaßt Backtracking Teilziel element(element, Liste) ist als einziges backtrackfähig Bei jedem Backtrack-Schritt wird neues Element der Liste mit Variable Element unifiziert. Wenn Liste vollständig abgearbeitet ist: Fehlschlag, No Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 11 c G. Grieser

Beispiele nextto(x,y,l) ist erfüllt, falls X und Y in Liste L nebeneinander liegen. nextto(x, Y, [X, Y ]). nextto(x, Y, [ L]) :- nextto(x, Y, L). Prädikat ungerade(l) überprüft, ob Anzahl Elemente in Liste L ungerade ist ungerade([ ]). ungerade(, L) :- ungerade(l). Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 12 c G. Grieser

Built-In-Prädikate für Listen is list, proper list last length append member, select, nth sublist reverse sort Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 13 c G. Grieser

Effizienzbetrachtungen Listen sind rekursive Datenstrukturen ihr allgemeiner Charakter und damit verbundene universelle Anwendbarkeit führt leicht zu uneffektiven Programmen. Wissen über interne Darstellung von Listen kann helfen, Ineffektivitäten zu vermeiden Zwei wichtige Techniken: Akkumulatoren und Differenzlisten Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 14 c G. Grieser

Akkumulatoren Oftmals sind Datenstrukturen zu durchforsten und ein bestimmtes Ergebis zu erzielen, berechnen,.. Akkumulatoren sind zusätzliche Argumente eines Prädikats, um Zwischenergebnisse zu speichern Beispiel Berechnung der Länge einer Liste laenge([ ],0). laenge([ T], N) :- laenge(t, N1), N is N1 + 1. Beim rekursiven Aufruf kein Zwischenergebnis bekannt Andere Möglichkeit: akkumuliere Antwort in jedem rekursiven Aufruf laenge(l,n) :- laenge(l, 0, N). laenge([ ], N, N). laenge([ T], A, N) :- A1 is A + 1, laenge(t,a1,n). Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 15 c G. Grieser

Sinnvolleres Beispiel: reverse Realisiere ein Prädikat reverse(liste,umgedrehteliste), das die Reihenfolge der Elemente einer Liste umdreht. Lösungsmöglichkeit 1. Kehrt man die leere Liste um, erhält man wieder die leere Liste 2. eine nichtleere Liste [X L1] kehrt man um, indem man L1 umkehrt und daran einelementige Liste [X] kettet. reverse([ ], [ ]). reverse([x L1], L2) :- reverse(l1, L3), append(l3, [X], L2). Problem: append muß jedes Mal die neue Liste durchlaufen und kopieren, um ein neues Element anzuhängen. Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 16 c G. Grieser

Sinnvolleres Beispiel: reverse bessere Lösung: mit Akkumulator: reverse(lin, Lout):- reverse(lin, [ ], Lout). reverse([ ], Bisher, Bisher). reverse([x L1], Bisher, L2) :- reverse(l1, [X Bisher], L2). Zusätzlicher Vorteil: tail recursion der Rekursionsabstieg findet im letzten Prädikat des Rumpfes statt der Compiler kann nun unter bestimmten Bedingungen den Stackframe der aktuellen Prozedur durch den neuen überschreiben Speicher- und Geschwindigkeitsgewinn Prolog Teil 4: Rekursion und Listen (V. 1.0) 4 17 c G. Grieser