Leonhard Fellermayr ([email protected]) Matrikel-Nr. 221281305090 Ü Mi 14-16 (Reitmeier) – HS 221 Hgb. WS 2003/04 Seite 1 von 4 07.06.2017 19:35:00 Übungen zur Vorlesung Informatik I Blatt 7 – Lösungsversuch (Abgabe bis 15.12.03) Schriftliche Aufgabe S-28 Umgebung U: let let let let x = y = f x rec false ;; true ;; y = x ;; g x = g x ;; a) x && (not y) || (not x) || y ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Ausgewertet werden folgende Teilausdrücke: 1) 2) 3) 4) x (not y) x && (not y) (not x) (not true) false && false (not false) 5) x && (not y) || (not x) false || true false false false true true (= Ergebnis des Gesamtausdrucks) Bei 3) und 5) ist zu beachten, dass && stärker bindet als ||. Der dritte ODER-Teil (y) wird nicht ausgewertet, da bereits der zweite Teil true liefert ( strikte Auswertung). b) if not (x=y) then x || y else x && y ;; ^^^^^^^^^ ^^^^^^ Ausgewertet werden folgende Teilausdrücke: 1) (x=y) 2) not (x=y) 3) x || y (false=true) not (false) false || true false true true (= Ergebnis des Gesamtausdrucks) Da die if-Bedingung true ist, wird der then-Zweig ausgewertet, der else-Zweig nicht. x || y wird vollständig ausgewertet, weil erst y den Wert true hat. c) f x (g y) ;; Zunächst wird versucht (g y) auszuwerten. Die rekursive Deklaration von g führt jedoch zu einem infinite loop bei der Auswertung von (g y). In OCAML erfolgt keine Auswertung des Gesamtausdrucks. Haskell würde f x (g y) zu x auswerten, da (g y) für die Berechnung des Gesamtausdrucks nicht benötigt wird (lazy evaluation). Leonhard Fellermayr ([email protected]) Matrikel-Nr. 221281305090 Ü Mi 14-16 (Reitmeier) – HS 221 Hgb. WS 2003/04 Seite 2 von 4 07.06.2017 19:35:00 Schriftliche Aufgabe S-29 let rec lgz n = if n = 1 then 0 else if n mod 2 = 1 then lgz (n+1) else lgz (n/2) + 1 ;; Zeige die beiden Grundbedingungen für partielle Korrektheit: 1. x A' in (f, x) nur rek. Aufrufe f(x' ) mit x' A' 2. Aufrufe f(x' ) in (f, x) [ x' R f(x' ) ] x A' [ x R (f, x) ] Zeige 1. Betrachte die beiden rekursiven Wiederaufrufe. Für A' setze man IN. a) lgz (n +1): n IN (n. V.) und 1 IN n 1 IN b) lgz (n / 2): n IN , d. h. n 1; außerdem n geradzahlig (wg. n mod 2 1) n IN 2 Zeige 2. Betrachte die Ein- und Ausgaben der Funktion lgz. Voraussetzung / Annahme: lgz ( n) = log 2(n) Teilbeweis für n ungerade Zeige lgz ( n +1) = lgz ( n) für ungeradzahlige n. Nach Voraussetzung genügt es zu zeigen, dass log 2(n 1) log 2 (n) (! ! nur für ungeradzahlige n ! !) Wir wissen: (i) n gilt: log 2(2 n ) n ln 2 n (will heißen: für Werte 2 n liefert log 2 ganzzahlige Ergebnisse) ln 2 (ii) n 2 x1 n 2 x (x ) gilt: log 2(n) x (iii) 2 x ist stets geradzahlig (iv) Aus (ii) und (iii) folgt: jeder Bereich mit log 2(n) x (x 1,2,3, 4,...) beginnt mit einer ungeraden und endet mit einer geraden Zahl n. Ergebnis: Wegen (iv) kann im Term log 2(n) ein ungerades n durch seinen direkten (geraden) Nachfolger n 1 ersetzt werden, ohne den Wert des Terms zu verändern. N.V. analog für lgz ( n). Damit lässt sich die Auswertung von lgz ( n) für ungerade Zahlen nun einfach auf die Auswertung für gerade Zahlen (s. u.) zurückführen. Teilbeweis für n gerade Zeige lgz ( n / 2) + 1 = log 2(n) für geradzahlige n. n ln n ln 2 ln n Beweise log 2 1 log 2(n) : 1 ln n ln 2 ln 2 ln n q.e.d. 2 ln 2 ln 2 Anmerkung: Beweis wg. Integer - Arithmetik in OCAML o.B.d.A. nur für geradzahlige n n Fazit: Damit ist natürlich auch log 2 1 log 2 (n) , infolgedessen sowie nach Voraussetzung 2 gilt auch (i) lgz ( n / 2) + 1 = lgz ( n) und damit (ii) lgz ( n) log 2(n) für geradzahlige n. Leonhard Fellermayr ([email protected]) Matrikel-Nr. 221281305090 Ü Mi 14-16 (Reitmeier) – HS 221 Hgb. WS 2003/04 Seite 3 von 4 07.06.2017 19:35:00 Schriftliche Aufgabe S-30 a) 3 * (let x = 4 in x+1) – if 2>0 then 10 else 5 1. Ø, 3 * (let x = 4 in x+1) – if 2>0 then 10 else 5 5 (folgt aus 2) 2. Ø, 15 – 10 5 (folgt aus 3, 5) 3. Ø, 3 * (let x = 4 in x+1) 15 (folgt aus 3a, 4, 3b) 3a Ø, 3 3 3b Ø, 5 5 4. Ø, let x = 4 in x+1 5 (folgt aus 4a – 4c) 4a U0, x+1 5 (folgt aus 4b, 4c) 4b U0, x 4 4c U0, 1 1 5. Ø, if 2 > 0 then 10 else 5 10 (folgt aus 6) 6. Ø, if 2 > 0 true (folgt aus 6a, 6b) 6a Ø, 2 2 6b Ø, 0 0 U0 := { <x,4> } Ø b) let rec pow = fun (n,m) -> if m = 1 then n else n * pow (n, m-1) in pow (3,2) 1. Ø, let rec pow = fun (n,m) -> if m=1 then n else n*pow (n,m-1) in pow (3,2) 9 (folgt aus 2) 2. U0, pow (3,2) 9 (folgt aus 3, 4, 5, 6) 3. U0, 3 3 4. U0, 2 2 5. U0, pow (pow = fun (n,m) -> if m=1 then n else n*pow (n,m-1), Ø) 6. U1, if m = 1 then n else n*pow (n,m-1) 9 (folgt aus 7, 8) 7. U1, m = 1 false (folgt aus 11, 13) 8. U1, n*pow (n,m-1) 9 (folgt aus 12, 9) 9. U1, pow (n,m-1) 3 (folgt aus 10, 14, 15) 10. U1, m-1 1 (folgt aus 11, 13) 11. U1, m 2 12. U1, n 3 13. U1, 1 1 14. U1, pow (pow = fun (n,m) -> if m=1 then n else n*pow (n,m-1), Ø) 15. U2, if m = 1 then n else n*pow (n,m-1) 1 (folgt aus 16, 17) 16. U2, m = 1 true (folgt aus 18, 17) 17. U2, 1 1 18. U2, m 1 Leonhard Fellermayr ([email protected]) WS 2003/04 Matrikel-Nr. 221281305090 Seite 4 von 4 Ü Mi 14-16 (Reitmeier) – HS 221 Hgb. 07.06.2017 19:35:00 U0 := { <pow, (pow = fun (n,m) -> if m=1 then n else n*pow (n,m-1), Ø)> } Ø U1 := U0 { <n,3>, <m,2> } U2 := U1 { <m,1> } = U0 { <n,3>, <m,1> }