HASKELL KAPITEL 8. Bäume

Ähnliche Dokumente
Agenda. 1 Einleitung. 2 Binäre Bäume. 3 Binäre Suchbäume. 4 Rose Trees. 5 Zusammenfassung & Ausblick. Haskell Bäume. Einleitung.

Programmieren in Haskell Programmiermethodik

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10

Funktionale Programmierung mit Haskell

Strukturelle Rekursion und Induktion

Tag 7. Pattern Matching und eigene Datentypen

expr :: Expr expr = Mul (Add (Const 3) (Const 4)) (Div (Sub (Const 73) (Const 37)) (Const 6))

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Binäre Bäume Darstellung und Traversierung

Effizienz in Haskell

Datenstrukturen & Algorithmen

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Algorithmen und Datenstrukturen Suchbaum

Zahlen in Haskell Kapitel 3

Vorlesung Datenstrukturen

Programmieren in Haskell Einführung

XML Verarbeitung mit einer in Haskell eingebetteten DSL. Manuel Ohlendorf (xi2079)

Tutorium - Haskell in der Schule. Ralf Dorn - Dennis Buchmann - Felix Last - Carl Ambroselli

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Mathematik für Informatiker I

SS / 16 schrittweise Verfeinerung -> Wirth, 1971, Programm Development by Stepwise Refinement

Funktionale Programmiersprachen

4.Grundsätzliche Programmentwicklungsmethoden

Binärbäume als weiteres Beispiel für abstrakte Datentypen in PVS mit in Knoten gespeicherten Werten vom Typ T:

Algorithmen und Datenstrukturen 1

Funktionale Programmierung

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Vorkurs Mathematik und Informatik Mengen, natürliche Zahlen, Induktion

Grundlagen der Programmierung 2. Bäume

Algorithmen, Datenstrukturen und Programmieren II SS 2001

Fakultät Wirtschaftswissenschaft

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Grundlagen der Informatik I (Studiengang Medieninformatik)

t r Lineare Codierung von Binärbbäumen (Wörter über dem Alphabet {, }) Beispiel code( ) = code(, t l, t r ) = code(t l ) code(t r )

Semantische Bewertung und personalisierte Erzeugung von Übungsaufgaben zu Mathematik, Logik, Informatik

2.11 Kontextfreie Grammatiken und Parsebäume

Heutiges Thema... Datenstrukturen in Haskell... Algebraische Datentypen (data Tree =...) Typsynonyme (type Student =...)

WS 2009/10. Diskrete Strukturen

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Theoretische Grundlagen der Informatik

Grammatiken. Eine Grammatik G mit Alphabet Σ besteht aus: Variablen V. Startsymbol S V. Kurzschreibweise G = (V, Σ, P, S)

Informatik II Bäume. Beispiele. G. Zachmann Clausthal University, Germany Stammbaum. Stammbaum. Stammbaum

Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen

Tutoren Simon Andermatt Lukas Beck. Alexis Peter Thomas Ritter

Formale Sprachen. Script, Kapitel 4. Grammatiken

Funktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS Prof. Dr. Margarita Esponda. Prof. Dr.

Funktionale Programmierung mit Haskell

KONSTRUKTION VON ROT-SCHWARZ-BÄUMEN

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Rekursiv aufzählbare Sprachen

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Inhaltsverzeichnis. Einführende Bemerkungen 11. Das Fach Informatik 11 Zielsetzung der Vorlesung Grundbegriffe

Praktische Informatik 3: Funktionale Programmierung Vorlesung 3 vom : Algebraische Datentypen

Formale Methoden 1. Gerhard Jäger 12. Dezember Uni Bielefeld, WS 2007/2008 1/22

Programmierung und Modellierung

Programmierung mit C Zeiger

Algorithmen und Datenstrukturen

Funktionale Programmierung mit Haskell. Jan Hermanns

Rhetorik und Argumentationstheorie.

ALP I Einführung in Haskell

DATENSTRUKTUREN UND ZAHLENSYSTEME

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

1 Potenzen und Polynome

Tutoraufgabe 1 (Datenstrukturen in Haskell):

Funktionale Programmierung mit Haskell

Theoretische Informatik I

Grundbegriffe der Informatik

Geordnete Binärbäume

