algorithmenmuster (design patterns): scanline, rekursion ... · mit einer geeigneten...
TRANSCRIPT
![Page 1: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/1.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
8 Weitere Algorithmen
Algorithmenmuster (Design Patterns):
� Scanline,
� Rekursion, Divide–and–Conquer,
� Graphendurchlauf: DFS, BFS,
� Backtracking in Verbindung mit DFS,
� Greedy,
� Dynamische Programmierung.
Prof. Dr. Dietmar Seipel 416
![Page 2: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/2.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
8.1 Das Algorithmenmuster Greedy
greedy: engl. für gierig
Das Prinzip “gieriger” Algorithmen ist es, in jedem Teilschritt so viel wie
möglich zu erreichen.
� Bei einigen Problemen wie der Berechnung kürzester Wege oder der
Suche nach einem aufspannenden Baum in einem Graphen kann man
mit einer geeigneten Greedy–Methode die Optimallösung finden.
� Bei anderen Problemen wie etwa dem Rucksackproblem oder dem
Problem des Handlungsreisenden erreicht man damit aber meist nicht
die Optimallösung.
Prof. Dr. Dietmar Seipel 417
![Page 3: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/3.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Berechnung kürzester Wege auf Distanzgraphen –Algorithmus von Dijkstra
Anwendung von Vorangswarteschlangen
Gegeben sei ein gerichteter Graph � � ��� ��� � , dessen Kanten � mit
nicht–negativen Längen � � �� markiert sind (Distanzgraph).
Desweiteren wird ein Knoten � � fixiert.
Gesucht sind die Längen � ��� � � ��� � � von kürzesten Wegen� � � ��� � von � zu
allen anderen Knoten� � .
Prof. Dr. Dietmar Seipel 418
![Page 4: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/4.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Beispiel:
� � � ��� ��� � � �� ��� � � �� ��� � � �� � � � � �� � � � �� � � � � �� � � � �� � � � � � �� � � � � � � � �
� � � � ��� ��� �� � � � �
Prof. Dr. Dietmar Seipel 419
![Page 5: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/5.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Dann gilt:� � � � � � � �
� �� � � � � ��� �� � � � � � � � ��� ��� � � � � � � �
� ��� � � � ��� ��� � � � � �� �� � � � � �
� � �
Prof. Dr. Dietmar Seipel 420
![Page 6: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/6.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Greedy–Algorithmus, Dijkstra
Setze� � � � � � ,
� � �� � � �� , für alle� � � � �� � ,
� � � � .
Dann wird � nach dem Prinzip „Knoten mit kürzester Distanz von � zuerst“schrittweise vergrößert, bis man � � � erhält:
1. Wähle Knoten� � � � mit minimaler Distanz� �� � .
2. Nimm� zu � hinzu( � � ��� � � � � � � � � �� � ist bereits korrekt!)
3. Füre jede Kante �� ��� � � von� zu� � � � , ersetze� �� � durch:
� � � �� � �� �� � � � �� ��� � �Prof. Dr. Dietmar Seipel 421
![Page 7: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/7.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Für alle Kanten aus � kennt man bereits die Länge � �� � � ��� � � eines
kürzesten Weges von � nach� .
Prof. Dr. Dietmar Seipel 422
![Page 8: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/8.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Wir implementieren� � � als Vorrangswarteschlange (Priority Queue). Die
Prioritäten sind die Distanzen� �� � .
Dann werden die 3 Schritte aus dem Algorithmus von Dijkstra
folgendermaßen realisiert:
1. Löschen des Minimums.
2. Einfügen.
3. Verringerung der Priorität eines Schlüssels.
Prof. Dr. Dietmar Seipel 423
![Page 9: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/9.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
8.2 Algorithmen zum Graphendurchlauf� Tiefensuche (Depth First Search, DFS)
� Breitensuche (Breadth First Search, BFS)
Anwendung zur Suche in Labyrinthen
Prof. Dr. Dietmar Seipel 424
![Page 10: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/10.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Das Labyrinth wird als Graph � � �� � � � repräsentiert:
� � � � � ��� � �
� � � � � ��� � � �� ��� � � �� ��� � � �� � � � � �� � � � � � � � � � � � � ��� � � �� � � � �
Wir lassen der Einfachheit halber die inversen Kanten des Labyrinths weg.
Prof. Dr. Dietmar Seipel 425
![Page 11: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/11.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Rahmenalgorithmus zum Graphendurchlauf
� Graph � � ��� ��� � ,
� Startknoten � � ,
� Zielknotenmenge � � � ,
� Datenstruktur � �� �� � für Knotenmenge
� Teilmengen � � � � � � und �� �� � � � .
Es werden kürzeste Wege von � zu allen Knoten aus � berechnet.
Prof. Dr. Dietmar Seipel 426
![Page 12: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/12.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
füge � in � �� �� � ein; �� �� �� � � � � ; � � �� � � ;
solange � � � �� � noch Elemente enthält
wähle das erste Element � aus � �� �� �
falls es keine Kante � � ��� ��� � � � �� � mit Knoten � gibt
dann lösche � aus � �� �� �
sonst { benutze eine Kante � � ��� ��� � � � �� � ,d.h. � � �� � � � �� � � � � � �� � � ;falls � �� �� �� �� �dann { �� �� �� � �� �� �� � � � � � ;
füge � in � �� �� � ein;
Vorgänger �� � � ;falls � � � � �� �� �
dann breche den Algorithmus ab } }
Prof. Dr. Dietmar Seipel 427
![Page 13: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/13.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Suche nach einem einzigen Zielknoten in JAVA
class GraphNode {
GraphNode[] neighbors;
boolean isVisited;
int key;
public GraphNode(int key) {
this.key = key;
}
public void setNeighbors(GraphNode... neighbors) {
this.neighbors = neighbors;
}
Prof. Dr. Dietmar Seipel 428
![Page 14: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/14.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
public List findPath(GraphNode destination) {
if (isVisited)
return null;
isVisited = true;
List path = null;
if (destination.key == this.key) {
path = new List();
path.add(key);
} else {
for (int i = 0; i < neighbors.length; i++) {
path = neighbors[i].findPath(destination);
if (path != null) {
path.insert(key, null);
break; } } }
return path;
}
Prof. Dr. Dietmar Seipel 429
![Page 15: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/15.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
public static void main(String[] args) {
GraphNode[] nodes = new GraphNode[5];
for (int i = 0; i < nodes.length; i++) {
nodes[i] = new GraphNode(i);
}
nodes[0].setNeighbors(nodes[1]);
nodes[1].setNeighbors(nodes[2], nodes[0]);
nodes[2].setNeighbors(nodes[3], nodes[4]);
nodes[3].setNeighbors(nodes[4]);
nodes[4].setNeighbors(nodes[1]);
System.out.println(nodes[4].findPath(nodes[0]));
}
}
Prof. Dr. Dietmar Seipel 430
![Page 16: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/16.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Tiefensuche:
Falls Border als Stapel realisiert wird, so ist das erste Element von Border
immer das oberste und wir fügen ein indem wir auf den Stapel legen.
Dann liefert der Rahmenalgorithmus eine Tiefensuche.
Beispiel:
Prof. Dr. Dietmar Seipel 431
![Page 17: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/17.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Sei � � � und � � � � � .
Die Knoten werden in der Reihenfolge ihrer Nummern besucht.� Für� � � wird zuerst die Kante �� � � � benutzt.
� Für� � � gibt es keine Kanten �� ��� � � . Deshalb fahren wir mit dernächsten unbenutzten Kante �� � � � für� � � fort (Backtracking) .
� Dann wird� � � analog zu� � � behandelt, und wir gelangenschließlich über den Knotem 8 zum Ziel 9.
� Die berechnete Vorgängerfunktion ist jetzt wie folgt:
� 1 2 3 4 5 6 7 8 9
Vorgänger �� � � 1 2 3 4 4 6 6 8
� Der berechnete Weg vom Start zum Ziel ist also:
� � �� ��� �� � � �� ��� �
Prof. Dr. Dietmar Seipel 432
![Page 18: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/18.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Breitensuche:
Falls Border als Priority Queue (First In / First Out) realisiert wird, so
liefert der Rahmenalgorithmus eine Breitensuche
Sei weiter � � � und � � � � � .
Auch hier werden die Knoten wieder in der Reihenfolge ihrer Nummern
besucht und der berechnete Weg ist der derselbe. Aber jetzt werden für
� � � zuerst die beiden Kanten �� � � � und �� � � � benutzt.
Die Priority Queue verändert sich wie folgt:
�
Benutzen von � � ��� �� � � �Benutzen von � � ��� �� � � � �
Erst jetzt wird 4 gelöscht, und wir besuchen� � � .
Prof. Dr. Dietmar Seipel 433
![Page 19: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/19.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Bei der Tiefensuche verändert sich Border dagegen wie folgt:�
Benutzen von � � � � �� � � �
Löschen von �� � �
Benutzen von � � � � �� � � �
Benutzen von � � ��� �� � � � �
�
Löschen von �� � � � � � � � � � � �
In der Tat ist der Stack am Ende gleich� � � � � � � �
d.h. gleich dem inversen gefundenen Weg vom Start zum Ziel.
Prof. Dr. Dietmar Seipel 434
![Page 20: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/20.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Falls die Sackgasse bei� � � länger wäre, so wäre die Breitensuche teurer
als die Tiefensuche.
Prof. Dr. Dietmar Seipel 435
![Page 21: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/21.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Die Tiefensuche benutzt die Kanten in folgender Reihenfolge:
� � �� � � �� �� � � �� �� � � �� � � � � � � � � � � � � � � � � � � � � � � � � � �
�� � � � � � � � � � � � � �� � � �� ��� �
Die Breitensuche benutzt dagegen nur folgende Kanten:
� � �� � � �� �� � � �� �� � � �� � � � � �� � � � �
� � � � � � � � � � � � � � �� � � � � � � � � � �� � � �Die Kanten zwischen 11 und 13 werden gar nicht benutzt.
Prof. Dr. Dietmar Seipel 436
![Page 22: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/22.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
In vielen praktischen Fällen werden sogar unterschiedliche Wege berechnet:
� � � � � �� � � �� �� � � �� �� � � � � �� � � �
� � � �
� � � � �
Tiefensuche: � � �� ��� �� � ,Breitensuche: � � �� �
Die Breitensuche brechnet immer einen kürzesten Weg, wenn man dieKantenlängen alle auf 1 setzt.In diesem Fall entspricht der Graphendurchlauf dem Algorithmus von
Dijkstra.
Prof. Dr. Dietmar Seipel 437
![Page 23: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/23.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Tiefensuche in Graphen mit Zyklen
Benutzung der Kanten:
(1,2), (2,3), (3,4), (4,5), (3,5), (3,6), (6,2), (6,5).
Die 5 unterstrichenen Kanten bilden einen Baum.
Prof. Dr. Dietmar Seipel 438
![Page 24: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/24.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Die weiteren Kanten heißen:
� Vorwärtskanten: �� � � �
� Rückwärtskanten: � � �� �
� Seitwärtskanten: � � � � �
Prof. Dr. Dietmar Seipel 439
![Page 25: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/25.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
8.3 Tiefensuche und Backtracking in PROLOG
PROLOG ermöglicht
� deklarative Programmierung
� kompakte Programme
� rapid Prototyping
Die Auswertungsstrategie der SLDNF–Resolution benutzt
� Tiefensuche
� Backtracking
� Unifikation
Prof. Dr. Dietmar Seipel 440
![Page 26: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/26.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Datenstrukturen in PROLOG
PROLOG–Atom: z.B. book, george, ‘George‘, x12op
Konstante: PROLOG–Atom � Numberz.B. book, 0, 123, 4
Variable: beginnend mit Großbuchstaben oder mit “_”z.B. Book, Up, Var, _, _X
Funktor (Funktions– bzw. Prädikatensymbol):Operator � PROLOG–Atomz.B. +, –, � , ancestor
Struktur: Konstante � Variable � Funktor(Struktur, , Struktur)z.B. +(1,7), ancestor(bill,joe)Listen sind spezielle Strukturen zum Funktor ’.’:[a,b,c,d] = ’.’(a, [b,c,d])+(1,7) ist äquivalent zu 1+7 (Infix–Notation).
Prof. Dr. Dietmar Seipel 441
![Page 27: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/27.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
PROLOG–Klauseln
(Prädikatensymbole: ancestor, parent, likes, woman, nice, loves)
Regeln: Kopf :– Rumpf, mit Konjunktion “,”, Disjunktion “;”� � �� �� �� �� �� � :– � � �� �� �� �� ��� � � �� � � � �� �� �
Bedeutung:
�� ��� � � � � ��� � ��� � �� ��� ��� � � � � � �� � � � ��� �� � ��� � �� � � � �
��� � � �� � �� � � ��� � :–� �� � � �� � � � �� � � �� � � � � � � �
��� � � �� �� ! � � � :– � � �� �� �" � �# � � �� � � � � � �
Fakten:
� �� � � �� �� ! �
��� � � �� �� ! � � � � � � �
� � # � � �� � �� � � � � � � � �
Goal:
$ � ��� � � � � � � � � � ��� �
Prof. Dr. Dietmar Seipel 442
![Page 28: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/28.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Ein PROLOG–Interpreter versucht ein Goal durch Inferenz zu beweisen.
Dies erfolgt Top–Down vom Goal ausgehend durch DFS–Durchlauf des
SLD–Baumes.
Beispiel:
?- likes(george,Y).
Y = maryYes?- likes(X, Y).
X = george, Y = mary ;X = mary, Y = georgeYes?-
Prof. Dr. Dietmar Seipel 443
![Page 29: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/29.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
SLD–Baum
� ���� � ��� �� �
� � � � �� �� � ��� � �� ��� � �� � � � � ��� �� �� �� �� � �� ���� � � �
�
� � �� � � � � � � �� � � �� � � �
success
� � ��� � � � � � � � � � �� � �
�
� � �� � � �� � � �� �� � � � � �
success
� � � � �� � �� � �� ���� � �� � �� � � � � �� � �� � ��� �� � � � � �� �� �� � �� � � � � ���� � � �
failurefailure
� � � �
�
� � � � �
!
""""#
$ $ $ $%
&''''''(
) ) ) ) ) )*&
&
Prof. Dr. Dietmar Seipel 444
![Page 30: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/30.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Anfragen in PROLOG� Die Auswertung von PROLOG–Regeln erfolgt Top–Down mittels der
Methode der SLDNF–Resolution: d.h., aus einer Anfrage an das
Kopfatom einer Regel werden Unteranfragen an die Rumpfatome der
Regel erzeugt.
� Dies entspricht dem Vorgehen bei der Abarbeitung von prozeduralen
Programmiersprachen.
� Falls ein Rumpfatom mehrere Antworten liefert, so wird zuerst mit
einer solchen Antwort weitergerechnet (Tiefensuche); falls die
Berechnung später fehlschlägt, so kann mit der nächsten Antwort
fortgefahren werden (Backtracking).
� In der Praxis sind viele PROLOG–Prädikate aber funktional; d.h., aus
einer Eingabe wird genau eine Ausgabe erzeugt.
Prof. Dr. Dietmar Seipel 445
![Page 31: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/31.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Kontrollprimitive, welche über die PL1 hinausgehen:
� “assert” und “retract” verändern die interne Datenbank von PROLOG;
“clause” sucht in dieser.
� “call” ruft Goals auf, die vorher zusammengebaut werden können.
� Der Cut “!” friert die bisherige Variablenbelegung in der aktuellen
Regel ein.
� “fail” ist ein Goal, das immer fehl schlägt.
�
Prof. Dr. Dietmar Seipel 446
![Page 32: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/32.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Literatur� W.F. Clocksin, C.S. Mellish:
Programming in PROLOG, Springer, 1987.
� I. Bratko: PROLOG – Programming for Artificial Intelligence,
Addison–Wesley, Second Edition, 1990.
� S. Ceri, G. Gottlob, L. Tanca:
Logic Programming and Databases, Springer, 1990.
� J.W. Lloyd:
Foundations of Logic Programming, Springer, Second Edition, 1987.
Prof. Dr. Dietmar Seipel 447
![Page 33: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/33.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Listen sind spezielle PROLOG–Strukturen mit dem binären Funktor ‘.’.
Liste: [a,b,c,d] = ’.’(a, ’.’(b, ’.’(c, ’.’(d, [ ]))))
Listenkonstruktion:Falls X und Xs bereits gebunden (mit Werten belegt) sind, so ist [X|Xs]
die Liste, die man erhält, wenn man das Element X an die Liste Xs
vorne anhängt.
Für X = a und Xs = [b,c,d] ist [X|Xs] = [a,b,c,d].
Listenzerlegung:Falls X und Xs ungebunden sind, so liefert der Aufruf [X|Xs] =
[a,b,c,d] die Belegungen X = a und Xs = [b,c,d]; man kann eine Liste
also in ihren Kopf X und den Rest Xs zerlegen.
leere Liste: [ ]
Prof. Dr. Dietmar Seipel 448
![Page 34: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/34.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Rekursion: das Prädikat member
/* member(?X, +L) <-
X is a member of the list L. */
member(X, [X|_]).
member(X, [_|Xs]) :-
member(X, Xs).
?- member(a, [c, b, a]).
Yes
Prof. Dr. Dietmar Seipel 449
![Page 35: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/35.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Relationales Programmieren
� � � � � � �� �� � � � � � � � �� �� � � � �� � �
?- member(b, [a, b, c]).
Yes
?- member(X, [a, b, c]).
X = a;
X = b;
X = c
Yes
Beim Aufruf member(X, Y) sind X und Y nicht funktional voneinander
abhängig. Stattdessen realisiert member/2 eine n:m–Beziehung (Relation)
zwischen Listen und ihren Elementen.
Prof. Dr. Dietmar Seipel 450
![Page 36: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/36.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Das Prädikat member/2 definiert eine virtuelle Relation:
member
Element List
a [a, b, c]
b [a, b, c]
c [a, b, c]
a [a, b]
Prof. Dr. Dietmar Seipel 451
![Page 37: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/37.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Suche in Graphen
� � � � _ �� �� � � � � �� � � � �� � � �� � � � �� � �
/* graph_search(+Node, -Path) <-
*/
graph_search(X, Path) :-
graph_search(X, [X], Path).
graph_search(X, _, [X]) :-
graph_sink(X).
graph_search(X, Visited, [X|Path]) :-
( graph_edge(X, Y)
; graph_edge(Y, X) ),
not(member(Y, Visited)),
write(user, ’->’), write(user, Y),
graph_search(Y, [Y|Visited], Path).
Prof. Dr. Dietmar Seipel 452
![Page 38: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/38.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Labyrinth:
�
�a b c
d e f
g h i
graph_edge(i, f).
graph_edge(i, h).
graph_edge(h, g).
graph_edge(g, d).
graph_edge(d, e).
graph_edge(d, a).
graph_edge(a, b).
graph_edge(b, c).
graph_source(i).
graph_sink(c).
Prof. Dr. Dietmar Seipel 453
![Page 39: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/39.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
?- graph_search(i, Path).
->f->h->g->d->e->a->b->c
Path = [i, h, g, d, a, b, c]
Yes
?- graph_search(e, Path).
->d->a->b->c
Path = [e, d, a, b, c] ;
->g->h->i->f
No
?-
Prof. Dr. Dietmar Seipel 454
![Page 40: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/40.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
� Das Prädikat graph_search/2 benutzt Tiefensuche, und es berechnet
einfache Pfade (ohne doppelte Knoten).
� Beim Aufruf graph_search(Node, Path) mit einem gebundenen
Argument Node und einem freien Argument Path können alle
einfache Pfade von Node zu einer Senke (graph_sink) über
Backtracking berechnet werden.
� Würde man eine weitere Kante graph_edge(e, b) in den Graphen
einfügen (die Wand zwischen e und b einreisen), so gäbe es einen
weiteren einfachen Pfad [e, b, c] von e zur Senke c.
Prof. Dr. Dietmar Seipel 455
![Page 41: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/41.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Man kann alle Antworten mittels Backtracking und findall/3 bestimmen:
...
graph_edge(e, b).
?- findall( Path,
graph_search(e, Path),
Paths ).
...
Paths = [ [e, d, a, b, c], [e, b, c] ]
Yes
?-
Prof. Dr. Dietmar Seipel 456
![Page 42: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/42.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Man kann mit PROLOG (im Gegensatz zur “reinen” Logikprogrammierung)
auch� prozedural
� mit Seiteneffekten und
� mit globalen Variablen (realisiert mit Hilfe von assert und retract)
programmieren.
Es gibt umfangreiche Programmbibliotheken und Erweiterungen:
� Datenstrukturen und Algorithmen, Kombinatorik,
� Datenbank– und Web–Programmierung,
� GUI–Programmierung, etc.
Prof. Dr. Dietmar Seipel 457
![Page 43: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/43.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Anwendungsbereiche:� regelbasierte Diagnosesysteme (Medizin, Technik)
� symbolische Informationsverarbeitung, Parsing
� Datenbanken mit komplexen Strukturen (Hierarchien, XML)
� Datenintegration
� Semantic Web
� Default Reasoning
� kombinatorische Suchprobleme
(Graphenprobleme, Spiele wie Sudoku oder Minesweeper, etc.)
Prof. Dr. Dietmar Seipel 458
![Page 44: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/44.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Quicksort in PROLOG
/* quicksort(List, Sorted_List) <-
*/
quicksort([], []) :-
!.
quicksort([X|Xs], Ys) :-
quicksort_divide(X, Xs, Xs1, Xs2),
quicksort(Xs1, Ys1),
quicksort(Xs2, Ys2),
append(Ys1, [X|Ys2], Ys).
Prof. Dr. Dietmar Seipel 459
![Page 45: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/45.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
quicksort_divide(X, Xs, Xs1, Xs2) :-
findall( X1,
( member(X1, Xs),
X1 < X ),
Xs1 ),
findall( X2,
( member(X2, Xs),
X2 > X ),
Xs2 ).
append([], Ys, Ys).
append([X|Xs], Ys, [X|Zs]) :-
append(Xs, Ys, Zs).
Prof. Dr. Dietmar Seipel 460
![Page 46: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/46.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Mergesort in PROLOG
/* mergesort(List, Sorted_List) <-
*/
mergesort(Xs, Xs) :-
length(Xs, N),
N =< 1,
!.
mergesort(Xs, Ys) :-
middle_split(Xs, Xs1, Xs2),
mergesort(Xs1, Ys1),
mergesort(Xs2, Ys2),
mergesort_merge(Ys1, Ys2, Ys).
Prof. Dr. Dietmar Seipel 461
![Page 47: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/47.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
mergesort_merge([], Xs, Xs) :-
!.
mergesort_merge(Xs, [], Xs) :-
!.
mergesort_merge([X1|Xs1], [X2|Xs2], [X|Xs]) :-
( X1 < X2,
X = X1,
mergesort_merge(Xs1, [X2|Xs2], Xs)
; X = X2,
mergesort_merge([X1|Xs1], Xs2, Xs) ).
Prof. Dr. Dietmar Seipel 462
![Page 48: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/48.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Binäre Suchbäume in PROLOG
/* search_in_binary_tree(Key, Tree) <-
*/
search_in_binary_tree(Key, Tree) :-
binary_tree_parse(Tree, Key, _, _).
search_in_binary_tree(Key, Tree) :-
binary_tree_parse(Tree, Root, Left, Right),
( ( Key < Root,
!,
Tree = Left )
; ( Key > Root,
Tree = Right ) ),
search_in_binary_tree(Key, Tree).
Prof. Dr. Dietmar Seipel 463
![Page 49: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/49.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Kapselung des Zugriffs:
/* binary_tree_empty(Tree) <-
*/
binary_tree_empty(Tree) :-
( dislog_variable_get(binary_tree_mode, xml),
Tree = node:[]:[]
; Tree = [] ).
Prof. Dr. Dietmar Seipel 464
![Page 50: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/50.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
/* binary_tree_parse(Tree, Key, Lson, Rson) <-
*/
binary_tree_parse(Tree, Key, Empty, Empty) :-
binary_tree_empty(Empty),
( dislog_variable_get(binary_tree_mode, xml),
Tree = node:[key:Key]:[]
; Tree = [Key] ),
!.
binary_tree_parse(Tree, Key, Lson, Rson) :-
( dislog_variable_get(binary_tree_mode, xml),
Tree = node:[key:Key]:[Lson, Rson]
; Tree = [Key, Lson, Rson] ).
Prof. Dr. Dietmar Seipel 465
![Page 51: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/51.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Suchbaum in XML–Darstellung:
<node key="8">
<node key="4">
<node key="2">
<node key="1"/>
<node key="3"/>
</node>
<node key="6">
<node key="5"/>
<node key="7"/>
</node>
</node>
<node key="12">
<node key="10">
<node key="9"/>
<node key="11"/>
</node>
<node key="13"/>
</node>
</node>
Prof. Dr. Dietmar Seipel 466
![Page 52: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/52.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
Suchbaum
XML–Darstellung:
<node key="2">
<node key="1"/>
<node key="3"/>
</node>
PROLOG–Darstellung:
node:[key:2]:[
node:[key:1],
node:[key:3] ]
alternative PROLOG–Darstellung:
[ 2,
[1],
[3] ]
Prof. Dr. Dietmar Seipel 467
![Page 53: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/53.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
/* insert_into_binary_tree(Key, Tree, New_Tree) <-
*/
insert_into_binary_tree(Key, Tree, New_Tree) :-
binary_tree_parse(Tree, Root, Left, Right),
( ( Key = Root, % Key is already in Tree
New_Tree = Tree )
; ( Key < Root,
insert_into_binary_tree(Key, Left, L),
binary_tree_parse(New_Tree, Root, L, Right) )
; ( Key > Root,
insert_into_binary_tree(Key, Right, R),
binary_tree_parse(New_Tree, Root, Left, R) ) ).
insert_into_binary_tree(Key, Tree, New_Tree) :-
binary_tree_empty(Tree),
binary_tree_parse(New_Tree, Key, Tree, Tree).
Prof. Dr. Dietmar Seipel 468
![Page 54: Algorithmenmuster (Design Patterns): Scanline, Rekursion ... · mit einer geeigneten Greedy–Methode die Optimallösung finden. Bei anderen Problemen wie etwa dem Rucksackproblem](https://reader030.vdocuments.mx/reader030/viewer/2022040701/5d5aac6b88c99374018b4c7e/html5/thumbnails/54.jpg)
Praktische Informatik I – Algorithmen und Datenstrukturen Wintersemester 2006/07
/* keys_to_binary_tree(Keys, Tree) <-
*/
keys_to_binary_tree(Keys, Tree) :-
binary_tree_empty(Empty),
insert_into_binary_tree_(Keys, Empty, Tree).
/* insert_into_binary_tree_(Keys, Tree, New_Tree) <-
*/
insert_into_binary_tree_([], Tree, Tree).
insert_into_binary_tree_([Key|Keys], Tree, New_Tree) :-
insert_into_binary_tree(Key, Tree, Tree_2),
insert_into_binary_tree_(Keys, Tree_2, New_Tree).
Prof. Dr. Dietmar Seipel 469