Allgemeine Hinweise:

Ähnliche Dokumente
TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Lösungvorschlag zum Übungsblatt 6: Software-Entwicklung I (WS 2007/08)

Grundprinzipien der funktionalen Programmierung

1. Probeklausur zu Programmierung 1 (WS 07/08)

Grundlagen der Programmierung 2. Bäume

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

Programmierung und Modellierung

Programmierung Eine Einführung in die Informatik mit Standard ML Musterlösungen für ausgewählte Aufgaben. 1 Schnellkurs. Gert Smolka.

Fakultät Wirtschaftswissenschaft

Zweite Möglichkeit: Ausgabe direkt auf dem Bildschirm durchführen:

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

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

Spezifikation der zulässigen Parameter. Bemerkungen: Bemerkungen: (2) Design by Contract:

Kapitel 7: Benutzerdefinierte Datentypen

Funktionale Programmierung Teil 2 Methodik: Spezifikation, Implementierung, Verifikation

Prüfung Software Engineering II (IB)

5.2 Das All-Pairs-Shortest-Paths-Problem (APSP-Problem) Kürzeste Wege zwischen allen Knoten. Eingabe: Gerichteter Graph G =(V, E, c)

Algorithmen & Datenstrukturen 1. Klausur

Kurs 1575, Musterlösung zur Winter Klausur 2003/04

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

Tutoraufgabe 1 (Datenstrukturen in Haskell):

Algorithms & Datastructures Midterm Test 1

Funktionale Programmierung

Anmerkungen zur Übergangsprüfung

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 11 (Kapitel 12)

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Modul 122 VBA Scribt.docx

Funktionale Programmierung

Datenstrukturen & Algorithmen

MAXIMUM2.STR Struktogramme. Aufgabe: 3 Zahlen eingeben, größte Zahl ermitteln und ausgeben.

Name:... Vorname:... Matrikel-Nr.:... Unterschrift:...

K L A U S U R D E C K B L A T T

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Klausur zur Einführung in die objektorientierte Programmierung mit Java

ALP I. Funktionale Programmierung

Künstliche Intelligenz Maschinelles Lernen

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

[10] Software Transactional Memory in Haskell, Tortenwurf und Aufgabenblatt 7

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

1 Induktiver Aufbau von Graphen

Vorname:... Matrikel-Nr.:... Unterschrift:...

Funktionale Programmierung mit Haskell

Klausur zur Vorlesung Grundlagen der C++-Programmierung

EndTermTest PROGALGO WS1516 A

Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

WS 2013/14. Diskrete Strukturen

Kurs 1613 Einführung in die imperative Programmierung

2 Lösungen "Peptide de novo Sequencing"

Vorlesung : Binäre Entscheidungsdiagramme (BDDs) Dr. Carsten Sinz

2. Lernen von Entscheidungsbäumen

8 Diskrete Optimierung

Bitte wenden. Name: KURSARBEIT NR. 4 (10 DIFF GA) Seite 1

Felder. November 5, 2014

Prüfung Software Engineering I (IB)

Dr. Monika Meiler. Inhalt

Programmierung 1 (Wintersemester 2012/13) Weihnachtsübungsblatt

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Vertraulich. Nachname: Vorname: Matrikel-Nummer: Studiengang: Datum: 30. Januar 2015

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

Kapitel 4: Beweis und Herleitung von Programmen

Einführung in die Programmierung (EPR)

Excel Funktionen durch eigene Funktionen erweitern.

Kurs 1612 Konzepte imperativer Programmierung Kurs 1613 Einführung in die imperative Programmierung

Nachholklausur Informatik II

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Seminar Werkzeuggestütze. tze Softwareprüfung. fung. Slicing. Sebastian Meyer

12. ArcView-Anwendertreffen Workshop Programmierung in ArcGIS. Daniel Fuchs. Wo kann eigene Programmierung in ArcGIS verwendet werden?

Name (in Druckbuchstaben): Matrikelnummer: Unterschrift:

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

Einführung in die Programmierung

Klausur Grundlagen der Informatik

Programmierung 2. Dynamische Programmierung. Sebastian Hack. Klaas Boesche. Sommersemester

Generische Record-Kombinatoren mit statischer Typprüfung

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

16. All Pairs Shortest Path (ASPS)

Dynamische Optimierung. Kapitel 4. Dynamische Optimierung. Peter Becker (H-BRS) Operations Research II Wintersemester 2014/ / 206

Kapitel 3: Programmierung mit Kombinatoren

