Prolog-Kurs SomSem 2017 Daniel Beßler/Hagen Langer

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

Einführung in Prolog Copyright © 1999 by Michael Neumann
6. Regelbasierte Systeme
C Tutorium – Fehlerbehandlung – Knut Stolze. 2 Grundsatz Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! Jeder(!) Funktionsaufruf kann.
Programmieren in Logik
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,
Parallel Prolog SS Seminar Programmiersprachenkonzepte Vortrag von Zehra Öztürk am 17. Juni 2004.
Listen & Beweisstrategie
Rekursive Listenverarbeitung
Cut, Negation, Manipulation der Datenbasis
FH-Hof Einbindung von JavaScript Anweisungen
Logische Programmierung: Prolog
Java- Syntax.
Semantik von Prolog & Unifikation
Verschachtelte Listen, Differenzlisten, Graphen
Syntax von Prolog & Familiendatenbasis
Fakten, Regeln und Anfragen
Prof. Dr. T. Kudraß1 Relationenkalkül. Prof. Dr. T. Kudraß2 Relationenkalkül Zwei Ausprägungen: Tupelrelationenkalkül (TRK) und Domänenrelationenkalkül.
Imperative Programmierung
Grammatik als Deduktionssystem
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 (6) Wolfgang Friebel DESY Zeuthen.
Die Skriptsprache Perl (2) Wolfgang Friebel DESY Zeuthen.
Semantik und Pragmatik
Informatik 1 Übung 2.
Eine Einführung in Prolog und die logische Programmierung
Beweissysteme Hartmut Klauck Universität Frankfurt WS 06/
Einführung in PROLOG StD G. Noll f ( x ) f ( ) g ( ) g ( x ) barbara
© 2004 Pohlig - Taulien Explizite Typenumwandlung.
Dieser nicht Fehler finden Algorithmus enthält einfach einen gravierenden welcher zu ist.
Datentypen: integer, char, string, boolean
Agenda für heute, 7. April, 2005 Bedingte ProgrammausführungBedingte Programmausführung Algorithmische Grundlagen Vergleichsoperatoren, Wahrheitswerte.
Programmieren in C Grundlagen C 2
Hochschule Fulda – FB ET Sommersemester 2014
Programmieren in C Grundlagen C 2
11. Wissenbasis und Regelsysteme Sebastian Linek.
7. Formale Sprachen und Grammatiken
Kapitel 5Strukturen Information aus der realen Welt werden in einem informationsverarbeitenden System als Daten abgelegt. Diese stellen also eine (vereinfachte)
Grammatik als Deduktionssystem Theorie, Grammatik, Grammatiktheorie Grammatik Sprache Hypothese Sprachtheorie Theorie Erklärung Theoretisches Konstrukt.
Prof. Dr. Herbert Göttler, Dr. Peter Dauscher Johannes Gutenberg-Universität, Mainz Einführung in die Funktionsweise von.
Extended Pascal ( Erweitreung von Pascal) Name: Mehmet CELIK Matr :
Variablen und Datentypen
Dr. Wolfram Amme, Grundsätze der Logikprogrammierung, Informatik II, FSU Jena, SS Grundsätze der Logikprogrammierung.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
WISSENSREPRÄSENTATION IN ACTIVEMATH Theoretische Grundlagen – Teil 1.
Cut und Ablaufsteuerung Das Cut Goal mit Beispielen Negation als Failure Probleme mit Cut und Negation Das Cut Goal mit Beispielen Negation als Failure.
§8 Gruppen und Körper (8.1) Definition: Eine Gruppe G ist eine Menge zusammen mit einer Verknüpfung, die jedem Paar (a,b) von Elementen aus G ein weiteres.
Einführung in die Programmierung mit Java
Projektgruppe System- und Softwaretest
Hello World! Javakurs 2013 Arne Kappen
Datentypen: integer, char, string, boolean
Prolog-Kurs SomSem 2017 Daniel Beßler/Hagen Langer
Prolog-Kurs SomSem 2017 Daniel Beßler/Hagen Langer
Datentypen: integer, char, string, boolean
Logik in der Informatik II
Raphael Fischer Informatik II - Übung 03 Raphael Fischer
SS 04 Christiane Rauh Christian Hellinger
12 Das lineare Regressionsmodell
Logik in der Informatik IV
Die programmierte Lösung
Polymorphie Überladen
GRUNDLAGEN WISSENSCHAFTLICHEN ARBEITENS MODULA-2 SONAY SUBAYAZ
Übersicht und Benutzung von Sphinx
Implementieren von Klassen
Datentyp- umwandlung.
PGdP Tutorstunde 3 Gerald Mahlknecht Technische Universität München Informatik Zentralübung Donnerstags Nachbesprechung Samstags.
Explizite Typenumwandlung
The Programming Language Pascal
 Präsentation transkript:

