Software Entwicklung 1

Ähnliche Dokumente
Einführung in die Programmierung

Der λ-kalkül. Frank Huch. Sommersemester 2015

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

Die Programmiersprache C Eine Einführung

Funktionale Programmierung

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Programmiersprachen. Organisation und Einführung. Berthold Hoffmann. Studiengang Informatik Universität Bremen

5 Logische Programmierung

Modellierung und Programmierung 1

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

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

C.3 Funktionen und Prozeduren

Proseminar Funktionales Programmieren. Stephan Kreutzer

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen. I.2. I.2. Grundlagen von von Programmiersprachen.

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

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

Organisatorisches/Einstieg

Softwaretechnik. Funktionale Programmierung. Christian Lindig. 23. Januar Lehrstuhl für Softwaretechnik Universität des Saarlandes

Funktionale Programmierung mit Haskell

Entwicklung eines korrekten Übersetzers

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

Sudoku. Warum 6? Warum 6?

12. Rekursion Grundlagen der Programmierung 1 (Java)

Kapitel 5: Applikative Programmierung

Funktionale Programmierung

Fragen. f [ ] = [ ] f (x : y : ys) = x y : f ys f (x : xs) = f (x : x : xs) Wozu evaluiert f [1, 2, 3] (Abkürzung für f (1 : 2 : 3 : [ ]))?

Grundlagen der Informatik I (Studiengang Medieninformatik)

Allgemeines. Verschiedene Sprachkonzepte C-Sprachfamilie C-ähnliche Programmiersprachen Allgemeines zu C. #include <stdio.h>

Funktionale Programmierung (in Clojure)

Programmieren in C. Rekursive Funktionen. Prof. Dr. Nikolaus Wulff

JAVA - Methoden

Grundkurs funktionale Programmierung mit Scala

Funktionale Programmierung

FachPraktikum 1590 Erweiterbare Datenbanksysteme. Aufgaben Phase 1

Syntax von LOOP-Programmen

ALP I Einführung in Haskell

Grundlagen der Programmierung in C Funktionen

Verträge für die funktionale Programmierung Design und Implementierung

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 1. Einführung und Grundbegriffe

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

Kapitel 7 des Buches, von Java-Selbstbau nach Scala-Library portiert Christoph Knabe

Funktionale Programmierung. Funktionale Programmierung: Vorlesungsüberblick. Eigenschaften rein funktionaler Programmierung

Funktionale Programmierung mit C++

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

Praktikum Ingenieurinformatik. Termin 4. Funktionen, numerische Integration

SWP Logische Programme

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Programmierung in Python

Grundlagen der Programmierung

Einführung in die Informatik

Java Kurs für Anfänger Einheit 5 Methoden

Informatik Java-Programmierkurs im Rahmen der Berufs- u. Studienorientierung für Schüler. Joliot-Curie-Gymnasium GR 2010 Nico Steinbach

Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom : Rekursive Datentypen

Formale Semantik. λ Typenlogik. Tutorium WiSe 2013/ November Sitzung: Folien freundlicherweise bereitgestellt von Andreas Bischoff

Abstrakte Algorithmen und Sprachkonzepte

SQL. strukturierte Datenbankabfragesprache eine Datenbanksprache zur. Structured Query Language:

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

1 Vom Problem zum Programm

Übersicht. Einführung in die Funktionale Programmierung: Einleitung & Motivation. Klassifizierung von Programmiersprachen (1)

Einführung in die Funktionale Programmierung: Einleitung & Motivation

Programmierparadigmen

Programmierung 1 - Repetitorium

Grundlagen der Programmierung

Java I Vorlesung 1 Einführung in Java

Programmierkurs Java

Interpreter - Gliederung

Programmierkurs Python I

Kontrollstrukturen - Universität Köln

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

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare

Die Programmiersprache Scheme... DrRacket: Die Programmierumgebung Sprache: Semantik. Sprache: Syntax

Funktionale Programmierung mit Haskell. Jan Hermanns

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Angewandte Mathematik und Programmierung

Ich liebe Java && Ich liebe C# Rolf Borst

00. Einiges zum Vektorraum R n

Logic in a Nutshell. Christian Liguda

3. Grundlegende Sprachkonstruktionen imperativer Programme

Repetitorium Informatik (Java)

Algorithmen und Datenstrukturen Laufzeitabschätzung

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

