Zahlen in Haskell Kapitel 3



Ähnliche Dokumente
ALP I. Funktionale Programmierung

WS 2011/2012. Georg Sauthoff 1. November 11, 2011

Programmieren in Haskell Einstieg in Haskell

Einführung in die funktionale Programmierung

Programmieren in Haskell

Grundlegende Datentypen

Proinformatik Marco Block Dienstag, den 21. Juli 2009

Typ-Polymorphismus. November 12, 2014

Grundlegende Datentypen

Funktionale Programmierung Grundlegende Datentypen

Programmieren in Haskell

Programmieren in Haskell

Grundlegende Datentypen

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

Typklassen. Natascha Widder

Funktionales Programmieren

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zur Übungsklausur -

Funktionale Programmierung Mehr funktionale Muster

Programmieren in Haskell

Paradigmen der Programmierung

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

HASKELL KAPITEL 2.1. Notationen: Currying und das Lambda-Kalkül

Programmieren in Haskell Das Haskell Typsystem

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

Einführung in Haskell

Kapitel 3: Eine einfache Programmiersprache. Programmieren in Haskell 1

Inhaltsverzeichnis. 1 Polynomordungen [9 Punkte] 2. 2 System F [9 Punkte] 3. 3 Strukturelle Induktion und Folds [9 Punkte] 4

Beispiele: Funktionsabstraktion (3) Funktionsdeklaration. Funktionsdeklaration (2) Funktionsdeklaration (3) 3. Abstraktion über Funktionsbezeichner:

Haskell for Hackers... or why functional programming matters

Crashkurs Haskell Mentoring WiSe 2016/17. Anja Wolffgramm Freie Universität Berlin

2.2.1 Algebraische Spezifikation (Fortsetzung)

Prüfung Funktionale Programmierung

Prüfung Funktionale Programmierung

Teil II. Datentypen. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2017/

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

float: Fließkommazahl nach IEEE 754 Standard mit 32 bit

2. Imperative Programmierung und Berechenbarkeit - Registermaschinen -

Grundlagen der Programmierung 3 A

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

WS 2011/2012. Robert Giegerich. October 30, 2013

ALP I. Funktionale Programmierung

Funktionale Programmierung ALP I. Algebraische Datentypen und Abstrakte Datentypen. SS 2013 Prof. Dr. Margarita Esponda. Prof. Dr.

Funktionale Programmierung mit Haskell

Reelle Zahlen. Einzelzeichen. Bereiche. Aufzählungen. direkt zusammengesetzte Datentypen. einfache Datentypen: Zusammenfassung. kartesisches Produkt

Programmieren in Haskell Programmiermethodik

Modul 122 VBA Scribt.docx

Crashkurs: Haskell. Mentoring FU Berlin Felix Droop

Workshop Einführung in die Sprache Haskell

Grundlagen der Programmierung 3 A

ALP I Einführung in Haskell

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell

Programmierkurs II. Typsynonyme & algebraische Datentypen

12. Rekursion Grundlagen der Programmierung 1 (Java)

Intensivübung zu Algorithmen und Datenstrukturen

WS 2011/2012. Robert Giegerich. October 17, 2012

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Datentypen und Operatoren Ganzzahlige Numerische Datentypen Logischer Datentyp

Einführung in die Informatik 2

Theorembeweiserpraktikum SS 2016

Informatik 1 ( ) D-MAVT F2010. Kontrollanweisungen 1, ASCII. Yves Brise Übungsstunde 3

WS 2012/2013. Robert Giegerich. January 22, 2014

Datentypen: integer, char, string, boolean

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

Geheimnisprinzip: (information hiding principle, Parnas 1972)

Basiskonstrukte von Haskell

1. Typen 1.1 Typsicherheit 1.2 Typprüfung

HASKELL KAPITEL 5. Rekursion

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

Algorithmen und Datenstrukturen I

Monoide. Funktionale Programmierung. Prof. Dr. Oliver Braun Letzte Änderung: :54. Monoide 1/16

Vorkurs Informatik WiSe 16/17

Programmierung 1 - Repetitorium

Informatik A WS 2007/08. Nachklausur

C.3 Funktionen und Prozeduren

2.3 Spezifikation von Abstrakten Datentypen

Grundlagen der Programmierung 2. Operationale Semantik

Kapitel 6: Abstraktion. Programmieren in Haskell 1