Funktionale Programmierung mit Haskell. Jan Hermanns

Vorname: Nachname: Matrikelnummer: -Addresse: Studiengang (bitte genau einen ankreuzen): Master of SSE Erasmus Sonstige:

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

Kostenmaße. F3 03/04 p.188/395

Über Arrays und verkettete Listen Listen in Delphi

Bearbeitungszeit: 120 Minuten. Kommentare kosten Zeit; kommentieren Sie ihr Programm nur da, wo der Code alleine nicht verständlich wäre.

Klausur zu Objektorientierter Softwareentwicklung in C++ 4. Februar 2003 (WS 2002/2003) Beispiellösung

1 Visual Basic for Application mit Excel (VBA)

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

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN Kennnr. Matrikelnr. Familienname Vorname

HEUTE. Effizienzbeispiel: bekannte Version (Übung ) Mathematik: Was ist Effizienz? vollständige Induktion

WS 2009/10. Diskrete Strukturen

Adressen. Praktikum Funktionale Programmierung Organisation und Überblick. Termine. Studienleistung

Semestralklausur zu Modellierung verteilter Systeme

1 topologisches Sortieren

4. Lernen von Entscheidungsbäumen. Klassifikation mit Entscheidungsbäumen. Entscheidungsbaum

Einführung in die Informatik 1

Funktionale Programmierung. Frank Adler

Klausur in 12.1 Themen: Zahlsysteme, Grundlagen von Delphi (Bearbeitungszeit: 90 Minuten)

TheGI 1: Grundlagen und algebraische Strukturen Prof. Dr.-Ing. Uwe Nestmann Februar Schriftliche Leistungskontrolle (EK)

Transkript:

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK WS 11/12 Einführung in die Informatik 2 Klausur Prof. Dr. Andrey Rybalchenko, M.Sc. Ruslán Ledesma Garza 11.02.2011 Name Vorname Studiengang Matrikelnummer Hörsaal Reihe Sitzplatz Unterschrift Allgemeine Hinweise: Bitte füllen Sie die oben angegebenen Felder vollständig aus und unterschreiben Sie! Schreiben Sie nicht mit Bleistift oder in roter/grüner Farbe! Die Arbeitszeit beträgt 105 Minuten. Prüfen Sie, ob Sie alle 13 Seiten erhalten haben. In dieser Klausur können Sie insgesamt 105 Punkte erreichen. Zum Bestehen werden 42 Punkte benötigt. Als Hilfsmittel ist nur ein beidseitig handbeschriebenes DinA4-Blatt zugelassen. Das Merkblatt mit nützlichen Prozeduren ist als letztes Blatt an die Klausur angeheftet.

2

Aufgabe 1 [20 Punkte] Programauswertung 1.1 Werte Geben Sie den Wert der folgenden Ausdrücke an. (* a *) let fun p x = x mod 2 <> 0 in p 9 andalso p 3 end Wert = true (* b *) map (fn x => x * (x - 1)) [~1, 0, 1] Wert = [2, 0, 0] (* c *) let fun p 0 = true p x = not (p (x - 1)) fun q 1 = true q x = not (q (x - 1)) in q 113 end Wert = true 1.2 Auswertungsbäume a) Geben Sie einen vollständigen Auswertungsbaum für den folgenden Ausdruck an. Die Auswertung findet in der leeren Umgebung statt. Siehe Anhang A für einige nützliche Auswertungsregeln. if 4 < 2 then 3 else if 2 < 3 then ~1 else 1 ------------ ------------ [] = 2 => 2 [] = 3 => 3 ------------ ------------ -------------------------- -------------- [] = 4 => 4 [] = 2 => 2 [] = 2 < 3 => true [] = ~1 => ~1 -------------------------- ------------------------------------------- [] = 4 < 2 => false [] = if 2 < 3 then ~1 else 1 => ~1 ----------------------------------------------------------------------- [] = if 4 < 2 then 3 else if 2 < 3 then ~1 else 1 => ~1 3