L4. Erster Schritt zum Programmieren

Einführung in die C-Programmierung

Einführung in die Programmierung WS 2014/ Algorithmus, Berechenbarkeit und Programmiersprachen 2-1

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Java Einführung Methoden. Kapitel 6

Einstieg in die Informatik mit Java

Eine Einführung in C-Funktionen

Funktionales Programmieren in Python

Einstieg in die Informatik mit Java

Teil 1: Einführung 1.5 Programmierparadigmen Prof. Dr. Max Mühlhäuser FG Telekooperation TU-Darmstadt

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

Was ist Logische Programmierung?

Escher funktionale und logische Programmierung

Einführung in die Java- Programmierung

1. Erläutern Sie die Aufgaben von Datentypen in der imperativen Programmierung.

Einführung in die Informatik 1

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Transkript:

Software Entwicklung 1 Annette Bieniusa AG Softech FB Informatik TU Kaiserslautern

Überblick für heute Programmierparadigmen Imperative vs. deklarative Programmierung Beispiele Funktionale Programmierung Wichtige Eigenschaften (Referentielle Transparenz) Theoretische Grundlage: Lambda-Kalkül Funktionen höherer Ordnung: map, filter, fold Bieniusa/Zeller/Weber Software Entwicklung 1 2/ 33

Programmierparadigmen Bieniusa/Zeller/Weber Software Entwicklung 1 3/ 33

Imperative Programmierung Programm = Folge von Anweisungen bzw. Befehlen, die in vorgegebener Reihenfolge abgearbeitet werden Entspricht der Arbeitsweise von Prozessoren Beispiele: C/C++, Java, Assembler, Pascal, Delphi,... Strukturierte Programmierung: Kontrollfluss durch Verzweigungen und Schleifen Prozedurale Programmierung: Abstraktionsmechanismus durch Prozeduren/Methoden Wie wird etwas berechnet? Bieniusa/Zeller/Weber Software Entwicklung 1 4/ 33

Deklarative Programmierung Was wird berechnet? Beschreibt die Programmlogik, ohne den Kontrollfluss zu beschreiben Besteht daher nicht aus Anweisungen Basiert auf mathematischen Theorien Erlaubt relativ einfache Beweise über die Eigenschaften von Programmen Beispiele: LISP, ML, OCaml, Oz, Haskell, Scheme, Erlang, Prolog, Curry, SQL, etc. Bieniusa/Zeller/Weber Software Entwicklung 1 5/ 33

Beispiel für deklarative Programmierung: Funktionale Programmierung Beispiel: Programmiersprache Haskell Basiert auf dem Lambda-Kalkül Beschreibt Berechnungen als (math.) Funktionen quicksort [] = [] quicksort ( x: xs) = quicksort [ n n <- xs, n < x] ++ [x] ++ quicksort [ n n <- xs, n >= x] Bieniusa/Zeller/Weber Software Entwicklung 1 6/ 33

Beispiel für deklarative Programmierung: Anfragesprachen Beispiel: Datenbanksprache SQL (Structured Query Language) Basiert auf relationaler Algebra Definiert Struktur von Datenbanktabellen, ermittelt und modifiziert Einträge UPDATE salary SET income = income + 0.1 * income WHERE status = employed Bieniusa/Zeller/Weber Software Entwicklung 1 7/ 33

Beispiel für deklarative Programmierung: Logische Programmierung Beispiel: Prolog Basiert auf Logik-Kalkül Verwendet Fakten und Regeln, um Anfragen an eine Datenbasis zu beantworten father ( abraham, isaac ). mother ( sarah, isaac ). male ( isaac ). son (X,Y) :- father (Y,X), male (X). Die Anfrage, wer der Sohn von Isaac ist, wird wie folgt aufgelöst:?- son (X, abraham ). X = isaac Bieniusa/Zeller/Weber Software Entwicklung 1 8/ 33

Bemerkung Verschiedene Ausprägungen von deklarativer und imperativer Programmierung Objekt-orientiert Aspekt-orientiert etc. Sprachen sind meist nicht streng an ein Paradigma gebunden, sondern entwickeln sich Bieniusa/Zeller/Weber Software Entwicklung 1 9/ 33

Funktionale Programmierung Bieniusa/Zeller/Weber Software Entwicklung 1 10/ 33

