Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmentheorie 08 – Dynamische Programmierung (1)
Advertisements

der Universität Oldenburg
Projekt 5 Prolog - Programmieren mit Logik
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Forschungszentrum caesar
Zusammenfassung der Vorwoche
A.o.Univ.Prof. Dr. Franz Hörmann1 PROgramming in LOGic Von Alain Colmerauer in Marseille entwickelt (70er Jahre) Standardwerk Programming in Prolog (Clocksin/Mellish)
2. Programmstruktur – Teil 2
Programmieren in Logik
Künstlichen Intelligenz
10. Grundlagen imperativer Programmiersprachen
Listen [mia, vincent, jules, yolanda] [mia, robber(honey_bunny), X, 2, mia] [] [mia, [vincent, jules], [butch, girlfriend(butch)]] [[], dead(zed), [2,
Lösung 7.1 Syntax und Semantik
Listen & Beweisstrategie
Logische Programmierung: Prolog
Dateihandles Um in Perl eine bestimmte Datei zum Lesen, Schreiben oder Anhängen zu öffnen, benötigt man so genannte Dateihandles. Ein Dateihandle ist der.
Algorithmus. Ein Kochrezept, zum Beispiel: Kartoffelbrei.
C- Syntax. Bestandteile der Sprache C: Ausdrücke Anweisungen.
REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen.
Java- Syntax.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Vorlesung Informatik 3 Einführung in die Theoretische Informatik (17 –Turingmaschinen) Prof. Dr. Th. Ottmann.
Robotik mit LEGO Mindstorms
Semantik von Prolog & Unifikation
Syntax von Prolog & Familiendatenbasis
Fakten, Regeln und Anfragen
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Günter Kniesel Advanced Prolog. 2 Bisher: Grundlagen Klauseln –Regeln –Fakten Terme –Die einzige Datenstruktur in Prolog –Listen als Sonderfall mit eigener.
Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Einführung in die Programmiersprache C 1
Dateien Datei = File (engl.) Mögliche Inhalte einer Datei
Grundlagen der Programmierung
Entwicklung der Programmiersprachen
BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 11.Sitzung WS 02/03.
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
Historische Entwicklung und ihre Einteilung
2.4 Rekursion Klassifikation und Beispiele
Konzept einer Programmiersprache!
Programmieren in C Einführung
Eine rein funktionale Sprache
Programmiersprachen Proseminar Grundlagen wissenschaftlichen Arbeitens
Einführung in PROLOG StD G. Noll f ( x ) f ( ) g ( ) g ( x ) barbara
Algorithmen und Datenstrukturen SS 2005
Dynamische Webseiten-Generierung
Einführung in PHP.
Dieser nicht Fehler finden Algorithmus enthält einfach einen gravierenden welcher zu ist.
MODULA-2.
Agenda für heute, 7. April, 2005 Bedingte ProgrammausführungBedingte Programmausführung Algorithmische Grundlagen Vergleichsoperatoren, Wahrheitswerte.
3. Lineare Befehle 3.1 Die Ausgabefunktion
Programmieren in C Grundlagen C 2
PHP: Operatoren und Kontrollstrukturen
Hochschule Fulda – FB ET Sommersemester 2014
Programmieren in C Grundlagen C 2
11. Wissenbasis und Regelsysteme Sebastian Linek.
1 Tagesüberblick 4 Lösung Hausaufgabe/Fragen Mustervergleiche.
Einführung in die logische Programmierung mit PROLOG
7. Formale Sprachen und Grammatiken
1 Tagesüberblick 5 Lösung Hausaufgabe/Fragen Assoziative Felder Funktionen zu Variablenbehandlung.
Anführungszeichen?! echo 'Apfel$atf'; // ergibt: Apfel$aft
(Syntax, Strings/Zahlen, Variablen, Arrays)
Delphi Chars und Strings
Pool Informatik, Sj 11/12 GZG FN W.Seyboldt 1 Pool Informatik 5 GZG FN Sj. 11/12 Kopieren, Daten, Programme.
Sprachen und Programmiersprachen
Dr. Wolfram Amme, Semantik funktionaler Programme, Informatik II, FSU Jena, SS Semantik funktionaler Programme.
Datentypen: integer, char, string, boolean
Datentypen: integer, char, string, boolean
REKURSION + ITERATION.
 Präsentation transkript:

Einführung in Prolog Copyright © 1999 by Michael Neumann (neumann@s-direktnet.de)

Für was steht PROLOG? PROLOG PROgramming in LOGic

Anwendungsgebiete Expertensystem (Diagnosesystem) Relationale Datenbanken mathematische Logik abstrakte Problemlösungen Simulieren des menschlichen Sprachverstehens automatischer Entwurf Lösung von symbolischen Gleichungen Analyse biochemischer Strukturen zahlreiche Gebiete der KI

Geschichte der Logischen Programmierung Die Geschichte der Logischen Programmierung ist nicht sehr lang. Die theoretischen Grundlagen wurden in den 70er Jahren erarbeitet. Der erste Prolog-Interpreter wurde 1972 von Alain Colmerauer in Marseilles geschrieben. Erst Anfang der 80er Jahre kamen die ersten kommerziellen Prolog-Interpreter auf den Markt. Durch die Wahl von PROLOG als Sprache der Rechner der 5. Generation bei einem jap. Forschungsprojekt gelang der weltweite Durchbruch.

Programmlängen-Vergleich Programmiersprache Fortran Cobol Ada PL/I C Pascal Basic MProlog Programmgröße in Quellseiten 36 25 24 22 20 19 9

Programmierparadigmen 4 Programmierparadigmen

1. Imperatives Programmieren Es wird beschrieben, WIE ein bestimmtes Problem gelöst werden soll. Assembler ADA BASIC C / C++ COBOL FORTRAN Java Modula PASCAL Perl PL/1 Simula Smalltalk und viele mehr...

2. Funktionales Programmieren Das Programm ist eine Folge von Funktionen. Lisp Logo Haskell ML Hope Scheme Concurrent Clean Erlang NESL Sisal Miranda

3. Deklaratives Programmieren Es wird beschrieben, WAS das Problem ist, nicht jedoch wie dieses zu lösen ist. Die Lösung muß der Computer finden. Prolog Goedel Escher Elf Mercury

4. Objektorientiertes Programmieren Wird in Verbindung mit den drei vorhergehenden Paradigmen verwendet. Imperativ: Funktional: Deklarativ: Smalltalk Java Eiffel C++ Object Pascal XLISP Haskell andere... Bestimmte Versionen von Prolog und andere... Nahezu alle neuen Programmiersprachen sind objektorientiert!

Das Prinzip von PROLOG Fakten Regeln Wissensbasis Fragen bilden Die gestellten Fragen werden aufgrund der Fakten und Regeln (Wissensbasis) durch die Prolog-Interferenzmaschine entweder als beweisbar (yes) oder als nicht beweisbar ausgewertet (no). Fragen

Fakten 1 Schreibweise in Prolog: Natürliche Bedeutung: Beispiele: Schreibweise in Prolog: Natürliche Bedeutung: ‘die Sonne scheint‘. es_regnet. wertvoll(gold). männlich(daniel). mag(john,mary). besitzt(john,gold). vater(hans, gabriel). Die Sonne scheint. Es regnet. Gold ist wertvoll. Daniel ist männlich. John mag Mary. John besitzt Gold. Hans ist der Vater von Gabriel.

Fakten 2 mag ( john, mary ) . Argumente Prädikat (Funktor) Die Reihenfolge von john und mary ist nicht egal, d.h. es ist ein Unterschied ob man mag(john,mary) oder mag(mary,john) schreibt. Ersteres könnte z.B. „John mag Mary“, das andere „Mary mag John“ bedeuten. mag ( john, mary ) . Argumente Prolog weiß nicht, was ein Fakt bedeutet. Deshalb muß man selber festlegen was z.B. mag(john,mary) bedeutet. Prädikat (Funktor) Anzahl d. Argumente = Stelligkeit Ein Fakt kann beliebig viele Argumente haben. Ein Fakt muß mit einem Punkt beendet werden. Ein Fakt muß mit einem Kleinbuchstabe oder ‘ beginnen.

Fakten 3 Ein Beispiel: besitzt(john, gold). besitzt(john, buch). eingegebene Fakten: Fragen an den Prolog-Interpreters: besitzt(john, gold). besitzt(john, buch). mag(john, mary). mag(joe, fisch). ?- besitzt(john,gold). yes ?- mag(joe, fleisch). no Um die Frage besitzt(john,gold) beantworten zu können, durchsucht Prolog die Wissensbasis von oben nach unten nach einem passenden Fakt, und wird in der 1. Zeile fündig. Darum antwortet Prolog mit yes was so viel wie „bewiesen“ bedeutet. Auf die Frage mag(joe,fleisch) antwortet Prolog mit no, was „nicht beweisbar“ bedeutet, da es keinen passenden Fakt finden kann.

Variablen besitzt(john, gold). besitzt(john, buch). mag(john, mary). Wissensbasis: besitzt(john, gold). besitzt(john, buch). mag(john, mary). mag(joe, fisch). Um festzustellen, was John besitzt, kann man die Frage besitzt(john,X) stellen. X ist dabei eine Variable. Prolog antwortet dabei mit folgendem: X = gold X = buch _ ist eine anonyme Variable. Bei dem Beispiel oben, würde _ anstatt X folgendes bedeuten: Besitzt John etwas? (Antwort: yes). Variablen beginnen mit einem Großbuchstaben oder Unterstrich .

Regeln 1 Regeln drücken die Abhängigkeit eines Faktums von einem oder mehreren anderen Fakten aus. Beispiel: Mary mag jeden, der Wein mag. mag(mary,X) :- mag(X,wein). Beispiel: X ist der Bruder von Y. bruder(X,Y) :- männlich(X), eltern(X,A,B), eltern(Y,A,B). X ist dann der Bruder von Y, wenn X männlich ist und X und Y die gleichen Eltern A und B haben.

Regeln 2 Die linke Seite (vor :- ) ist wahr, wenn die rechte Seite bewiesen werden kann. Ein Komma zwischen zwei Fakten auf der rechten Seite entspricht einer logischen UND-Verknüpfung. Ein Semikolon entspricht einer ODER-Verknüpfung. Es kann geklammert werden. Die UND- bzw. ODER-Verknüpfungen können auch bei Fragen angewendet werden. Mit not kann verneint werden. Die Regeln werden auch Horn-Klauseln genannt.

Arithmetik 1 Beispiel: Berechnen der Fakultät fak(0,1). fak(N,X) :- N > 0, M is N - 1, fak(M,Y), X is N * Y. FUNCTION fak(N : Integer) : Integer; BEGIN IF N = 0 THEN fak := 1 ELSE IF N > 0 THEN fak := N * fak(N-1); END; Pascal Aufruf: ?- fak(0,N). N = 1 ?- fak(6,N). N = 720

Arithmetik 2 fib(0,1). fib(1,1). Beispiel: Berechnen der Fibonacci Folge fib(0,1). fib(1,1). fib(N,X) :- N1 is N - 1, N2 is N - 2, fib(N1,X1), fib(N2,X2), X is X1 + X2. Aufruf: ?- fib(11,N). N = 144 ?- fib(4,N). N = 5

Arithmetik 3 + - * / Addition, Subtraktion, Multiplikation, Division mod Modulo // ^ Gleitzahl-Division, Potenzierung ( ) Priorität is Zuweisen eines arith. Ausdruckes > < größer, kleiner => =< größer gleich, kleiner gleich (zuerst = dann > !) =:= gleich (arithmetisch) =\= ungleich (arithmetisch) Infix: (4 + 1)*4 Postfix: *(4,+(4,1))

Elemente von Prolog 1. Atome: Atome fangen mit einem Kleinbuchstaben an oder bestehen aus Sonderzeichen. In ‘ eingeschlossene Zeichen oder Buchstaben sind auch Atome. Beispiele für Atome: blah123 --> ‘Hallo‘ 2. Variablen: Variablen beginnen mit einem Großbuchstaben oder einem Unterstricht. Beispiele für Variablen: Blah123 _123_hundert 3. Integer-Konstanten: z.B.: 1234 888888844

Listen 1 Listen werden durch eckige Klammern definiert. Listen können Elemente mit unterschiedlichen Typen aufnehmen. [ 1,2,3,4,5 ] [1 | [2 | [3 | [4]]]] [ vater, ‘Hallo‘, 1, 3, mag(john,mary) ] [ 1, [2,3,4], 5] verschachtelte Liste [] leere Liste [ Head | Tail ] = [ 1,2,3,4 ] Head = 1 Tail = [ 2,3,4 ] [ X, Y, Z ] = [ 1, 2, 3] X = 1 Y = 2 Z = 3 Unifizierung (Pattern-Matching)

Listen 2 list_length( [], 0 ). Bestimmen der Länge einer Liste: list_length( [], 0 ). list_length( [H | T], N ) :- list_length(T,M), N is M + 1. Prüfen ob Element in Liste vorhanden ist: member(E, [E|T]). member(E, [H|T) :- member(E,T). Zählen eines Elements einer Liste: count_element( [], Element, 0). count_element( [H|T], Element, Anzahl) :- H = Element, count_element(T, Element, X), Anzahl is X + 1. count_element(T, Element, Anzahl).

Listen 3 Zwei Listen verknüpfen: concat([], L, L). concat([H|T], L, [H|NeueListe] ) :- concat(T,L,NeueListe). Eine in “ eingeschlossene Zeichenkette, ist eine Liste aus Zeichen, ein String.

Strukturen (Zusammengesetzte Terme) zeitpunkt(datum(16,5,1999),uhrzeit(18,30)). zeitpunkt(16,5,1999,18,30). buch( autor(clocksin,mellish), titel(‘Programmieren in PROLOG‘) ). buch( clocksin, mellsih, ‘Programmieren in PROLOG‘ ). cd( band(metallica), titel(‘Load‘), dauer(67) ). cd( band(metallica), titel(‘Reload‘), dauer(72) ). ?- cd( band(metallica), titel(X), _ ). Gibt alle Titel von Metallica aus.

Beispiel für Backtracking maennlich( john ). maennlich( george ). ist_vater_von( george, mary ). ist_vater_von( george, john ). ist_vater_von( harry, sue ). ist_vater_von( edward, george ). ist_sohn_von(X,Y) :- ist_vater_von(Y,X), maennlich(X). ?- ist_sohn_von(X,Y). X = john Y = george X = george Y = edward Wenn ein Ziel (Goal) nicht erfüllt werden kann, dann wird der Fakt links neben dem Gescheitertem nach einem alternativen Ausgang geprüft.

SWI-Prolog 1 % ist ein Zeilenkommentar Starten einer Wissensbasis: Doppelklick auf Datei, oder consult(DATEI). im Interpreter eingeben, wobei DATEI z.B. für ‘C:/Prolog/x.pl‘ steht oder wenn x.pl geladen werden soll und sich im Standardverzeichnis befinden, dann reicht consult(x). Mit halt. wird der Interpreter beendet. Bei mehreren möglichen Ausgängen (siehe letzte Seite), wird nach jeder Ausgabe gewartet. Drücke ; (Semikolon) wenn der nächste Ausgang angezeigt werden soll, oder RETURN wenn nichts weiter angezeigt werden soll.

SWI-Prolog 2 read(X). Liest von der Tastatur (oder Datei) in X write(X). Schreibt X auf den Bildschirm (oder Datei). get(Ascii). Liest Zeichen von Tastatur (Datei) in Ascii. put(Ascii). Schreibt Zeichen Ascii auf Bildschirm (Datei). nl. Neue Zeile. tab(N). Schreibt N Leerzeichen. tell(DATEI). Öffnet Datei (überschreiben, erstellen). told(DATEI). Schließt Datei. append(DATEI). Öffnet Datei zum anhängen von Daten. true immer beweisbar fail nicht beweisbar

Programmbeispiele für funktionale Sprachen

fun iter (a,b) = if a <= b then (print(Int.toString(a*a)^" "); iter(a+1,b) ) else print "\n"; iter(1,10); fun iter 0 = "" | iter n = (iter(n-1); print(Int.toString(n*n)^" "); "\n"); print(iter 10); ML

Lisp (print "Hello World") (let ( (a 0) ) (while (< a 20) (princ a) (princ " ") (setq a (+ a 1)) ) Lisp

Copyright © 1999 by Michael Neumann Ende eMail neumann@s-direktnet.de Homepage http://www.s-direktnet.de/homepages/neumann/index.htm Copyright © 1999 by Michael Neumann