b) Geben Sie eine Umgebung an, die durch die Auswertung der folgenden Deklarationen entsteht. Die Ausgangsumgebung sei leer. Siehe Anhang A für einige nützliche Auswertungsregeln. fun f (x : int) = x - 1 val y = 3 fun g (z : int) = f z < 2 f := (fun f x = x - 1, int -> int, []) --------------------------------- vf y := 3 g := (fun g z = f z < 2, int -> bool, [ f := vf ]) --------------------------------------------- vg c) Sei W die Umgebung aus der vorherigen Frage. Geben Sie einen vollständigen Baum für die Auswertung des Ausdrucks g 7 in der Umgebung W an. Siehe Anhang A für einige nützliche Auswertungsregeln. Wg := [f:=vf; g := vg; z:= 7] Wf := [f:=vf; x:= 7] ---------------- ---------------- Wf = x => 7 Wf = 1 => 1 ------------- ------------ ----------------------------------- Wg = f => vf Wg = z => 7 Wf = x - 1 => 6 ------------------------------------------------------------------ ------------ Wg = f z => 6 Wg = 2 => 2 ------------ ----------- --------------------------------------------------------------------------------- W = g => vg W = 7 => 7 Wg = f z < 2 => false -------------------------------------------------------------------------------------------------------------- W = g 7 => false 4

Aufgabe 2 [20 Punkte] Programmierung 1 2.1 Kartesische und kaskadierte Prozeduren a) Geben Sie die kartesische Version foldl_c der Prozedur foldl aus Anhang A an. Nennen Sie außerdem den Typ von foldl_c. foldl_c :: ( a * b -> b) * b * a list -> b fun foldl_c (f, s, l) = foldl f s l b) Geben Sie eine kaskadierte, end-rekursive Prozedur fac an, die die Fakultätsfunktion implementiert. (* mögliche Antwort 1 *) fun fac1 acc 0 = acc fac1 acc n = fac1 (acc * n) (n - 1) (* mögliche Antwort 2 *) fun fac2 n = let fun fac acc 0 = acc fac acc n = fac (acc * n) (n - 1) in fac 1 n end (* mögliche Antwort 3 *) fun iter n s f = if n < 1 then s else iter (n - 1) (f s) f fun fac3 n = #1(iter n (1, n) (fn (s, n) => (s * n, n - 1))) 2.2 Referenzen Implementieren Sie die Prozedur foldl aus Anhang A mit Hilfe der Prozedur map (siehe Anhang A) und einer Referenz. Dabei soll die Referenz außerhalb von foldl unsichtbar sein. fun my_foldl f s l = let val acc = ref s val _ = map (fn x => acc := f (x,!acc)) l in!acc end 5

2.3 Matrizenrechnung Wir stellen eine Zeile einer Matrix als eine( Liste von Integern ) dar und implementieren eine Matrix als eine Liste 1 2 3 von Zeilen. Zum Beispiel, wird die Matrix durch [[1,2,3], [10, 20, 30]] dargestellt. 10 20 30 a) Geben Sie eine Prozedur myrow : int -> int list -> bool an, sodass myrow n xs den Wert true liefert, wenn das n-te Element von xs gleich 1 ist und alle anderen Elemente von xs gleich 0 sind. Das erste Element einer Zeile ist auf der Position 1. Zum Beispiel, liefert myrow 2 [0, 1, 0, 0] das Ergebnis true. fun myrow n l = let fun loop i n nil = true loop i n (x :: xs) = (i = n andalso x = 1) orelse (i <> n andalso x = 0) andalso loop (i + 1) n xs in loop 1 n l end b) Eine Matrix ist quadratisch falls die Zeilenanzahl gleich der Spaltenanzahl ist. Zum Beispiel, stellt [[1,2], [10, 20]] eine quadratische Matrix dar. Geben Sie eine Prozedur mysquare : int list list -> bool an, sodass mysquare xxs das Ergebnis true liefert, wenn xxs eine quadratische Matrix darstellt. fun mysquare xss = let val len = length xss in List.all (fn xs => length xs = len) xss end 6

c) Die Einheitsmatrix ist eine quadratische Matrix, bei der jedes Element auf der Diagonale gleich 1 und alle anderen Elemente gleich 0 sind. Zum Beispiel, stellt [[1,0,0], [0, 1, 0], [0,0,1]] eine Einheitsmatrix dar. Geben Sie eine Prozedur myunit : int list list -> bool an, sodass myunit xxs das Ergebnis true liefet, wenn xxs eine Einheitsmatrix darstellt. Benutzen Sie dabei myrow. (* mögliche Antwort 1 *) fun myunit1 xss = mysquare xss andalso #1(foldl (fn (xs, (s, i)) => (s andalso myrow i xs, i + 1)) (true, 1) xss) (* mögliche Antwort 2 *) fun myunit2 xss = let fun diag n nil = true diag n (xs :: xss) = myrow n xs andalso diag (n + 1) xss in mysquare xss andalso diag 1 xss end 7

