Schriftliche Aufgabe S-28

Werbung
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 x1  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> }

Herunterladen