Einführung in die Funktionale Programmierung mit Haskell

Die Korrektheit von Mergesort

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Praktische Informatik 3: Funktionale Programmierung Vorlesung 2 vom : Funktionen und Datentypen

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

1 Potenzen und Polynome

Funktionale Programmierung. Monoide. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Funktionale Programmierung mit Haskell

2 Rationale und reelle Zahlen

4. Zahlendarstellungen

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Haskell für Mathematiker

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

HASKELL KAPITEL 8. Bäume

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen:

WS 2012/2013. Robert Giegerich. 21. November 2012

Theoretische Informatik II

Transkript:

Einführung in die Funktionale Programmiersprache Haskell Zahlen in Haskell Kapitel 3 FH Wedel IT-Seminar: WS 2003/04 Dozent: Prof. Dr. Schmidt Autor: Timo Wlecke (wi3309) Vortrag am: 04.11.2003

- Kapitel 3 Bereits bekannt: Integer, Int und Float Heute: Datentypen und Definitionen Primitive Datentypen werden deklariert Beweis durch (vollständige) Rationale und komplexe Zahlen Es geht um verschiedene Zahlenmengen und dazugehörige Operationen

Natürliche Zahlen 0, 1, 2... Succ = Nachfolger data Nat = Zero Succ Nat Bsp.: Succ(Succ(Succ Zero))) 3 Einfache arithmetische Funktionen für Nat, z.b. hier die Addition: (+) :: Nat Nat Nat m + Zero = m m + Succ n = Succ(m + n)

Natürliche Zahlen Instanz-Deklaration: instance Eq Nat where Zero == Zero = True Zero == Succ n = False Succ m == Zero = False Succ m == Succ n = (m == n)

Natürliche Zahlen Alternative Deklaration: data Nat = Zero Succ Nat deriving (Eq, Ord, Show) Subtraktion ist eine partielle Funktion Einführung der Integer (-) :: Nat Nat Nat m - Zero = m Succ m - Succ n = m - n

Partielle Zahlen Spezialfälle natürlicher und anderer Zahlen: Undefinierte Werte und unendliche Werte Undefinierte Zahlen: undefined :: Nat undefined = undefined dargestellt als, Succ, Succ(Succ ),...

Partielle Zahlen Wert infinity infinity :: Nat infinity = Succ infinity Größtes Element aus Nat Einzige Zahl x, für die immer Succ m < x = true Für alle Zahlen n gilt infinity + n = infinity aber nur für endliche Zahlen n + infinity = infinity

Grundlagen der Logisches Verfahren, um vom Besonderen auf das Allgemeine zu schließen Prüfung der Gültigkeit von Eigenschaften durch Pattern-Matching Um zu zeigen, dass eine Eigenschaft P(n) für jede endliche Zahl n aus Nat gilt, ist es ausreichend, dass: P(Zero) gilt und wenn P(n) gilt, dass in dem Fall auch P(Succ n) gültig ist. (Prinzip der strukturellen )

Grundlagen der Beispiel: Zero + n = n (shypothese) Ersetzen von n erst durch Zero, dann durch Succ n Case (Zero): Zero + Zero = Zero. Case (Succ n): Zero + Succ n = Succ n Zero + Succ n = {2. Gleichung für (+)} Succ(Zero + n) = {shypothese} Succ n

Grundlagen der Fast automatischer Prozess: Beide Seiten substituieren und dadurch vereinfachen Vereinfachungsschritt wird durch die Form des Ausdrucks bestimmt Entscheidend ist Wahl der richtigen Variablen

Vollständige wird jetzt mit einbezogen Um zu zeigen, dass eine Eigenschaft P(n) gilt, muss bewiesen werden, dass: P( ) gilt, P(Zero) gilt und wenn P(n) gilt, dass in dem Fall auch P(Succ n) gültig ist.

Programmsynthese Umkehrung der nutzen, um Funktionsdefinitionen zu synthetisieren Beispiel Subtraktion: (m + n) - n = m n,m Ersetzen von n durch Zero: (m + Zero) - Zero = m {1. Gleichung für (+)} m - Zero = m

Programmsynthese Ersetzen von n durch Succ n: (m + Succ n) - Succ n = m {2. Gleichung für (+)} Succ(m + n) - Succ n = m {Hypothese (m + n) - n = m} Succ(m + n) - Succ n = (m + n) - n Ergebnis: m - Zero = m Succ m - Succ n = m - n