Tutoren Jan Ebbe Pat Mächler Valentino Rugolo Sascha Scherrer. Grundlagen der Programmierung (CS101) - Blatt 8 Theorie [4 Punkte] - Praxis [12 Punkte]

Definieren Sie eine Funktion circlearea zur Berechnung der Fläche eines Kreises mit gegebenen Radius (Float).

2.5 Primitive Datentypen

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

Datenstruktur zum Speichern einer endlichen Menge M von Zahlen. Genauer:

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Euler-Venn-Diagramme

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Suchbäume mit inneren Knoten verschiedener Knotengrade.

Formale Sprachen, reguläre und kontextfreie Grammatiken

Welche Informatik-Kenntnisse bringen Sie mit?

Einführung in die Java- Programmierung

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

Angewandte Mathematik und Programmierung

Kapitel 7: Benutzerdefinierte Datentypen

Programmieren in Haskell

WS 2011/2012. Georg Sauthoff 1. October 18, 2011

Elementare Konzepte von

Transkript:

HASKELL KAPITEL 8 Bäume

Baum rekursiv definierte Datenstruktur nicht linear vielerlei Varianten: Struktur der Verzweigung, Ort der gespeicherten Information (Knoten, Kanten, Blätter ) 2

Binärbaum Jeder Knoten hat keinen oder zwei Nachfolger Ort der gespeicherten Information: Blätter data Btree α = Leaf α Fork (Btree α ) (Btree α ) Beispiele: Fork ( Leaf 1) (Fork (Leaf 2) (Leaf 3)) Fork (Fork (Leaf 1) (Leaf 2)) ( Leaf 3) Fork Fork Fork Leaf 1 Leaf 2 Leaf 3 Fork Leaf 1 Leaf 2 Leaf 3 3

Binärbaum Jeder Knoten hat keinen oder zwei Nachfolger Ort der gespeicherten Information: Blätter data Btree α = Leaf α Fork (Btree α ) (Btree α ) Beispiele: Fork ( Leaf 1) (Fork (Leaf 2) (Leaf 3)) Fork (Fork (Leaf 1) (Leaf 2)) ( Leaf 3) Darstellung der Beispiele als Klammerstruktur: 1 ( 2 3 ) ( 1 2 ) 3 4

Induktion auf Binärbäumen Aufgabe: Zeige, dass eine Eigenschaft P für jeden Binärbaum xt gilt. Verfahren: 1. Zeige P(xt) für den Fall, dass xt ein Blatt ist. 2. Zeige P( Fork ( yt ) ( zt )) unter der Annahme, dass yt und zt Bäume sind, und dass P(yt) und P(zt) gelten. 3. Falls xt unendlich wachsen kann: Zeige P( ). 5

Blattzahl und Blattliste size :: Btree α Int size (Leaf x ) = 1 size ( Fork xt yt ) = size xt + size yt flatten :: Btree α [α] flatten (Leaf x) = [x] flatten( Fork xt yt ) = flatten xt ++ flatten yt 6

Zahl innerer Knoten und Höhe nodes :: Btree α Int nodes (Leaf x ) = 0 nodes ( Fork xt yt ) = 1 + nodes xt + nodese yt height :: Btree α Int height (Leaf x) = 0 height( Fork xt yt ) = 1 + (height xt max height yt) Haskell Schlüsselwort: Maximum in Infix-Notation 7

Tiefe der Blätter ersetze jeden Knoten durch die Länge seines Weges zur Wurzel depth :: Btree α Btree Int depth = down 0 down :: Int Btree α Btree Int down n (Leaf x) = Leaf n down n ( Fork xt yt ) = Fork (down (n + 1) xt ) (down (n + 1) yt ) 8

größtes Blatt maxbtree :: (Ord α) e Btree α α maxbtree(leaf x) = x maxbtree( Fork xt yt ) = ( maxbtree xt ) max ( maxbtree yt ) 9

mapbtree ersetze jedes Blatt a durch f a. mapbtree :: (α β) Btree α Btreeβ mapbtree f (Leaf x) = Leaf ( f x) mapbtree f ( Fork xt yt ) = Fork ( mapbtree f xt ) ( mapbtree f yt) 10

