Einführung in PROLOG III Rekursion

Ähnliche Dokumente
Prolog 3. Kapitel: Rekursion

Prolog 3. Kapitel: Rekursion

Rekursion. rekursive Prädikate. deklarative vs. prozedurale Bedeutung von Prädikaten. Programmierkurs Prolog p.1

PROLOG Syntax. Einführung in PROLOG II. Atome. Variablen. Es gibt vier Arten von Termen: Atome. Zahlen. Variablen. Komplexe Terme

Rekursive Listenverarbeitung

Einführung in PROLOG IV Listen

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

Logische Programmierung

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

Einführung in PROLOG

Prolog basiert auf Prädikatenlogik

Reihenfolge von Klauseln

1. Grundkonzepte der logischen Programmierung 2. Syntax von Prolog 3. Rechnen in Prolog. IV.1 Grundkonzepte der logischen Programmierung - 1 -

Path Finding with Prolog. AAI Projekt Thien-An Bui und Marlene Wittwer FHNW Brugg-Windisch, HS 2014

LISTEN. Programmierkurs Prolog p.1

Übungen zu Kognitive Systeme I

Teil 4: Rekursion und Listen

Künstliche Intelligenz Einführung in Prolog

Grundlagen von Datenbanken

Prolog als Datenbanksprache - Idee

2. Imperative Programmierung und Berechenbarkeit - Registermaschinen -

Logisches und funktionales Programmieren

5 Logische Programmierung

Rekursive Funktionen (1)

Bachelor Grundlagen der Logik und Logikprogrammierung 12. Februar

Rekursive Funktionen (1)

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

Programmiersprache Prolog

Einführung in PROLOG. Christian Stocker

Logische und funktionale Programmierung

Denkübungen Zeit: 58 Min. Name des Kandidaten:

Inhalt. PROLOG-1A: Mathematik? PROLOG-1B: Aussagen. PROLOG-2: Mengen, Funktionen. PROLOG-3A: Mathematik in Semestern 1+2

SS2010 BAI2-LBP Gruppe 1 Team 07 Entwurf zu Aufgabe 4. R. C. Ladiges, D. Fast 10. Juni 2010

Logische Programmierung

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

DataLog. Datenbank-Programmiersprache für deduktive Datenbanken. Proseminar Programmierparadigmen und Sprachen. Nico Braunisch

SWP Logische Programme

Prolog 4. Kapitel: Listen

Kapitel 3. Natürliche Zahlen und vollständige Induktion

Futur II. NIVEAU NUMMER SPRACHE Mittelstufe B2_1032G_DE Deutsch

Program = Logic + Control

Multiplikation langer Zahlen

Fakten, Regeln und Anfragen

Deduktives Lernen Explanation-Based Learning

2. Übungsblatt Abgabe spätestens in der Vorlesung/Übung am

Grundlagen der Logik und Logik-Programmierung

Maple-Praktikum für Lehramt Blatt 3 Dieses Blatt wird in Kalenderwoche 18 (ab 30. April) testiert.

Strukturelle Rekursion und Induktion

Einführung in PROLOG 7 Kontextfreie Grammatiken

(Logik und) Logikprogrammierung

Einführung in Prolog. Simon Bischof. IPD Snelting

Aussagenlogik Prädikatenlogik erster Stufe. Logik. Logik

Übung: Aktuelle Lebensbereiche bewerten & konkrete Verbesserungspotentiale für deine. Lebensqualität entdecken

Komplexitätstheorie NP-Vollständigkeit: Reduktionen (2) Der Satz von Cook/Levin

Logikprogrammierung. Berechnung durch Resolution Die Programmiersprache Prolog

Logische und funktionale Programmierung

5. 7. Brüche und Dezimalzahlen. Mathematik. Das 3-fache Training für bessere Noten: Klasse. Klasse

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

Grundlagen der Logik und Logik-Programmierung

Theorembeweiser und ihre Anwendungen

Rekursive Programmiertechniken. Einfachste Rekursion mit Babuschka. Hyponymie: Unterbegriffshierarchie. Linksrekursion mit Babuschka