Prolog-Kurs SomSem 2017 Daniel Beßler/Hagen Langer Prolog – Weitere Grundlagen 18.4.2017

Plan der Veranstaltung (1) Grundlagen der Prädikatenlogik (optional und Umfang je nach vorhandenen Vorkenntnissen) Prolog-Einführung Fakten und Regeln Rekursive Definitionen ‚Pure Prolog‘ und prozedurale Erweiterungen Spezielle Programmiertechniken (Differenzlisten etc.) Warren Abstract Machine (WAM)

Rückblick: Notationskonventionen Atome: a, b, a1, 'Hier ist alles erlaubt', ... Variablen: A, Abc, _, _3248, ... - “anonyme Variable”: _ Fakten: a(b,c), a(b), - N.B.: a/2 ist verschieden von a/1! b, b(b(c)), ...

Rückblick: Verwandtschaftsbeziehungen: /* Exemplarische Prolog-Wissensbasis */ kind_von(klaus, maria). % klaus ist kind von maria usw. kind_von(klaus, martin). weiblich(maria). männlich(klaus). männlich(martin).

Rückblick: Anfragen an eine Wissensbasis kind_von(klaus, maria). kind_von(klaus, martin). weiblich(maria). männlich(klaus). männlich(martin). ?- kind_von(X, Y). X = klaus, Y = maria; X = klaus, Y = martin; no 5

?- append([a],[b,c],[a,b,c,d]). no Rückblick: append ?- append([a,b],[c,d],X). X = [a,b,c,d] ?- append([a],[b,c],[a,b,c,d]). no append([],X,X). append([X|R],Y,[X|R2]) :- append(R,Y,R2). 6

append([X|R],Y,[X|R2]) :- append(R,Y,R2). Debugging mit trace append([],X,X). append([X|R],Y,[X|R2]) :- append(R,Y,R2). ?- trace, append([a,b],[c,d],X). Call: (7) append([a, b], [c, d], _G2284) Call: (8) append([b], [c, d], _G2419) Call: (9) append([], [c, d], _G2422) Exit: (9) append([], [c, d], [c, d]) Exit: (8) append([b], [c, d], [b, c, d]) Exit: (7) append([a, b], [c, d], [a, b, c, d]) X = [a, b, c, d]. 7

Debugging mit trace ?- trace, (X=a ; X=b), (Y=c ; Y=d). Call: (7) _G2270=a Exit: (7) a=a Call: (7) _G2279=c Exit: (7) c=c X = a, Y = c ; Call: (7) _G2279=d Exit: (7) d=d Y = d ; Call: (7) _G2270=b Exit: (7) b=b Call: (7) _G2279=c Exit: (7) c=c X = b, Y = c ; Call: (7) _G2279=d Exit: (7) d=d Y = d. 8

Term-Typen Prolog Terme: Variablen, Atome, Zahlen, komplexe Terme atom/1 Wahr für Atome integer/1 Wahr für ganze Zahlen float/1 Wahr für Fließkommazahlen number/1 Wahr für Zahlen atomic/1 Wahr für Konstanten (Atome und Zahlen) var/1 Wahr für ungebundene Variablen nonvar/1 Wahr für gebundene Variablen, Konstanten und komplexe Terme compound/1 Wahr für komplexe Terme ground/1 Wahr für Terme ohne ungebundene Variablen 9

?- compound(4) ; compound(a). Term-Typen ?- var(X) true. ?- var(a) ; var(7). false. ?- compound(4) ; compound(a). ?- compound(foo(bar)), compound(foo(A)). ?- nonvar(a(A)). ?- ground(a(A)). ?- atom(a), X = a, atom(X). true. ?- atom(7) ; atom(X). false. ?- atom(foo(bar,baz)). ?- atomic(a), atomic(8). ?- atomic(foo(bar,baz)). 10

Arithmetik ?- X = 3/2, compound(X), X = /(3,2), (X+3)*2 = *(+(X,3),2). ?- X is 3/2, is(X,/(3,2)), Y is (X+3)*2, number(Y). X = 1.5, Y = 9.0. ?- 6 is Y+3. ERROR: is/2: Arguments are not sufficiently instantiated 11

Vergleich von Termen = Wahr wenn Terme unifiziert werden können. \= Wahr wenn Terme nicht unifiziert werden können. == Wahr wenn Terme identisch sind. \== Wahr wenn Terme nicht identisch sind. =:= Wahr wenn Zahlen gleich sind. =\= Wahr wenn Zahlen ungleich sind. 12