Grundlagen Fold Mächtige Funktion Zusammenfalten von Funktionen Vorteil: Definitionen werden kürzer, da nur eine Gleichung geschrieben werden muss statt zwei Oft effizienter als direkte rekursive Definition Es ist möglich, generelle Eigenschaften von foldn zu prüfen für den Beweis von spezifischen Fällen zu nutzen Interessant v.a. für Listen und Bäume

Grundlagen Fold foldn :: (α α) α Nat α foldn h c Zero = c foldn h c (Succ n) = h(foldn h c n) foldn (+ 6) 5 4 = 4. 6 + 3. 6 + 2. 6 + 1. 6 + 0. 5 = 29

Fusion Gehört in den Bereich der Fusion = Verschmelzung Fusionssatz: f foldn g a = foldn h b Gilt für die enthaltenen Variablen, wenn f bestimmte Bedingungen erfüllt Berechnung von f verschmilzt mit der Berechnung von foldn g a Erhebliche Effizienzsteigerung möglich

Grundlagen 3 Arten von Integer (positive, Null und negative) data Integer = Neg Positive Zero Pos Positive data Positive = One Succ Positive Approximationen von reellen Zahlen als Sequenz von Dezimalzahlen Definition der Arithmetik durch symbolische Rechenwege

Grundlagen Haskell kennt u.a. folgende Datentypen: Int Integer Float Double Rational Complex...

Grundlagen Nat existiert in Haskell nicht (selbst deklariert), aber... weiterhin Nutzung von Pattern-Matching durch Rekursion: fak :: Integer Integer fak 0 = 1 fak(n + 1) = (n + 1) * fak n keine partiellen Zahlen in der Arithmetik

Numerische Alle Zahlentypen in Haskell sind Instanzen der Typklasse Num Nutzung der gleichen Symbole +, *,..., jedoch mit unterschiedlicher Bedeutung class (Eq α, Show α) => Num α where (+),(-),(*) :: α α α negate :: α α frominteger :: Integer α x - y = x + negate y

Rationale Zahlen Integer-Paar (x, y) repräsentiert den Bruch x/y (1, 7), (3, 21), (168, 1176) 1/7 Wohldefinierte Werte, wenn y 0 Unendlich viele Möglichkeiten der Darstellung Kanonische Form Repräsentation durch ein Paar, für das gilt: y > 0 gcd(x, y) = 1 Rational als Datentyp in Haskell: newtype Rational = Rat (Integer, Integer)

Rationale Zahlen Erzeugung durch die Funktion mkrat: mkrat mkrat(x,y) :: (Integer, Integer) Rational = Rat((div u d), (div v d)) where u = x*(signum y) v = abs y d = ggt u v Wird benutzt um kanonische Form zu sichern

Rationale Zahlen Vergleichsoperationen selbst definieren Paare: (2, 1) < (3, 2), aber rationale Zahlen: 2 > 3/2 instance Eq Rational where Rat(x, y) == Rat(u, v) = (x * v) == (v * y) instance Ord Rational where Rat(x, y) < Rat(u, v) = (x * v) < (v * y) Rat(x, y) > Rat(u, v) = (x * v) > (v * y) Ausgabe von rationalen Zahlen showrat(rat (x,y)) = if y == 1 then show x else show x ++ "/" ++ show y

Binäre Suche Lineare Suche ineffizient Prinzip der binären Suche ist bekannt: x wird in einem begrenzten Wertebereich gesucht Mittelwert der Bereichsgrenzen bestimmen ist x kleiner, dann vordere Hälfte durchsuchen, sonst hintere Anzahl der Schritte verhält sich proportional zu log 2 (abs x)

Binäre Suche Beispiel Wurzeln: eps :: Float eps = 0.0001 sqrt :: Float Float sqrt x = until done improve x where done y = (abs(y * y - x) < eps) improve y = (y + x/y)/2

Church-Zahlen Alonzo Church, 1940-er Jahre praktischer Nutzen? Datentypen sind überflüssig, ausschließlich Nutzung von Funktionen Beispiel: Bool true, false :: α α α true x y = x false x y = y type Cbool α = α α α

Haben Sie... Fragen? Anmerkungen? Sonstiges?

Vielen Dank für die Aufmerksamkeit!