Knowledge-Based system. Inference Engine. Prof. Dr. T. Nouri.

Prolog = Programmierung in Logik (Roussell, Colmerauer, 1973/74)

Inhalt. 1 Mathematik? 2 PROLOG-1: Aussagen und Mengen. 3 PROLOG-2: Funktionen. 4 PROLOG-3: Zahlenmengen und vollständige Induktion

Übungen zu Logik und Künstliche Intelligenz Blatt 8

Cut und Negation. Heute: if-then-else. Negation. Programmierkurs Prolog p.1

Vorschlag informeller Test zu den Themen Die Grundlagen der Erde sowie Orientierung und Karten

Prolog 1. Kapitel: Fakten, Regeln und Anfragen

Computergrundlagen Programmiersprachen, Interpreter, Compiler, Linker

7 Das Zählen von Objekten. Themen: Teile und Herrsche Zählen durch Bijektion

Computergrundlagen Programmiersprachen, Interpreter, Compiler, Linker

Transkript:

Einführung in PROLOG III Rekursion Betrachten wir die folgende Knowledge Base: teurer(x,y):- kostet_etwas_mehr(x,y). teurer(x,y):- kostet_etwas_mehr(x,z), teurer(z,y). kostet_etwas_mehr(big_mac,pommes). kostet_etwas_mehr(doener,big_mac). Prädikate (hier teurer) können rekursiv auch definiert werden. Betrachten wir die deklarative und die prozedurale Bedeutung dieser Regel. Deklarativ (Was es aussagt): Erste Regel: Wenn X etwas mehr als Y kostet, dann ist X teurer als Y Zweite Regel: Wenn X etwas mehr als Z kostet und Z teurer als Y ist, dann ist X teurer als Y. Prozedural (Was wirklich passiert): Die erste Regel (Die Basisklausel) ist klar Die zweite Regel gibt PROLOG eine alternative Strategie, um herauszufinden, ob X teurer ist als Y: Versuche ein Z zu finden, so dass X etwas mehr als Z kostet, und Z teurer als Y ist. Das heißt, Prolog zerlegt das Problem in zwei Teilprobleme. Schauen wir uns an, was PROLOG mit folgender Query macht:?- teurer(doener,pommes). Zuerst versucht PROLOG die erste Regel anzuwenden. X wird mit doener und Y mit pommes gleichgesetzt, wodurch wir folgendes goal erhalten: kostet_etwas_mehr(doener,pommes). Aber die Knowledge Bas enthält diese Information nicht. Also versucht PROLOG die zweite Regel und erhält folgendes goal: kostet_etwas_mehr(doener, Z), teurer(z, pommes). Beim Blick in die Knowledge Base wird Z mit big_mac instanziiert, so dass der erste Teil erfüllt ist. Die erste Regel reduziert den zweiten Teil auf: teurer(big_mac,pommes). Und das ist ein Fakt in der Knowledge Base. Es ist einleuchtend, dass man beim Schreiben eines rekursiven Prädikates immer wenigstens zwei Klauseln benötigt: Eine Basisklausel, die die Rekursion beenden kann, und eine, die die Rekursion enthält.

Beispiel Nachkomme Da wir jetzt wissen, was Rekursion für PROLOG bedeutet, betrachten wir jetzt, warum Rekursion so wichtig ist. Betrachten wir folgende Knowledge Base: kind(jan,alfred). kind(jonathan,jan). Wenn wir jetzt die Beziehung Nachkomme definieren wollen, können wir das nicht-rekursiv tun: kind(x,y). kind(x,z), kind(z,y). Wenn wir aber mehr als zwei Generationen betrachten wollten, müssten wir immer weitere Regeln anhängen, daher bietet sich die rekursive Version an : kind(x,y). kind(x,z), nachkomme(z,y).