Funktionale Programmierung I Programme bestehen im Kern aus Funktionen und Funktionsanwendungen Funktion bildet Eingabewerte auf Ausgaben ab Bei gleicher Eingabe wird bei jedem Funktionsaufruf die gleiche Ausgabe geliefert int a = 2; int a = 2; int x = f(a); int x = f(a); int y = x + x; int y = f( a) + f( a); Bieniusa/Zeller/Weber Software Entwicklung 1 11/ 33

Funktionale Programmierung II int a = 2; int a = 2; int x = f(a); int x = f(a); int y = x + x; int y = f( a) + f( a); Frage Welche Werte nehmen x und y für das linke und das rechte Beispiel mit der gegebenen Java-Implementierung an? static int y = 0; static int f( a) { y ++; return a + y; } Bieniusa/Zeller/Weber Software Entwicklung 1 12/ 33

Eigenschaften funktionaler Programmierung Referentielle Transparenz Ausdrücke haben einen eindeutigen Wert Wert hängt ausschließlich von den Werten der Teilausdrücke ab Funktionen als Werte können an Variablen gebunden werden können als Argumente übergeben werden auch als Rückgabe einer Funktion verwendet werden Bieniusa/Zeller/Weber Software Entwicklung 1 13/ 33

Der Lambda-Kalkül Syntax: Formale Sprache mit Regeln zur Auswertung von Funktionen Alle berechenbaren Funktionen können in ihm kodiert werden Funktionales Pendant zur Turing-Maschine Γ = (N, T, Π, E) N = {E} T = {λ,, (, ), id} Π = E id E (λ id E) E (E E) Variable Funktionsabstraktion Funktionsanwendung Bieniusa/Zeller/Weber Software Entwicklung 1 14/ 33

Beispiele Beispiel Bedeutung (f x) Aufruf der Funktion f mit Argument x (f (g x)) Aufruf der Funktion f mit Argument (g x) ((f g) x) Aufruf der Funktion (f g) mit Argument x ((f g) liefert eine Funktion) (λx (f (f x))) Funktion, die x nimmt und zweimal f anwendet ((λx (f (f x))) y) Aufruf der obigen Funktion mit Argument y Beachte Klammernsetzung! Funktionen sind anonym Konventionen: (λx y t) statt (λx (λy t)) (f x y) statt ((f x) y) (λx f x) statt (λx (f x)) Bieniusa/Zeller/Weber Software Entwicklung 1 15/ 33

Variablenbindung Verwendung einer Variable bezieht sich immer auf den gleichnamigen Parameter der nächsten umschließenden Funktionsabstraktion Falls keine solche Parameterdeklaration existiert, ist die Variable frei. Formale Definition Frage FV(x) = {x} für eine Variable x FV(λx e) = FV(e) \ {x} FV(f g) = FV(f) FV(g) Welche der Variablen sind im folgenden Term frei bzw. gebunden? (λf (λx f (x y))) ((λy y) f) Bieniusa/Zeller/Weber Software Entwicklung 1 16/ 33

Substitution s[t/x] bezeichnet den Term, der entsteht, wenn alle freien Variablen x in s durch den Term t ersetzt werden Frage Substitution ist nicht erlaubt, wenn eine freie Variable in t nach der Substitution gebunden wäre Die Substitution ((λx f x) x)[(g y)/x] ergibt Die Substitution ((λx (λy x y z)) x)[y/z] ergibt. Bieniusa/Zeller/Weber Software Entwicklung 1 17/ 33

Substitution s[t/x] bezeichnet den Term, der entsteht, wenn alle freien Variablen x in s durch den Term t ersetzt werden Frage Substitution ist nicht erlaubt, wenn eine freie Variable in t nach der Substitution gebunden wäre Die Substitution ((λx f x) x)[(g y)/x] ergibt ((x f x) (g y)). Die Substitution ((λx (λy x y z)) x)[y/z] ist nicht erlaubt. Formale Definition: x[t/x] = t y[t/x] = y falls x y (f g)[t/x] = (f[t/x] g[t/x]) (λx e)[t/x] = (λx e) (λy e)[t/x] = (λy e[t/x]) falls x y und y / F V (t) Bieniusa/Zeller/Weber Software Entwicklung 1 17/ 33