Vergleich von Zahlen ?- accMax([3,4,2],0,Max). Max = 4 ; false. accMax([H|T],A,Max) :- (H > A, accMax(T,H,Max)) ; (H =< A, accMax(T,A,Max)). accMax([],A,A). ?- accMax([3,4,2],0,Max). Max = 4 ; false. max([X|Xs],Max) :- accMax(Xs,X,Max). Prolog Notation x < y X   <   Y. x ≤ y X  =<  Y. x = y X  =:=  Y. x ≥ y X  >=   Y. x > y X   >   Y. 13

Vergleich von Termen ?- a \== a. no ?- a \== b. yes ?- X \== a. ?- a == a, a == ’a’. yes ?- a == b. no ?- X==Y. ?- X=Y, X==Y. X = _2808 Y = _2808 ?-  a  \==  a. no ?-  a  \==  b. yes ?- X \== a. X = _3719 ?- X = (a == a), X = ==(a,a). X = (a==a). 14

?- .(a,.(b,.(f(d,e),[]))) == [a,b,f(d,e)]. Rückblick: Listen Prolog interne Repräsentation ?- [a,b,c,d] == [a|[b,c,d]]. yes ?- [a,b,c,d] == [a,b|[c,d]]. ?- [a,b,c,d] == [a,b,c|[d]]. ?- [a,b,c,d] == [a,b,c,d|[]]. ?- .(a,[]) == [a]. yes ?- .(f(d,e),[]) == [f(d,e)]. ?- .(a,.(b,[])) == [a,b]. ?- .(a,.(b,.(f(d,e),[]))) == [a,b,f(d,e)]. ?- .(.(a,[]),[]) == [[a]]. 15

Funktor und Stelligkeit von Termen ?- functor(f(a,b),F,A). A = 2 F = f ?- functor([a,b,c],X,Y). X = ’.’ Y = 2 ?- functor(a,F,A). A = 0 F = a Listen werden intern mit dem zweistelligen Funktor '.' (full stop) repräsentiert Konstanten sind Funktoren mit der Stelligkeit 0 compound(X):- nonvar(X), functor(X,_,A), A > 0. 16

Argumente von Termen arg(N,Term,Key):- Term =.. [_|Args], ?- arg(2,foo(bar,baz),X). X = baz ?- arg(2,foo(bar,X),baz). ?- arg(2,foo(bar),X). false. ?- foo(bar,baz) =.. X. (univ Operator) X = [foo, bar, baz] arg(N,Term,Key):- Term =.. [_|Args], member(Key,Args), nth1(N,Args,Key). 17

list([X|R]) :- list(R). Strings Listen: [a,b,c], [], [a,X,c], [a|X] [[a],b] list([]). list([X|R]) :- list(R). ?- S = "Robot". S = [82, 111, 98, 111, 116]. ?- atom_codes(’Vicky’,X). X = [86, 105, 99, 107, 121] ?- atom_codes(abc,X), append(X,X,L), atom_codes(N,L). X = [97, 98, 99] L = [97, 98, 99, 97, 98, 99] N = abcabc Strings werden von Prolog mit ASCII codes repräsentiert Atome sind keine strings aber können in strings umgewandelt werden 18

Eigenschaften Operatoren infix: Funktoren stehen zwischen den Argumenten (z.B. :-, -->, ;, =, =.., ==, ...) prefix: Funktoren stehen vor den Argumenten (z.B. ?-) postfix: Funktoren stehen hinter den Argumenten (z.B. ++) Präzendenz: Ausgedrückt durch Zahl zwischen 0 und 1200, eine größere Zahl steht für höhere Präzedenz (z.B. hat Unifikation eine höhere Präzedenz als arithmetische Operatoren) Operatoren mit gleicher Präzedenz → Klammerung von Termen (z.B. (2 =:= 3) == =:=(2,3)) Assoziativität: Richtung der Auswertung. Linksassoziativ: 'von links nach rechts'; Rechtsassoziativ: 'von rechts nach links'. 19

Operatoren syntaktisch definieren infix xfx , xfy , yfx prefix fx , fy suffix xf , yf xfx nicht-assoziativ xfy rechtsassoziativ yfx linksassoziativ Operatoren syntaktisch definieren :- op(Precedence,Type,Name). :- op(500, xf, dreams). dreams(raphael). ?- raphael dreams. true. f ist der Funktor, x und y die Argumente des Operators x → niedrigere Präzedenz y → niedrigere oder gleiche Präzedenz op definiert den Operator nur syntaktisch 20

