Built-In Prädikate Input/Output Nützliche Prädikate, die bereits in Prolog eingebaut sind Input/Output Komplexere Programme: 8 Damen Problem in Lösungsvarianten.

Slides:



Advertisements
Ähnliche Präsentationen
Einführung in Prolog Copyright © 1999 by Michael Neumann
Advertisements

Programmierung 1 - Repetitorium
Constraint Satisfaction Problems
Zusammenfassung der Vorwoche
Programmieren in Logik
Suche in Texten (Stringsuche )
Listen [mia, vincent, jules, yolanda] [mia, robber(honey_bunny), X, 2, mia] [] [mia, [vincent, jules], [butch, girlfriend(butch)]] [[], dead(zed), [2,
Listen & Beweisstrategie
Rekursive Listenverarbeitung
10 Streams JavaHS Merseburg WS 05/06 E/A - Ströme (Streams) in Java.
Sortierverfahren Richard Göbel.
Java: Dynamische Datentypen
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.
Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Bestimmung des Next-Arrays im KMP-Algorithmus
Semantik von Prolog & Unifikation
Verschachtelte Listen, Differenzlisten, Graphen
Syntax von Prolog & Familiendatenbasis
Perl-Grundlagen Teile der Präsentation von A. Grupp,
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
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
6 Folgen (Teil II - Datenstrukturen und Algorithmen)
Zusammenfassung Vorwoche
Günter Kniesel Advanced Prolog. 2 Bisher: Grundlagen Klauseln –Regeln –Fakten Terme –Die einzige Datenstruktur in Prolog –Listen als Sonderfall mit eigener.
Programmierung 1 - Repetitorium
Datenströme DVG Datenströme.
© 2005 Pohlig - Taulien Datenströme GK Informatik 1 Datenströme.
Wie macht man ein Sudoku? Transformations-Methode:
Kakuro Regeln und Strategien
Die Grundterminologie
Übungen zum Vortrag „Backtracking mit Heuristiken“
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
Algorithmen und Datenstrukturen SS 2005
Informatik II Grundlagen der Programmierung Programmieren in C Benutzerinteraktion / Ein- und Ausgabe Hochschule Fulda – FB ET Sommersemester
1 Tagesüberblick 2 Lösung Hausaufgabe/Fragen Datei- ein- und ausgabe Schleifen Vergleiche Wahrheit.
se_10_regulaere_ausdruecke.ppt1 Softwareengineering Reguläre Ausdrücke (regular expressions) Prof. Dr.-Ing. Axel Benz, Berlin School of Economics.
Das Traveling Salesman Problem (TSP)
1 Tagesüberblick 4 Lösung Hausaufgabe/Fragen Mustervergleiche.
Mehrfachausführungen Schleifen in VB 2010 ee. Programmidee: Der Anwender gibt eine Zahl ein, und das Programm gibt die Mehrfachen dieser Zahl aus (das.
1 Tagesüberblick 5 Lösung Hausaufgabe/Fragen Assoziative Felder Funktionen zu Variablenbehandlung.
Anführungszeichen?! echo 'Apfel$atf'; // ergibt: Apfel$aft
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Extended Pascal Erweiterung von Pascal shadi Behzadipour shadi Shadi behzadipour.
Sequenzen: Lineare Programme
Pool Informatik, Sj 11/12 GZG FN W.Seyboldt 1 Pool Informatik 5 GZG FN Sj. 11/12 Kopieren, Daten, Programme.
Benutzeranleitung für den JBFOne-Master der Fiducia & GAD IT AG
Vorstellen und Herleiten der Horner Schemas
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
TRUE und FALSE in C Der Wert 0 steht für FALSE Jeder von 0 verschiedene Wert steht für TRUE FALSE wird als 0 dargestellt TRUE wird als 1 dargestellt.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Besitzrechte. Datei- und Verzeichnis-Besitzer Dateien und Verzeichnisse gehören einem Benutzer und einer Gruppe Besitzer wird bei ls -l in der dritten.
Import java.util.*; Hilfsklassen, die man eigentlich immer braucht.
Schiller-Gymnasium Hof Manuel Friedrich StR Funktionale Modellierung © 2005 Manuel Friedrich - F 1 Signatur von Funktionen.
Konstruktoren.
Datentypen: integer, char, string, boolean
Prolog-Kurs SomSem 2017 Daniel Beßler/Hagen Langer
Datentypen: integer, char, string, boolean
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Arrays in C Ein Array ist eine Variable, die aus einer Anzahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Zufallszahlen in C erzeugen
Implementieren von Klassen
3. Die Datenstruktur Graph 3.2 Repräsentation von Graphen
Dieses Bild benutze ich gerne als Testbild, um den Beamer einzustellen und in eine geeignete Position vor der Kreidetafel zu bringen. Es folgen verschiedene.
Dieses Bild benutze ich gerne als Testbild, um den Beamer einzustellen und in eine geeignete Position vor der Kreidetafel zu bringen. Es folgen verschiedene.
Vorstellen und Herleiten der Horner Schemas
 Präsentation transkript:

Built-In Prädikate Input/Output Nützliche Prädikate, die bereits in Prolog eingebaut sind Input/Output Komplexere Programme: 8 Damen Problem in Lösungsvarianten Nützliche Prädikate, die bereits in Prolog eingebaut sind Input/Output Komplexere Programme: 8 Damen Problem in Lösungsvarianten

Acht Damen Problem Das Problem ist, acht Damen auf einem Schachbrett so anzuordnen, dass keine die andere bedroht. solution(Pos). Pos repräsentiert eine Losung. Das Problem ist, acht Damen auf einem Schachbrett so anzuordnen, dass keine die andere bedroht. solution(Pos). Pos repräsentiert eine Losung.

Acht Damen Problem Repräsentation der acht Damen auf dem Brett: Acht Objekte, wobei jedes eine Dame auf einem Feld des Schachbretts repräsentiert. Jedes Feld kann durch ein Paar von Koordinaten X,Y dargestellt werden. Die Koordinaten sind Integer zwischen 1 und 8. Im Programm schreiben wir X/Y. '/' steht hier nicht für Division sondern kombiniert die Koordinaten eines Feldes. Das Problem ist nun also, eine Liste zu finden wo keine Dame die andere bedroht [X1/Y1,X2/Y2,X3/Y3,X4/Y4,X5/Y5,X6/Y6,X7/Y7,X8/Y8 ] Repräsentation der acht Damen auf dem Brett: Acht Objekte, wobei jedes eine Dame auf einem Feld des Schachbretts repräsentiert. Jedes Feld kann durch ein Paar von Koordinaten X,Y dargestellt werden. Die Koordinaten sind Integer zwischen 1 und 8. Im Programm schreiben wir X/Y. '/' steht hier nicht für Division sondern kombiniert die Koordinaten eines Feldes. Das Problem ist nun also, eine Liste zu finden wo keine Dame die andere bedroht [X1/Y1,X2/Y2,X3/Y3,X4/Y4,X5/Y5,X6/Y6,X7/Y7,X8/Y8 ]

Acht Damen Problem Eine Dame bedroht die andere: vertikal, horizontal, diagonal nach oben, diagonal nach unten. Die Bedrohung ist symmetrisch wir können nach rechts auf dem Brett vorgehen. Ein Teil der Lösung kann schon in der Repräsentation der Lösung formuliert werden. Alle Damen müssen offensichtlich in verschiedenen Spalten sein, damit keine vertikale Bedrohung eintritt. Wir halten in der Datenrepräsentation die X Koordinate fest. [1/Y1,2/Y2,3/Y3,4/Y4,5/Y5,6/Y6,7/Y7,8/Y8 ] Eine Dame bedroht die andere: vertikal, horizontal, diagonal nach oben, diagonal nach unten. Die Bedrohung ist symmetrisch wir können nach rechts auf dem Brett vorgehen. Ein Teil der Lösung kann schon in der Repräsentation der Lösung formuliert werden. Alle Damen müssen offensichtlich in verschiedenen Spalten sein, damit keine vertikale Bedrohung eintritt. Wir halten in der Datenrepräsentation die X Koordinate fest. [1/Y1,2/Y2,3/Y3,4/Y4,5/Y5,6/Y6,7/Y7,8/Y8 ]

Acht Damen Problem Generalisierung zur Vereinfachung des Problems: finde die Lösung für 0-8 Damen. Das bedeutet die Liste der Damen kann 0 – 8 Objekte der Form X/Y enthalten. Fall1: Die Liste der Damen ist leer. Dies ist eine Lösung, da hier keine Dame die andere bedroht. Fall2: Die Liste ist nicht leer [X/Y|Others]. Die erste Dame steht also auf einem Feld X/Y und die anderen Damen stehen auf anderen Feldern, die in Others spezifiziert sind. Bedingungen einer Lösung: (a) Keine Bedrohung innerhalb der Liste Others, Others ist Lösung (b) X und Y sind integer zwischen 1 und 8 (c) Die Dame auf X/Y darf keine der Damen in Others bedrohen Generalisierung zur Vereinfachung des Problems: finde die Lösung für 0-8 Damen. Das bedeutet die Liste der Damen kann 0 – 8 Objekte der Form X/Y enthalten. Fall1: Die Liste der Damen ist leer. Dies ist eine Lösung, da hier keine Dame die andere bedroht. Fall2: Die Liste ist nicht leer [X/Y|Others]. Die erste Dame steht also auf einem Feld X/Y und die anderen Damen stehen auf anderen Feldern, die in Others spezifiziert sind. Bedingungen einer Lösung: (a) Keine Bedrohung innerhalb der Liste Others, Others ist Lösung (b) X und Y sind integer zwischen 1 und 8 (c) Die Dame auf X/Y darf keine der Damen in Others bedrohen

Acht Damen Problem Fall 1: solution([ ]). Fall 2: (a) Aufteilung des Problems durch rekursiven Aufruf. (b) Y muss member von [1,2,3,4,5,6,7,8] sein. X wird dadurch beschränkt, dass jede Lösung dem Template entsprechen muss, wo die X Koordinaten schon festgelegt sind. (c) Nicht-Bedrohung wird durch ein Prädikat noattack implementiert Fall 1: solution([ ]). Fall 2: (a) Aufteilung des Problems durch rekursiven Aufruf. (b) Y muss member von [1,2,3,4,5,6,7,8] sein. X wird dadurch beschränkt, dass jede Lösung dem Template entsprechen muss, wo die X Koordinaten schon festgelegt sind. (c) Nicht-Bedrohung wird durch ein Prädikat noattack implementiert

Acht Damen Problem Fall 2: solution(X/Y|Others]) :- solution(Others), member(Y,[1,2,3,4,5,6,7,8]),noattack(X/Y,Others). Bleibt: noattack Prädikat noattack(Q,QList). (1) Wenn QList leer ist, ist noattack erfüllt. Es gibt nur eine Dame auf dem Brett. (2) Wenn QList nicht leer ist, hat sie die Form [Q1|Qlist1] (a) Die Dame Q1 darf die Damen in QList1 nicht bedrohen (b) Die Dame Q darf nicht Q1 bedrohen und auch keine der Damen in Qlist1 Fall 2: solution(X/Y|Others]) :- solution(Others), member(Y,[1,2,3,4,5,6,7,8]),noattack(X/Y,Others). Bleibt: noattack Prädikat noattack(Q,QList). (1) Wenn QList leer ist, ist noattack erfüllt. Es gibt nur eine Dame auf dem Brett. (2) Wenn QList nicht leer ist, hat sie die Form [Q1|Qlist1] (a) Die Dame Q1 darf die Damen in QList1 nicht bedrohen (b) Die Dame Q darf nicht Q1 bedrohen und auch keine der Damen in Qlist1

Acht Damen Problem Implementation der Nichtbedrohung der Damen: X/Y und X1/Y1 horizontal, vertikal, diagonal vertikal: X Koordinaten müssen unterschiedlich sein, gewährleistet schon das Template horizontal: Y Koordinaten müssen unterschiedlich sein Y = = Y1 diagonal: weder aufwärts noch abwärts darf der Abstand der Felder in X Richtung gleich demjenigen in der Y Richtung sein. Y1 – Y == X1 – X aufwärts (X1–X positiv) Y1 -Y == X -X1 abwärts (X-X1 negativ) Implementation der Nichtbedrohung der Damen: X/Y und X1/Y1 horizontal, vertikal, diagonal vertikal: X Koordinaten müssen unterschiedlich sein, gewährleistet schon das Template horizontal: Y Koordinaten müssen unterschiedlich sein Y = = Y1 diagonal: weder aufwärts noch abwärts darf der Abstand der Felder in X Richtung gleich demjenigen in der Y Richtung sein. Y1 – Y == X1 – X aufwärts (X1–X positiv) Y1 -Y == X -X1 abwärts (X-X1 negativ)

Acht Damen Problem Komplette Lösung Variante 1: solution([]). solution([X/Y|Others]):- solution(Others), member(Y,[1,2,3,4,5,6,7,8]), noattack(X/Y,Others). noattack(_,[]). noattack(X/Y,[X1/Y1|RestOthers]):- Y=\Y1, Y1-Y =\= X1-X, %aufwärts diagonal Y1-Y =\= X-X1, %abwärts noattack(X/Y,RestOthers). Komplette Lösung Variante 1: solution([]). solution([X/Y|Others]):- solution(Others), member(Y,[1,2,3,4,5,6,7,8]), noattack(X/Y,Others). noattack(_,[]). noattack(X/Y,[X1/Y1|RestOthers]):- Y=\Y1, Y1-Y =\= X1-X, %aufwärts diagonal Y1-Y =\= X-X1, %abwärts noattack(X/Y,RestOthers).

Acht Damen Problem Komplette Lösung Variante 1: Hilfsprädikat: member(Item,[Item|Rest]). member(Item,[First|Rest]):- member(Item,Rest). Lösungstemplate: template([1/Y1,2/Y2,3/Y3,4/Y4,5/Y5,6/Y6,7/Y7,8/Y8]). Aufruf: ?- template(S),solution(S). S=[1/4,2/2,3/7,4/3,5/6,6/8,7/5,8/1] Komplette Lösung Variante 1: Hilfsprädikat: member(Item,[Item|Rest]). member(Item,[First|Rest]):- member(Item,Rest). Lösungstemplate: template([1/Y1,2/Y2,3/Y3,4/Y4,5/Y5,6/Y6,7/Y7,8/Y8]). Aufruf: ?- template(S),solution(S). S=[1/4,2/2,3/7,4/3,5/6,6/8,7/5,8/1]

Einbauprädikate Bestimmung des Termtyps: var(Term): yes falls der Term eine freie Variable ist nonvar(Term): yes falls nicht integer(Term): yes falls Term mit einer Integerzahl gebunden ist float(Term): yes falls Term mit einer Floatingpointzahl gebunden ist number(Term): yes falls Term entweder Integer oder Float atom(Term): yes falls Term ein Atom ist e.g. john 'John' string(Term):yes falls Term ein String ist (sehr ähnlich Atom, schnellere Verarbeitung, nicht für Standardprolog) atomic(Term): yes falls Term ein Atom, eine Zahl oder ein String ist Bestimmung des Termtyps: var(Term): yes falls der Term eine freie Variable ist nonvar(Term): yes falls nicht integer(Term): yes falls Term mit einer Integerzahl gebunden ist float(Term): yes falls Term mit einer Floatingpointzahl gebunden ist number(Term): yes falls Term entweder Integer oder Float atom(Term): yes falls Term ein Atom ist e.g. john 'John' string(Term):yes falls Term ein String ist (sehr ähnlich Atom, schnellere Verarbeitung, nicht für Standardprolog) atomic(Term): yes falls Term ein Atom, eine Zahl oder ein String ist

Einbauprädikate Termvergleich: Term1 == Term2: yes falls Term1 gleich mit Term2 Term1 == Term2: falls ungleich Term1 = Term2: yes falls Unifikation der Terme erfolgreich Term 1 = Term2: falls Unifikation nicht erfolgreich Termvergleich: Term1 == Term2: yes falls Term1 gleich mit Term2 Term1 == Term2: falls ungleich Term1 = Term2: yes falls Unifikation der Terme erfolgreich Term 1 = Term2: falls Unifikation nicht erfolgreich

Einbauprädikate Zahlenvergleich: between(Low,High,Value): Low und High sind ganze Zahlen und High >= Low. Wenn Value eine ganze Zahl ist wird getestet: Low =< Value =< High ?- between(1,3,X). X = 1 ;X = 2 ;X = 3 ; Wird High mit inf oder infinite angegeben, produziert das Prädikat Integerzahlen hochzählend von Low aus. Zahlenvergleich: between(Low,High,Value): Low und High sind ganze Zahlen und High >= Low. Wenn Value eine ganze Zahl ist wird getestet: Low =< Value =< High ?- between(1,3,X). X = 1 ;X = 2 ;X = 3 ; Wird High mit inf oder infinite angegeben, produziert das Prädikat Integerzahlen hochzählend von Low aus.

Einbauprädikate succ(Int1,Int2): true wenn Int2 = Int1 +1 und Int1 >= 0 plus(Int1,Int2,Int3): true wenn Int1+Int2 =:= Int3 Vergleichsoperatoren,= =,==, =:= Number is Expression: true wenn Number erfolgreich mit der ganzzahligen Auswertung von Expression unifiziert wird (Ausprobieren mit float Zahl?? X is 3/2 X =:= 1 ???) succ(Int1,Int2): true wenn Int2 = Int1 +1 und Int1 >= 0 plus(Int1,Int2,Int3): true wenn Int1+Int2 =:= Int3 Vergleichsoperatoren,= =,==, =:= Number is Expression: true wenn Number erfolgreich mit der ganzzahligen Auswertung von Expression unifiziert wird (Ausprobieren mit float Zahl?? X is 3/2 X =:= 1 ???)

Einbauprädikate Listenprädikate append(List1,List2,List3) hängt an die erste Liste die zweite an member(Element, List) liefert yes falls Element in List ist nextto(X,Y,List): yes falls Y hinter X in List kommt delete(List1, X, List2): alle X in List1 löschen select(Element,List,Rest): Element in List löschen, Rest ausgeben kann als insert benutzt werden nth0(Index,List,Element): yes wenn Element das Index-te in List ist Zählen startet bei 0 nth1(Index,List,Element): wie vorher, Zählen startet bei 1 reverse(List1,List2): Ordnung der Elemente umkehren permutation(List1,List2): Elemente anders anordnen flatten(List1,List2): flache Liste rekursiv anordnen sumlist(List,Sum): summieren der Elemente numlist(Low,High,List): Integerliste zwischen Low und High Listenprädikate append(List1,List2,List3) hängt an die erste Liste die zweite an member(Element, List) liefert yes falls Element in List ist nextto(X,Y,List): yes falls Y hinter X in List kommt delete(List1, X, List2): alle X in List1 löschen select(Element,List,Rest): Element in List löschen, Rest ausgeben kann als insert benutzt werden nth0(Index,List,Element): yes wenn Element das Index-te in List ist Zählen startet bei 0 nth1(Index,List,Element): wie vorher, Zählen startet bei 1 reverse(List1,List2): Ordnung der Elemente umkehren permutation(List1,List2): Elemente anders anordnen flatten(List1,List2): flache Liste rekursiv anordnen sumlist(List,Sum): summieren der Elemente numlist(Low,High,List): Integerliste zwischen Low und High

Einbauprädikate Mengenprädikate is_set(List): yes wenn Liste ohne Duplikate ist list_to_set(List): Duplikate werden gelöscht, nur das erste Auftreten wird behalten intersection(Set1,Set2,Set3): Elemente, die sowohl in Menge1 als auch in Menge2 vorkommen subtract(Set,Delete,Result): lösche aus Set alle Elemente aus Delete union(Set1,Set2,Set3): Set1,Set2 sind Listen ohne Duplikate Set3 ist die Vereinigung subset(Subset, Set): Alle Elemente aus Subset sind in Set enthalten Mengenprädikate is_set(List): yes wenn Liste ohne Duplikate ist list_to_set(List): Duplikate werden gelöscht, nur das erste Auftreten wird behalten intersection(Set1,Set2,Set3): Elemente, die sowohl in Menge1 als auch in Menge2 vorkommen subtract(Set,Delete,Result): lösche aus Set alle Elemente aus Delete union(Set1,Set2,Set3): Set1,Set2 sind Listen ohne Duplikate Set3 ist die Vereinigung subset(Subset, Set): Alle Elemente aus Subset sind in Set enthalten

Einbauprädikate Stringmanipulation In SWI Prolog sind single-quoted Zeichenketten Atome, double-quoted Zeichenketten dagegen Listen der Einzelbuchstaben ?-atom("abc"). no ?-atom('abc'). yes. ?- append("Max","moni",L). L=[77,97,120,109,111,105] ?- append('Max','moni',L). no. Stringmanipulation In SWI Prolog sind single-quoted Zeichenketten Atome, double-quoted Zeichenketten dagegen Listen der Einzelbuchstaben ?-atom("abc"). no ?-atom('abc'). yes. ?- append("Max","moni",L). L=[77,97,120,109,111,105] ?- append('Max','moni',L). no.

Einbauprädikate Stringmanipulation string_to_atom(String,Atom): eines der Argumente muss instantiert sein: ?- string_to_atom(X,abc). X = "abc" string_to_list(String,List): Die einzelnen Buchstaben von String werden mit ihren Zeichencodes in List geschrieben string_length(String,Length): gibt die Zeichenzahl eines Strings aber auch eines Atoms an. string_concat(S1,S2,S3): Zusammenhängen zweier Strings sub_string(String,Start,Length,After,Sub): Sub ist ein Substring von String, der bei Start anfängt mit einer Länge von Length, dann sind noch After Buchstaben übrig Stringmanipulation string_to_atom(String,Atom): eines der Argumente muss instantiert sein: ?- string_to_atom(X,abc). X = "abc" string_to_list(String,List): Die einzelnen Buchstaben von String werden mit ihren Zeichencodes in List geschrieben string_length(String,Length): gibt die Zeichenzahl eines Strings aber auch eines Atoms an. string_concat(S1,S2,S3): Zusammenhängen zweier Strings sub_string(String,Start,Length,After,Sub): Sub ist ein Substring von String, der bei Start anfängt mit einer Länge von Length, dann sind noch After Buchstaben übrig

Einbauprädikate Sonstige Term =.. List: zerlegt einen Term in eine Liste ?- f(1,2) =..X. X= [f,1,2] functor(Term,Functor,Arity): gibt den Funktor und die Stelligkeit aus help(Prädikat): zeigt den Hilfstext an listing(Prädikat): zeigt die Implementierung an ?- listing(member) lists:member(A,[A|_]). lists:member(A,[_|B]):- member(A,B). true. Sonstige Term =.. List: zerlegt einen Term in eine Liste ?- f(1,2) =..X. X= [f,1,2] functor(Term,Functor,Arity): gibt den Funktor und die Stelligkeit aus help(Prädikat): zeigt den Hilfstext an listing(Prädikat): zeigt die Implementierung an ?- listing(member) lists:member(A,[A|_]). lists:member(A,[_|B]):- member(A,B). true.

Acht Damen Problem 2 Variante der Implementierung Idee: da die Damen in unterschiedlichen Spalten angeordnet werden müssen um das Problem zu lösen, gilt X1=1,X2=2...X8=8 Damit kann ohne Informationsverlust auf die X-Werte verzichtet werden: [Y1,Y2,...Y8] genügt als Datenstruktur Vermeiden einer horizontalen Bedrohung: keine zwei Damen in derselben Reihe, Constraint für die Y-Koordinaten: alle Reihen müssen belegt sein 1,2,...,8 Übrig bleibt als Problem die Ordnung der Liste [1,2,3,4,5,6,7,8] Idee: Jede Lösung ist eine Permutation die bestimmte Bedingungen erfüllt Variante der Implementierung Idee: da die Damen in unterschiedlichen Spalten angeordnet werden müssen um das Problem zu lösen, gilt X1=1,X2=2...X8=8 Damit kann ohne Informationsverlust auf die X-Werte verzichtet werden: [Y1,Y2,...Y8] genügt als Datenstruktur Vermeiden einer horizontalen Bedrohung: keine zwei Damen in derselben Reihe, Constraint für die Y-Koordinaten: alle Reihen müssen belegt sein 1,2,...,8 Übrig bleibt als Problem die Ordnung der Liste [1,2,3,4,5,6,7,8] Idee: Jede Lösung ist eine Permutation die bestimmte Bedingungen erfüllt

Acht Damen Problem 2 Jede Lösung ist eine Permutation: solution(S):- permutation([1,2,3,4,5,6,7,8],S), safe(S). Für safe(S) gilt (1) S ist die leere Liste (2) S hat die Struktur [Queen|Others] ist safe wenn Others safe und Queen bedroht niemanden in Others safe([]). safe([Queen|Others]):- safe(Others), noattack(Queen,Others). Jede Lösung ist eine Permutation: solution(S):- permutation([1,2,3,4,5,6,7,8],S), safe(S). Für safe(S) gilt (1) S ist die leere Liste (2) S hat die Struktur [Queen|Others] ist safe wenn Others safe und Queen bedroht niemanden in Others safe([]). safe([Queen|Others]):- safe(Others), noattack(Queen,Others).

Acht Damen Problem 2 noattack: Schwierigkeit ist, dass im Gegensatz zur ersten Lösung die Positionen nur durch die Y Koordinaten repräsentiert werden. X Koordinaten sind nicht explizit! Wir müssen noattack modifizieren! Nach der Ordnung der Damen, implizit bei Aufruf, startet noattack mit einer X-Distanz von 1 zwischen Queen und dem Kopf von Others. Die noattack Relation braucht ein Drittes Argument um die X-Distanz darzustellen, die bei Abarbeitung von Others je um 1 erhöht wird.. noattack(Queen,Others,Xdist) → Start von noattack in der safe Relation: noattack(Queen,Others,1) Reformulieren von noattack: Queen bedroht weder Head noch Tail von Others. noattack: Schwierigkeit ist, dass im Gegensatz zur ersten Lösung die Positionen nur durch die Y Koordinaten repräsentiert werden. X Koordinaten sind nicht explizit! Wir müssen noattack modifizieren! Nach der Ordnung der Damen, implizit bei Aufruf, startet noattack mit einer X-Distanz von 1 zwischen Queen und dem Kopf von Others. Die noattack Relation braucht ein Drittes Argument um die X-Distanz darzustellen, die bei Abarbeitung von Others je um 1 erhöht wird.. noattack(Queen,Others,Xdist) → Start von noattack in der safe Relation: noattack(Queen,Others,1) Reformulieren von noattack: Queen bedroht weder Head noch Tail von Others.

Acht Damen Problem 2 noattack(_,[],_). noattack(Y,[Y1|YList],Xdist):- Y1-Y =\= Xdist, Y-Y1 =\= Xdist, Dist1 is Xdist + 1, noattack(Y,YList, Dist1). noattack(_,[],_). noattack(Y,[Y1|YList],Xdist):- Y1-Y =\= Xdist, Y-Y1 =\= Xdist, Dist1 is Xdist + 1, noattack(Y,YList, Dist1).

Acht Damen Problem 2 solution(Queens) :- permutation([1,2,3,4,5,6,7,8], Queens), safe(Queens). safe([]). safe([Queen|Others]):- safe(Others),noattack(Queen,Others,1). noattack(_,[],_). noattack(Y,[Y1|YList],XDist):- Y1-Y =\= Xdist, Y-Y1 =\= Xdist, Dist1 is Xdist +1, noattack(Y,YList,Dist1). solution(Queens) :- permutation([1,2,3,4,5,6,7,8], Queens), safe(Queens). safe([]). safe([Queen|Others]):- safe(Others),noattack(Queen,Others,1). noattack(_,[],_). noattack(Y,[Y1|YList],XDist):- Y1-Y =\= Xdist, Y-Y1 =\= Xdist, Dist1 is Xdist +1, noattack(Y,YList,Dist1).

Acht Damen Problem 2 Hilfsprädikat Permutation: permutation([],[]). permutation([Head|Tail],PermList):- permutation(Tail,PermTail), del(Head,PermList,PermTail). del(Item,[Item|List],List). del(Item,[First|List],[First|Rest]):- del(Item,List,Rest). Hilfsprädikat Permutation: permutation([],[]). permutation([Head|Tail],PermList):- permutation(Tail,PermTail), del(Head,PermList,PermTail). del(Item,[Item|List],List). del(Item,[First|List],[First|Rest]):- del(Item,List,Rest).

Ein- Ausgabe in PROLOG Mit dem Benutzer wird über Ein- und Ausgabeströme kommuniziert. Vom Eingabestrom wird gelesen, auf den Ausgabestrom geschrieben Dateien, Tastatur und Bildschirm Der Benutzer liest und schreibt wenn nichts anderes vereinbart ist mit den Standard Ein/Ausgabe Routinen: stdin, stdout in Linux Lesen: read(Term) Schreiben: write(Term) Einen Buchstaben mit Code X auf den geöffneten Strom schreiben: put(X) Mit dem Benutzer wird über Ein- und Ausgabeströme kommuniziert. Vom Eingabestrom wird gelesen, auf den Ausgabestrom geschrieben Dateien, Tastatur und Bildschirm Der Benutzer liest und schreibt wenn nichts anderes vereinbart ist mit den Standard Ein/Ausgabe Routinen: stdin, stdout in Linux Lesen: read(Term) Schreiben: write(Term) Einen Buchstaben mit Code X auf den geöffneten Strom schreiben: put(X)

Ein- Ausgabe in PROLOG Buchstaben z.B. 'A' schreiben: put_char('A'). Buchstaben lesen: get_char(X). Code Wert X eines Buchstabens lesen: get0(X) Buchstaben z.B. 'A' schreiben: put_char('A'). Buchstaben lesen: get_char(X). Code Wert X eines Buchstabens lesen: get0(X)

Ein- Ausgabe in PROLOG Einfache Ein/Ausgabe read/1 und write/1 read(X): liest die nächste Eingabe vom Keyboard bis '.' eingegeben wird. Eingabe wird mit X unifiziert. Eingabe muss gültiger Prologausdruck sein, ohne whitespace. ?- read(X). |: [1,2,3]. X= [1,2,3] yes. ?-X='Hallo', write(X). Hallo. X='Hallo' nl: schreibt ein Newline auf den Outputstrom tabl(X): schreibt X Tabs auf das Terminal Einfache Ein/Ausgabe read/1 und write/1 read(X): liest die nächste Eingabe vom Keyboard bis '.' eingegeben wird. Eingabe wird mit X unifiziert. Eingabe muss gültiger Prologausdruck sein, ohne whitespace. ?- read(X). |: [1,2,3]. X= [1,2,3] yes. ?-X='Hallo', write(X). Hallo. X='Hallo' nl: schreibt ein Newline auf den Outputstrom tabl(X): schreibt X Tabs auf das Terminal

Ein- Ausgabe in PROLOG Zeichenorientiertes Einlesen/Ausgeben ?- get_char(X) |: z. X = z ?- X = 'z', put_char(X). z X=z X='Test', put_char(X). Error, character expected. ?- get(X). |: a. X=97 ?- put(97). a yes. Zeichenorientiertes Einlesen/Ausgeben ?- get_char(X) |: z. X = z ?- X = 'z', put_char(X). z X=z X='Test', put_char(X). Error, character expected. ?- get(X). |: a. X=97 ?- put(97). a yes.

Ein- Ausgabe in PROLOG Einlesen einer Zeile: Um eine beliebige Zeile einzulesen muss man zeichenweise einlesen bis newline auftritt: lese(X) liest von der Tastatur und steckt die Zeichen in eine Liste lese(Zeile) :- lese(Zeile,[ ]). lese(Zeile,Last):- get_char(C),restliche_zeile(Zeile,C,Last). restliche_zeile(Zeile,'n',Last):- reverse(Last,Zeile),!. restliche_zeile(Zeile,C,Last):- lese(Zeile,[C|Last]). Einlesen einer Zeile: Um eine beliebige Zeile einzulesen muss man zeichenweise einlesen bis newline auftritt: lese(X) liest von der Tastatur und steckt die Zeichen in eine Liste lese(Zeile) :- lese(Zeile,[ ]). lese(Zeile,Last):- get_char(C),restliche_zeile(Zeile,C,Last). restliche_zeile(Zeile,'n',Last):- reverse(Last,Zeile),!. restliche_zeile(Zeile,C,Last):- lese(Zeile,[C|Last]).

Ein- Ausgabe in PROLOG Lesen von Dateien: von einer Datei lesen open/3 lese_datei :- open('indatei',read,IN), datei_lesen(IN). Utf-8 Datei lesen open/4 lese_datei :- open('indatei',read,IN,[encoding(utf8)]), datei_lesen(IN). Lesen von Dateien: von einer Datei lesen open/3 lese_datei :- open('indatei',read,IN), datei_lesen(IN). Utf-8 Datei lesen open/4 lese_datei :- open('indatei',read,IN,[encoding(utf8)]), datei_lesen(IN).

Ein- Ausgabe in PROLOG Schreiben auf Dateien: auf Datei schreiben open/3 schreibe_datei :- open('outdatei',write,OUT), datei_schreiben(OUT). Utf-8 Datei schreiben open/4 schreibe_datei :- open('outdatei',write,OUT,[encoding(utf8)]), datei_schreiben(OUT). Schreiben auf Dateien: auf Datei schreiben open/3 schreibe_datei :- open('outdatei',write,OUT), datei_schreiben(OUT). Utf-8 Datei schreiben open/4 schreibe_datei :- open('outdatei',write,OUT,[encoding(utf8)]), datei_schreiben(OUT).

Ein- Ausgabe in PROLOG set_input: Eingabestrom umleiten /* Datei Lesen, danach Strom wieder zurück */ lese_datei(Name):- open(Name,read,X,[encoding(utf8)]), current_input(USER), set_input(X), schreiben_und_ausgeben, set_input(USER), close(X). /*schreibfunktion*/ schreiben_und_ausgeben :- get_char(C), C \= end_of_file, write(C), schreiben_und_ausgeben. set_input: Eingabestrom umleiten /* Datei Lesen, danach Strom wieder zurück */ lese_datei(Name):- open(Name,read,X,[encoding(utf8)]), current_input(USER), set_input(X), schreiben_und_ausgeben, set_input(USER), close(X). /*schreibfunktion*/ schreiben_und_ausgeben :- get_char(C), C \= end_of_file, write(C), schreiben_und_ausgeben.

Ein- Ausgabe in PROLOG set_ouput: Ausgabestrom umleiten /* Auf Datei Schreiben, danach Strom wieder zurück */ schreibe_datei(Name):- open(Name,write,X,[encoding(utf8)]), current_output(TERMINAL), set_output(X), in_Datei_schreiben, set_output(TERMINAL), close(X). /*lesefunktion*/ in_Datei_schreiben :- get_char(C), C \= '\n', write(C), in_Datei_schreiben. set_ouput: Ausgabestrom umleiten /* Auf Datei Schreiben, danach Strom wieder zurück */ schreibe_datei(Name):- open(Name,write,X,[encoding(utf8)]), current_output(TERMINAL), set_output(X), in_Datei_schreiben, set_output(TERMINAL), close(X). /*lesefunktion*/ in_Datei_schreiben :- get_char(C), C \= '\n', write(C), in_Datei_schreiben.

Hausaufgabe Acht Damen Problem nochmals anschauen und verstehen Tokenizer im Leisskript anschauen, wird nächstes mal besprochen Acht Damen Problem nochmals anschauen und verstehen Tokenizer im Leisskript anschauen, wird nächstes mal besprochen