Semantik von Lambda-Ausdrücken I α-konversion: Umbenennen von Parametern. Term λx t ist äquivalent zu λy t[y/x], wenn y nicht bereits als freie Variable im Term t vorkommt. Beispiel: λa f (f a) ist äquivalent zu λb f (f b), aber nicht zu λf f (f f) β-konversion: Auswertung von Funktionsaufrufen. Term (λx s) t ist äquivalent zu s[t/x], wenn diese Substitution erlaubt ist Beispiel: (λx plus x x) (f a) wird zu plus (f a) (f a) Evtl. zuvor α-konversion zum Umbenennen von Parametern Beispiel: (λx λy x y) (f y) erfordert α-konversion Bieniusa/Zeller/Weber Software Entwicklung 1 18/ 33

Semantik von Lambda-Ausdrücken II Ein Term ist in β-normalform, wenn keine β-umformungen mehr möglich sind (auch nicht durch weitere Umbenennungen). Beide Arten von Konversion (α und β) können auf beliebige Teilausdrücke angewandt werden. Reihenfolge der Auswertung hat dabei keinen Einfluss auf das Ergebnis. In manchen Fällen gibt es jedoch Reihenfolgen, welche zu unendlich langen Umformungen führen können, ohne dass eine β-normalform erreicht wird. Es gibt auch Terme, die für keine Reihenfolge eine β-normalform erreicht. Bieniusa/Zeller/Weber Software Entwicklung 1 19/ 33

Auswertungsstrategien call-by-value: Reduziere den äußersten Aufruf; aber nur, wenn Argumente bereits zu Variablen oder Funktionsabstraktionen ausgewertet wurden (λx x x) ((λw w) (λa a)) = (λx x x) (λa a) = (λa a) (λa a) = (λa a) call-by-name: Es wird jeweils der äußerste linkest mögliche Aufruf ausgewertet; keine Reduktion innerhalb von Funktionsabstraktionen (λx x x) ((λw w) (λa a)) = ((λw w) (λa a)) ((λw w) (λa a)) = (λa a) ((λw w) (λa a)) = (λw w) (λa a) = (λa a) Siehe Skript für schrittweise Auswertung! Bieniusa/Zeller/Weber Software Entwicklung 1 20/ 33

Frage Werten Sie den folgenden Term aus! mittels call-by-name mittels call-by-value (λx y x) (λx x) ((λx x x)(λx x x)) Bieniusa/Zeller/Weber Software Entwicklung 1 21/ 33

Erweiterungen Im Lambda-Kalkül lassen sich auch Zahlen, boolsche Werte, if-ausdrücke (if x then y else z) kodieren Beispiel: 1 = λf x f x 3 = λf x f (f (f x)) plus = λm n f x m f (n f x) Bieniusa/Zeller/Weber Software Entwicklung 1 22/ 33

Weitere Beispiele I Beispiel 1: Auswertung einer Funktion mit zwei Parametern: (λx y x + y) 3 4 = (λy 3 + y) 4 = 3 + 4 = 7 Beispiel 2: α-konversion notwendig (λx y (x + y)) y z = (λx v (x + v)) y z = (λv (y + v)) z = y + z Bieniusa/Zeller/Weber Software Entwicklung 1 23/ 33

Weitere Beispiele II Beispiel 3: Funktion als Argument (λf x f (f x)) (λy y *2) 3 = (λx (λy y *2) ((λy y *2) x)) 3 = (λy y *2) ((λy y *2) 3) = (λy y *2) (3*2) = (λy y *2) 6 = 6*2 = 12 Bieniusa/Zeller/Weber Software Entwicklung 1 24/ 33

Abstraktion über Ausdrücke Idee: Abstraktion von Ausdrücken (vergleichbar zur Abstraktion von Anweisungen bei Prozeduren) (λx y z if x <= y then if x <= z then x else z else if y <= z then y else z) Mit Abstraktion über eine Minimumfunktion: (λmin (λx y z min x (min y z))) (λx y if x <= y then x else y) Bieniusa/Zeller/Weber Software Entwicklung 1 25/ 33

Wertvereinbarung let min = (λx y if x <= y then x else y) in let min3 = (λx y z min x ( min y z)) in min3 6 3 12 Eine Wertvereinbarung weist einem Bezeichner einen Wert zu let x = s in t steht für den Term (λx t) s. Bieniusa/Zeller/Weber Software Entwicklung 1 26/ 33