Beispiel Sukzessor Es gibt verschieden Arten Zahlen zu schreiben. Eine begegnet uns in der Logik: 1. 0 ist eine Zahl 2. Wenn X eine Zahl ist, dann auch succ(x). Succ steht für Sukzessor, also ist succ(x) die Zahl, die man erhält, wenn man zu X Eins addiert. Diese Definition wird zu einem PROLOG-Programm mit folgender Knowledge Base: zahl(0). zahl(succ(x)):-zahl(x). Natürlich ergibt die Query?- zahl (succ(succ(succ(0)))). Ein yes. Aber interessanter ist:?- zahl(x). Also: Zeig mir einige Zahlen! ergibt: X = 0 ; X = succ(0) ; X = succ(succ(0)) ; X = succ(succ(succ(0))) ; X = succ(succ(succ(succ(0)))) ; X = succ(succ(succ(succ(succ(0))))) ; X = succ(succ(succ(succ(succ(succ(0)))))) ; X = succ(succ(succ(succ(succ(succ(succ(0))))))) PROLOG zählt auf eine besondere Art und Weise, indem es Zahlen mithilfe von matching konstruiert. Vorsicht! Es ist wichtig, zu verstehen, wie PROLOG vorgeht, indem es versucht Queries zu beantworten. Was passiert z.b., wenn wir obige Knowledge Base in folgener Form schreiben: zahl(succ(x)):-zahl(x). zahl(0). Und dann die Querie?- zahl(x). starten?

Übungen: 1. Betrachten wir folgende Knowledge Base: bigger(cat,mouse). bigger(dog,cat). bigger(sheep,dog). bigger(horse,sheep). bigger(elephant,horse). Schreiben Sie ein rekursives Prädikat biggerthan/2 welches alle Größer-Als - Beziehungen zwischen den Tieren herausbekommt, dass also ein Elefant größer ist als eine Maus, usw. 2. Betrachten wir folgende Knowledge Base: directtrain(lueneburg,hamburg). directtrain(bremen,lueneburg). directtrain(braunschweig,hannover). directtrain(hannover,lueneburg). directtrain(hamburg,kiel). directtrain(magdeburg,braunschweig). directtrain(berlin,magdeburg). Sie enthält Informationen über direkte Zugverbindungen. Natürlich kann man auch reisen, indem man mehrere Züge hintereinander nimmt. Schreiben Sie ein rekursives Prädikat travelbetween/2 welches uns mitteilt, ob man zwischen zwei Orten fahren kann. Zum Beispiel sollte die Querie: `yes' ergeben. travelbetween(berlin,hamburg). Gehen wir jetzt davon aus, dass eine Verbindung von A nach B auch eine Verbindung von B nach A bedeutet. Ergänzen Sie eine Rule, die dieses ermöglicht, und testen Sie sie mit der Querie: travelbetween(hamburg,berlin). 3. Betrachten wir folgende Knowledge Base: bycar(auckland,hamilton). bycar(hamilton,raglan). bycar(valmont,saarbruecken). bycar(valmont,metz). bytrain(metz,frankfurt). bytrain(saarbruecken,frankfurt).

bytrain(metz,paris). bytrain(saarbruecken,paris). byplane(frankfurt,bangkok). byplane(frankfurt,singapore). byplane(paris,losangeles). byplane(bangkok,auckland). byplane(losangeles,auckland). Schreibe Sie ein Prädikat travel/2, welches herausfindet, ob es möglich ist von einem Ort zum anderen zu reisen, indem man Auto, Zug oder Flugzeug nimmt. Zum Beispiel sollte `yes' auf die Querie travel(valmont,raglan) geliefert werden. travel/2 sagt uns also, dass es möglich ist, von Vamont nach Raglan zu reisen. Schreiben Sie ein Prädikat travel/3, welches die exakte Route angibt. Auf die Querie travel(valmont,paris,go(valmont,metz,go(metz,paris))) sollte also yes und X = go(valmont,metz,go(metz,paris,go(paris,losangeles))) auf die Querie travel(valmont,losangeles,x). folgen Erweitern Sie travel/3 so, dass sie nicht nur die Route liefert, sondern auch wie von einem Ort zum anderen gereist wird, also car, train, plane.