 
                                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> }