Leonhard Fellermayr (leo@slacky.de)
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 (leo@slacky.de)
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 (leo@slacky.de)
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 (leo@slacky.de)
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> }