foldbtree eine vielseitig nutzbare Funktion. Ergänzt mapbtree (für die Transformation von Blättern) um eine Transformation für Teilbäume. foldbtree :: (α β ) (β β β ) Btree α β foldbtree f g (Leaf x) = f x foldbtree f g ( Fork xt yt ) = g ( foldbtree f g xt) (foldbtree f g yt ) 11

size mit foldbtree foldbtree :: (α β ) (β β β ) Btree α β foldbtree f g (Leaf x) = f x foldbtree f g ( Fork xt yt ) = g ( foldbtree f g xt) (foldbtree f g yt ) size :: Btree α Int size (Leaf x ) = 1 size ( Fork xt yt ) = size xt + size yt size = foldbtreee (const 1) (+) mit const :: α β α const x y = x 12

height mit foldbtree foldbtree :: (α β ) (β β β ) Btree α β foldbtree f g (Leaf x) = f x foldbtree f g ( Fork xt yt ) = g ( foldbtree f g xt) (foldbtree f g yt ) height :: Btree α Int height (Leaf x) = 0 height( Fork xt yt ) = 1 + (height xt max height yt) height = foldbtreee (const 0) ( ) where m n = 1 + (m max n) 13

flatten mit foldbtree foldbtree :: (α β ) (β β β ) Btree α β foldbtree f g (Leaf x) = f x foldbtree f g ( Fork xt yt ) = g ( foldbtree f g xt) (foldbtree f g yt ) flatten :: Btree α [α] flatten (Leaf x) = [x] flatten( Fork xt yt ) = flatten xt ++ flatten yt flatten = foldbtreee wrap (++) mit wrap :: α [α] wrap x = [x] 14

mapbtree mit foldbtree foldbtree :: (α β ) (β β β ) Btree α β foldbtree f g (Leaf x) = f x foldbtree f g ( Fork xt yt ) = g ( foldbtree f g xt) (foldbtree f g yt ) mapbtree :: (α β ) Btree α Btreeβ mapbtree f (Leaf x) = Leaf ( f x) mapbtree f ( Fork xt yt ) = Fork ( mapbtree f xt ) ( mapbtree f yt) Leaf :: α Btree α Fork :: Btree α Btree α Btree α mapbtree f = foldbtreee (Leaf f ) Fork 15

ergänzte Binärbäume Jeder knoten trägt Information. Beispiel: Knotenzahl seines Teilbaumes: data Atree α = Leaf α Fork In (Btree α ) (Btree α ) etc. geht alles mit foldbtree 16

HASKELL KAPITEL 9 Module

Modularisierung Modul = Eine Struktureinheit im Programm, kapselt eine Menge von Funktionsdefinitionen, Typen, etc. Modulersteller Modulbenutzer - möchte nur einige der Funktionen - braucht oft nur einige Funktionen für Nutzer freigegeben -mag evt. andere Namen -Implementation änderbar -will vielleicht importierte Funktionen weitergeben

Module dienen der Strukturierung von Programmen; sie haben eine klare Schnittstelle (Interface), in der festgelegt wird, was sie exportieren und was sie importieren. Sie bieten: - unabhängige Programmierung von Programmteilen - - separate Compilation von Programmteilen - - Bibliotheken von Komponenten können wieder verwendet werden

Beispiele: module mymodule1 where f =... g =... Default: alles wird exportiert module mymodule2 where import mymodule1 h =... Importiert f und g

module mymodule3 (f,...) where f =... g =... Exportiert nur f,... module mymodule4 (f, module bla) where import bla f =... g =... exportiert f und re-exportiert alles aus bla

import mymodule1 (f,...) Importiert nur f,... import mymodule1 hiding (f,...) Importiert alles ausser f,... import mymodule1 renaming (f to fff, g to ggg) Import mit Umbenennung

HASKELL KAPITEL 10 Zusammenfassung

Haskell hat ein Universum U von Werten. U ist in Teilmengen partitioniert. Jede solche Teilmenge von U ist ein Typ. Vordefinierte (einfache) Typen: Integer, Float, Bool, Char (natürliche Zahlen, Gleitkomma-Zahlen, die logischen Werte, die Symbole) Zusammengesetzte Typen: Funktionen, Listen, Bäume, etc. über gegebenen Typen