Rekursion Fixpunkt-Operator erlaubt Kodierung rekursiver Funktionen fix = λf (λx f (x x)) (λx f (x x)) Man kann nachrechnen: Beispiel fix f =... = f (fix f) facr = (λf x if x == 0 then 1 else x * f ( x - 1)) fac = fix facr fac 5 =... = 5 * fac (5-1) =... = 120 Bieniusa/Zeller/Weber Software Entwicklung 1 27/ 33

Funktionen höherer Ordnung I Funktion, die eine (oder mehrere) Funktionen als Argument nimmt oder als Ergebnis liefert Parametrisierung über eine Berechnung möglich! Beispiel: Anwendung von Funktion auf alle Elemente einer Liste map (λx x + 2) [1,2,3,4] = [3,4,5,6] map (λy 3 * y) [1,2,3,4] = [3,6,9,12] Bieniusa/Zeller/Weber Software Entwicklung 1 28/ 33

Funktionen höherer Ordnung II Beispiel: Filtern von Elementen filter (λx x < 10) [1,32,7] = [1,7] filter (λx x % 2 == 0) [1,32,8] = [32,8] Beispiel: Faltung von Listelementen, ausgehend von Initialwert, mittels einer Funktion zu einem Wert foldl (λy x y + x) 0 [1,2,3] = (((0 + 1) + 2) + 3) = 6 Bieniusa/Zeller/Weber Software Entwicklung 1 29/ 33

Frage Was ist das Ergebnis der folgenden Aufrufe? map cook [,,, ] = Bieniusa/Zeller/Weber Software Entwicklung 1 30/ 33

Frage Was ist das Ergebnis der folgenden Aufrufe? map cook [,,, ] = [,,, ] Bieniusa/Zeller/Weber Software Entwicklung 1 30/ 33

Frage Was ist das Ergebnis der folgenden Aufrufe? map cook [,,, ] = [,,, ] filter isvegetarian [,,, ] Bieniusa/Zeller/Weber Software Entwicklung 1 30/ 33

Frage Was ist das Ergebnis der folgenden Aufrufe? map cook [,,, ] = [,,, ] filter isvegetarian [,,, ] [, ] Bieniusa/Zeller/Weber Software Entwicklung 1 30/ 33

Frage Was ist das Ergebnis der folgenden Aufrufe? map cook [,,, ] = [,,, ] filter isvegetarian [,,, ] [, ] foldl feed [,,, ] = Bieniusa/Zeller/Weber Software Entwicklung 1 30/ 33

Frage Was ist das Ergebnis der folgenden Aufrufe? map cook [,,, ] = [,,, ] filter isvegetarian [,,, ] [, ] foldl feed [,,, ] = Bieniusa/Zeller/Weber Software Entwicklung 1 30/ 33

Funktionspointer in C I Gleiche Idee wie bei Funktionen höherer Ordnung Beispiel: Sortierfunktionen der Standardbibliothek sind über Vergleichsfunktion parametrisiert 7 typedef int intfunction ( int ); 8 9 void map_ array ( intfunction f, int * ar, int size ) 10 { 11 for ( int i = 0; i < size ; i ++) 12 { 13 ar[i] = f(ar[i]); 14 } 15 } Bieniusa/Zeller/Weber Software Entwicklung 1 31/ 33

Funktionspointer in C II 1 int increment ( int i) { 2 return i + 1; 3 } 4 int print ( int i) { 5 printf ("%i ", i); 6 return 0; 7 } 8 int main ( void ) { 9 int n = 10; 10 int a[n]; 11 // Initialisiere a 12 for ( int i = 0; i < n; i ++) { a[ i] = i; } 13 // Inkrementiere jeden Eintrag 14 map_array ( increment, a, n); 15 // Gebe jeden Eintrag auf Konsole aus 16 map_array ( print, a, n); 17 return 0; 18 } 19 Bieniusa/Zeller/Weber Software Entwicklung 1 32/ 33

Zusammenfassung Deklaratives Programmierparadigma: Funktionale Programmierung Referentielle Transparenz und Funktionen als Werte Theoretische Grundlage: Lambda-Kalkül Elemente funktionaler Programmierung finden sich in vielen, auch imperativen Programmiersprachen Nächste Vorlesung: Lambda-Ausdrücke in Java Bieniusa/Zeller/Weber Software Entwicklung 1 33/ 33