Aufgabe 3 [15 Punkte] Programmierung 2 Wir modellieren Getränke mit Hilfe des Typs drink, der wie folgt auf den Typen liquid und amount aufbaut. datatype liquid = Water Juice Coke type amount = int datatype drink = Basic of liquid * amount Mix of drink list Mix [Basic (Water, 10), Basic (Juice, 10)] stellt zum Beispiel ein Getränk dar, das aus zehn Wasser- und zehn Safteinheiten zubereitet wurde. a) Geben Sie eine Prozedur unit : liquid -> int an, die die Kalorienanzahl in einer Flüssigkeitseinheit wie folgt bestimmt. Eine Wassereinheit hat keine Kalorien, eine Safteinheit hat eine Kalorie und eine Coke-Einheit hat zwei Kalorien. fun unit Water = 0 unit Juice = 1 unit Coke = 2 b) Geben Sie eine Prozedur total : drink -> int an, die die Gesamtzahl der Kalorien in einem Getränk berechnet. Zum Beispiel, liefert total (Mix [Basic (Water, 10), Basic (Juice, 10)]) das Ergebnis 10. fun total (Basic (l, a)) = a * unit l total (Mix ds) = foldl (fn (d, t) => t + total d) 0 ds 8

c) Geben Sie eine Prozedur ingredients : drink -> (amount * amount * amount) an, die Wasser-, Saft- und Coke-Gehalt eines Getränks berechntet. Zum Beispiel, liefert ingredients (Mix [Basic (Water, 10), Basic (Juice, 10)]) das Ergebnis (10, 10, 0). fun ingredients d = let fun ingredients_ (d, (w, j, c)) = case d of Basic (l, a) => (case l of Water => (w + a, j, c) Juice => (w, j + a, c) Coke => (w, j, c + a)) Mix ds => foldl ingredients_ (w, j, c) ds in ingredients_ (d, (0, 0, 0)) end 9

Aufgabe 4 [15 Punkte] Programmierung 3 Ein gerichteter Graph besteht aus einer Menge von Kanten. Eine Kante ist ein Paar von Knoten, wobei jeder Knoten durch einen Integer dargestellt wird. Wir stellen einen Graphen als eine Liste von Integer-Paaren dar, z.b., [(1, 2), (2, 3), (1, 3), (4, 3)]. a) Geben Sie eine Prozedur next : int -> (int * int list) -> (int list) an, sodass next n edges eine Liste der Knoten liefert, die mit dem Knoten n durch eine aus n ausgehende Kante verbunden sind. Zum Beispiel, liefert next 1 [(1, 2), (2, 3), (1, 3), (4, 3)] das Ergebnis [2, 3], weil die Kanten (1,2) und (1, 3) in der Eingabeliste vorkommen. (Mehrfaches Auftreten von Knoten in der Ergebnisliste ist zulässig.) fun next n edges = let val relevant_edges = List.filter (fn (a, _) => a = n) edges val successors = map #2 relevant_edges in successors end b) In dieser Frage betrachten wir nur azyklische Graphen, d.h., Graphen ohne zyklische Kantenfolgen. Geben Sie eine Prozedur reach : int -> (int * int list) -> (int list) an, sodass reach n edges eine Liste von Knoten liefert, die aus dem Knoten n über eine Kantenfolge erreichbar sind. Diese Folge kann auch leer sein. Zum Beispiel, liefert reach 1 [(1, 2), (2, 3), (1, 3), (4, 3)] das Ergebnis [1, 2, 3] und liefert reach 3 [(1, 2), (2, 3), (1, 3), (4, 3)] das Ergebnis [3]. (Mehrfaches Auftreten von Knoten in der Ergebnissliste ist zulässig.) (* mögliche Antwort 1 *) fun reach1 n edges = foldl (fn ((a, b), reached) => if a = n then reach1 b edges @ reached else reached) [n] edges (* mögliche Antwort 2 *) fun reach2 n edges = let val succs = next n edges in foldl (fn (succ, reached) => reach2 succ edges @ reached) [n] succs end 10