strenge Typisierung Jeder Term gehört zu genau einem Typ. Konsequenz: quad :: Integer Integer quad x = square square x erzeugt einen Typ-Fehler, weil square für Float definiert ist. Vorteil strenger Typisierung: prima Erkennung von Fehlern. Zwingt den Programmierer zu klarem Denken. 18

Polymorphe Typen Beispiel: square :: Integer Integer sqrt :: Integer Float Daraus ableitbar: square square :: Integer Integer sqrt square :: Integer Float Problem: braucht 2 verschiedene Def. von : ( ) :: (Int Int ) (Int Int ) (Int Int) ( ) :: (Int Float ) (Int Int ) (Int Float ) Lösung: Typ-Variablen α, β, γ. Damit: ( ) :: (β γ) (α β) (α γ) 19

Verwendung von Typ-Variablen Beispiel: Die Funktion error soll ein (Text-)Argument auf unspezifizierte Weise weiterverarbeiten. Nicht einmal der Typ des Resultats ist bekannt. Mit Typ- Variable sei error :: String α Daraus konstruierbar: fact :: Integer Integer Integer fact n x < 0 = error negative argument to fact x == 0 = 1 x > 0 = n * fact (n 1) 20

Grundlegende Fragen Wie bezieht sich Haskell (und andere Programmiersprachen) auf die Realität? Wo zweigt die Informatik von der Mathematik ab? Was bedeuten rechentechnische Schranken für die Semantik der Sprachen? Was ist die Rolle von??

Hintergrund: Realität und Mathematik Menge (nach Cantor), Eine Zusammenfassung von Gegenständen unserer Anschauung oder unseres Denkens Struktur (nach Tsarski): eine Menge ( Träger ) der Struktur, zusammen mit endlich vielen Konstante und endlich vielen Operationen. Basis der Prädikatenlogik. Programmieren: Strukturen konstruieren... so gut wie möglich 22

Haskell: Werte und Typen Universum (universe) die Menge der uns interessierenden Dinge. Wert (value) Elemente des Universums. Für Haskell das einzig wichtige an Werten: zwei Werte sind gleich oder verschieden Typ (Type) Struktur mit einer Teilmenge des Universums als Träger 23

Haskell: Umgang mit Typen Einige Typen gibt Haskell vor. Alle Typen sind implementierbar, einige um den Preis von Speicherüberlauf (Integer) oder ungenauen Rechnens (Float). Weitere Typen kann der Programmierer selbst ableiten, aus gegebenen und bereits abgeleiteten Typen. 24

Haskell: irreguläres Verhalten Überschreiten von Speicherschranken Überschreiten von Zeitschranken inkonsistente Typen im Programm was bedeutet das semantisch was bedeutet das mathematisch? alles abbilden auf! Sorgfalt im Umgang mit nicht-strikte Funktionen sind unausweichlich aber verhalten sich schnell nicht so, wie man will 25

HASKELL Ende Ich wünsche allen Studentinnen und Studenten erfolgreiche Prüfungen und eine erholsame Semesterpause!

Modularisierung Modul = Eine Struktureinheit im Programm, kapselt eine Menge von Funktionsdefinitionen, Typen, etc. Modulersteller Modulbenutzer - möchte nur einige der Funktionen - braucht oft nur einige Funktionen für Nutzer freigegeben -mag evt. andere Namen -Implementation änderbar -will vielleicht importierte Funktionen weitergeben

Module dienen der Strukturierung von Programmen; sie haben eine klare Schnittstelle (Interface), in der festgelegt wird, was sie exportieren und was sie importieren. Sie bieten: - unabhängige Programmierung von Programmteilen - - separate Compilation von Programmteilen - - Bibliotheken von Komponenten können wieder verwendet werden

Beispiele: module mymodule1 where f =... g =... Default: alles wird exportiert module mymodule2 where import mymodule1 h =...

Importiert f und g module mymodule3 (f,...) where f =... g =... Exportiert nur f,... module mymodule4 (f, module bla) where import bla f =... g =...

exportiert f und re-exportiert alles aus bla import mymodule1 (f,...) Importiert nur f,... import mymodule1 hiding (f,...) Importiert alles ausser f,... import mymodule1 renaming (f to fff, g to ggg)

Import mit Umbenennung