Vordefinierte Operatoren :- op( 1200, xfx, [ :-, --> ]). :- op( 1200, fx, [ :-, ?- ]). :- op( 1100, xfy, [ ; ]). :- op( 1000, xfy, [ ’,’ ]). :- op( 700, xfx, [ =, is, =.., ==, \==, =:=, =\=, <, >, =<, >= ]). :- op( 500, yfx, [ +, -]). :- op( 500, fx, [ +, - ]). :- op( 300, xfx, [ mod ]). :- op( 200, xfy, [ ^ ]). 21

Unnötig: H=<A, da komplementär zu dem Ausdruck H>A accMax effizienz accMax([H|T],A,Max) :- (H > A, accMax(T,H,Max)) ; (H =< A, accMax(T,A,Max)). accMax([],A,A).. ?- accMax([3,4,2],0,Max). Max = 4 ; false. Unnötig: H=<A, da komplementär zu dem Ausdruck H>A Weiterer choicepoint durch logisches oder `;` Effizientere Inferenz durch “wegschneiden” des 2. Falls wenn H=<A gilt 22

Tracing accMax Max = 4 ; false. ?- trace, accMax([3,4,2],0,Max). accMax([H|T],A,Max) :- (H > A, accMax(T,H,Max)) ; (H =< A, accMax(T,A,Max)). accMax([],A,A).. ?- trace, accMax([3,4,2],0,Max). Call: (7) accMax([3, 4, 2], 0, _G2281) Call: (8) 3>0 Exit: (8) 3>0 Call: (8) accMax([4, 2], 3, _G2281) Call: (9) 4>3 Exit: (9) 4>3 Call: (9) accMax([2], 4, _G2281) Call: (10) 2>4 Fail: (10) 2>4 Redo: (9) accMax([2], 4, _G2281) Call: (10) 2=<4 Exit: (10) 2=<4 Call: (10) accMax([], 4, _G2281) Exit: (10) accMax([], 4, 4) Exit: (9) accMax([2], 4, 4) Exit: (8) accMax([4, 2], 3, 4) Exit: (7) accMax([3, 4, 2], 0, 4) Max = 4 ; Redo: (8) accMax([4, 2], 3, _G2281) Call: (9) 4=<3 Fail: (9) 4=<3 Fail: (8) accMax([4, 2], 3, _G2281) Redo: (7) accMax([3, 4, 2], 0, _G2281) Call: (8) 3=<0 Fail: (8) 3=<0 Fail: (7) accMax([3, 4, 2], 0, _G2281) false. 23

Lösung: Choicepoint “wegschneiden” mit cut Operator `!` Backtracking Cut Lösung: Choicepoint “wegschneiden” mit cut Operator `!` ?- trace, accMax2([3,4,2],0,Max). Call: (7) accMax2([3, 4, 2], 0, _G2281) Call: (8) 3>0 Exit: (8) 3>0 Call: (8) accMax2([4, 2], 3, _G2281) Call: (9) 4>3 Exit: (9) 4>3 Call: (9) accMax2([2], 4, _G2281) Call: (10) 2>4 Fail: (10) 2>4 Redo: (9) accMax2([2], 4, _G2281) Call: (10) accMax2([], 4, _G2281) Exit: (10) accMax2([], 4, 4) Exit: (9) accMax2([2], 4, 4) Exit: (8) accMax2([4, 2], 3, 4) Exit: (7) accMax2([3, 4, 2], 0, 4) Max = 4 . accMax2([H|T],A,Max) :- (H > A, !, accMax2(T,H,Max)) ; accMax2(T,A,Max). accMax2([],A,A). 24

Cut Operator schlägt nie fehl Kontrolle über Prolog backtracking max(X,Y,Y) :- X =< Y. max(X,Y,X) :- X>Y. max(X,Y,Y) :- X =< Y, !. max(X,Y,X) :- X>Y. Cut Operator schlägt nie fehl Kontrolle über Prolog backtracking Vorsicht: Relevante Lösungen nicht “wegschneiden” → cut nur benutzen wenn sicher ist das es keine weiteren Lösungen gibt 25

Unnötig: X>Y, da komplementär zu X=<Y Cut Operator Unnötig: X>Y, da komplementär zu X=<Y max(X,Y,Y) :- X =< Y, !. max(X,Y,X) :- X>Y. ?- max(2,3,2). false max(X,Y,Y) :- X =< Y, !. max(X,Y,X). ?- max(2,3,2). true Das war es noch nicht ganz, wegen Unifikation des 2. und 3. Arguments in der ersten Klausel matched nun die 2. Klausel 26

Lösung: Unifikation der Argumente nach cut Operator max(X,Y,Y) :- X =< Y, !. max(X,Y,X) :- X>Y. ?- max(2,3,2). false max(X,Y,Z) :- X =< Y, !, Y=Z. max(X,Y,X). ?- max(2,3,2). false 27