Aufgabe 5 [15 Punkte] Programme als diskrete Strukturen Wir betrachten eine mathematische Prozedur upto : int * int -> unit, die wie folgt definiert wird. upto (i, n) = if i < n then upto (i+1, n) else () a) Geben Sie den Definitionsbereich und eine natürliche Terminierungsfunktion für upto an. Definitionsbereich: Z x Z Terminierungsfunktion: \lambda (i, n) \in Z x Z. n - i b) Geben Sie die Rekursionsfunktion und die Rekursionsrelation für upto an. Rekursionsfunktion: \lambda (i, n) \in Z x Z. if i > n then <(i + 1, n)> else <> Rekursionsrelation: R = { ((i,n), (i+1, n)) (i,n) \in Z x Z ^ i < n } c) Geben Sie die Ergebnisfunktion von upto an. Beweisen Sie die Korrektheit Ihrer Antwort. Ergebnisfunktion: f := \lambda (i,n) \in Z x Z. () Korrektheit: We have to check that 1) Dom f \subseteq Dom p, and that 2) f satisfies the defining equations of upto. Let n be given. We proceed by case distinction over i: Case i = n: Prove that f (i, n) = (). The equation holds by the defn. of f. Case i < n: Prove that f (i, n) = f (i + 1, n). f (i, n) = () = f (i + 1, n) 11

Aufgabe 6 [20 Punkte] Programmverifikation durch induktive Beweise Wir betrachten eine mathematische Prozedur foldl : (X * Y -> Y) * Y * Lists(X) -> Y, die wie folgt definiert wird. foldl (f, s, nil) = s foldl (f, s, x::xr) = foldl (f, f(x, s), xr) Dazu betrachten wir eine mathematische Funktion f int * int -> int, sodas f (x, s) = s + (if x >= 0 then x else -x). Beweisen Sie, dass für jeden Integer s und jede Integer-Liste xs das Ergebnis der Anwendung foldl (f, s,xs) größer oder gleich s ist. Prove that \forall xs, s. foldl (f, s, xs) >= s. We prove that \forall s. foldl (f, s, xs) >= s by induction over xs. 1) Case xs = nil Let s be given. Then foldl (f, s, nil) = s >= s 2) Case xs = x :: xs Let the induction hypothesis be \forall s. foldl (f, s, xs ) >= s. Let s be given. Then foldl (f, s, xs) = foldl (f, s, x :: xs ) = foldl (f, f (x, s), xs ) defn. foldl >= f (x, s) I.H. >= s + (if x >= 0 then x else ~x) defn. f >= s + x Prop. A >= s ------------------------------- Proposition A: \forall x. (if x >= 0 then x else ~x) = x Proof: Case distinction over x. Case x >= 0 (if x >= 0 then x else ~x) = x = x Case x < 0 (if x >= 0 then x else ~x) = ~x = x 12

A Anhang V (b) = v V = b v V = k k V = e 1 v 1 V = e 2 v 2 V = e 1 true V = e 2 v V = e 1 e 2 v 1 v 2 V = if e 1 then e 2 else e 3 v V = e 1 false V = e 3 v V = if e 1 then e 2 else e 3 v V = e 1 (fun f b = e, t, V 1 ) V = e 2 v 2 V 1 + [f := (fun f b = e, t, V 1 )] + [b := v 2 ] = e v V = e 1 e 2 v V 1 = (V eingeschränkt auf FreeIds(fun f (b : t 1 ) : t 2 = e)) V ( fun f (b : t 1 ) : t 2 = e ) : V + [f := (fun f b = e, t 1 t 2, V 1 )] V 0 d 1 : V 1... V n 1 d n : V n V 0 d 1... d n : V n V = e v V val b = e : V + [b := v] fun map f n i l = n i l map f ( x : : xr ) = ( f x ) : : (map f xr ) map : ( a > b ) > a l i s t > b l i s t fun f i l t e r f n i l = n i l f i l t e r f ( x : : xr ) = i f f x then x : : f i l t e r f xr e l s e f i l t e r f xr f i l t e r : ( a > bool ) > a l i s t > a l i s t fun e x i s t s f n i l = f a l s e e x i s t s f ( x : : xr ) = f x o r e l s e e x i s t s f xr e x i s t s : ( a > bool ) > a l i s t > bool fun a l l f n i l = true a l l f ( x : : xr ) = f x andalso a l l f xr a l l : ( a > bool ) > a l i s t > bool fun f o l d l f s n i l = s f o l d l f s ( x : : xr ) = f o l d l f ( f ( x, s ) ) xr f o l d l : ( a b > b ) > b > a l i s t > b fun f o l d r f s n i l = s f o l d r f s ( x : : xr ) = f ( x, f o l d r f s xr ) f o l d r : ( a b > b ) > b > a l i s t > b fun length n i l = 0 length ( x : : xr ) = 1 + l e n g t h xr l e ngth : a l i s t > i n t explode : s t r i n g > char l i s t implode : char l i s t > s t r i n g 13