Άσκηση 1 (α) {x = 12 y = 7} skip {y = 7} Λύσεις Σειράς Ασκήσεων 5 Η προδιαγραφή αυτή είναι ορθή τόσο με την έννοια της μερικής ορθότητας όσο και με την έννοια της ολικής ορθότητας. Αυτό οφείλεται στο γεγονός ότι η εντολή skip τερματίζει χωρίς να μεταβάλει την κατάσταση του προγράμματος, επομένως διατηρώντας την τιμή του y ίση με 7. (β) {y = 7} skip {x = 12 y = 7} Η προδιαγραφή αυτή δεν είναι ορθή με καμιά από τις δύο έννοιες: αν και το πρόγραμμα τερματίζει δεν μπορούμε να εγγυηθούμε ότι κατά τον τερματισμό του το x θα είναι ίσο με 12 αφού δεν υπάρχει οποιαδήποτε πληροφορία που να δηλώνει ότι αυτό ισχύει κατά την εκκίνηση του προγράμματος. (γ) {x > 7} x :=2 x {x > 15} Η προδιαγραφή αυτή είναι ορθή τόσο υπό την έννοια της μερικής ορθότητας όσο και υπό την έννοιας της ολικής ορθότητας: το πρόγραμμα τερματίζει και σύμφωνα με την προσυνθήκη της προδιαγραφής, εκτέλεσή του θα οδηγήσει σε ικανοποίηση της μετασυνθήκης. (δ) {x 28 y > 1} while (x!= y) x := x+1 {x = y} Η προδιαγραφή είναι ορθή με την έννοια της μερικής ορθότητας αφού κάθε φορά που το πρόγραμμα τερματίζει οφείλει να είναι αληθής η μετασυνθήκη. Εντούτοις, το πρόγραμμα δεν τερματίζει για τιμές του y μικρότερες από το 28. Επομένως δεν έχουμε ολική ορθότητα της προδιαγραφής. (ε) {x = 3} while (x > 0) x := x+1 {x < 0} Το πρόγραμμα αυτό δεν τερματίζει ποτέ. Επομένως δεν είναι ορθό με την έννοια της ολικής ορθότητας αλλά είναι ορθό με την έννοια της μερικής ορθότητας. Άσκηση 2 (α) Η αμετάβλητη συνθήκη για το βρόχο μπορεί να επιλεχθεί ως True. Η απόδειξη έχει ως εξής: {Τrue} Αμετάβλητη Συνθήκη while True {True True} Αμετάβλητη συνθήκη και φρουρός skip; { True } {True True} Εντολή partial-while {False} Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2013 Σελίδα 1
(β) Η αμετάβλητη συνθήκη του βρόχου είναι η Χ Υ + S = x y. Ακολουθεί η απόδειξη της προδιαγραφής. { X = x Υ = y } { X Y + 0 = x y } S:=0; { X Y + S = x y } while (X=0) { X Y + S = x y (Χ = 0)} Αμ. Συνθήκη και Φρουρός { odd(x) X div 2 2 Y + S + Y = x y even(x) X div 2 2 Y + S = x y } if odd(χ) {X div 2 2 Y + S + Y = x y } S:= S+Y; {X div 2 2 Y + S = x y } else { X div 2 2 Y + S = x y } S:= S; { X div 2 2 Y + S = x y } {X div 2 2 Y + S = x y } Κανόνας Εντολής if Y:= 2*Y; { X div 2 Y + S = x y } X:= X div 2; { X Y + S = x y } { X Y + S = x y X = 0 } Κανόνας partial-while { S = x y } Άσκηση 3 (α) Η ασθενέστερη συνθήκη της προδιαγραφής είναι η 0 < n. Αμετάβλητη συνθήκη του βρόχου είναι x = Fib[i-2] y = p = Fib[i-1] [(3 n i n + 1) (0 < n < 3 i = 3)] και μεταβλητή έκφραση η n i + 3. Ακολουθεί η απόδειξη. Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2013 Σελίδα 2
{ 0 < n } { true true [3 n (0 < n < 3) 0 n 3 + 3 ]} { 1 = Fib[1] 1 = p = Fib[2] [(3 n 3 n + 1) (0 < n < 3 3 = 3) 0 n 3 + 3]} x := 1; { x = Fib[1] 1 = p = Fib[2] [(3 n 3 n + 1) (0 < n < 3 3 = 3)] 0 n 3 + 3 } y := 1; { x = Fib[1] y = p = Fib[2] [(3 n 3 n + 1) (0 < n < 3 3 = 3)] 0 n 3 + 3 } i := 3; { x = Fib[i-2] y=p=fib[i-1] [(3 n i n + 1) (0 < n < 3 i = 3)] 0 n i + 3 } while (i n){ { x = Fib[i-2] y=p=fib[i-1] [(3 n i n+1) (0 < n < 3 i = 3) i n 0 n i + 3 = E 0 } Αμ. Συνθήκη, Φρουρός και Μετ. Έκφραση { y = Fib[i-1] x+y = Fib[i] [(3 n i+1 n+1) (0 < n < 3 i + 1 = 3)] 0 n i + 2 < E 0 } p := x + y; { y = Fib[i-1] p=p=fib[i] [(3 n i+1 n+1) (0 < n < 3 i + 1 = 3)] 0 n i + 2 < E 0 } x := y; { x = Fib[i-1] p=p=fib[i] [(3 n i+1 n+1) (0 < n < 3 i + 1 = 3)] 0 n i + 2 < E 0 } y := p; { x = Fib[i-1] y=p=fib[i] [(3 n i+1 n+1) (0 < n < 3 i + 1 = 3)] 0 n i + 2 < E 0 } i := i + 1; { x = Fib[i-2] y = p = Fib[i-1] [(3 n i n+1) (0 < n < 3 i = 3)] 0 n i + 3 < E 0 } } { x = Fib[i-2] y = p = Fib[i-1] [(3 n i n+1) (0 < n < 3 i = 3)] i > n} Κανόνας total-while { y = fib(n) } (β) Η ασθενέστερη συνθήκη της προδιαγραφής είναι η 0 n. Για τον εσωτερικό βρόχο έχουμε Αμετάβλητη συνθήκη: s m n = x y 0 n 1 < E 0 Μεταβλητή Έκφραση: n και για τον εξωτερικό: Αμετάβλητη συνθήκη: s m n = x y Μεταβλητή Έκφραση: n Ακολουθεί η απόδειξη. Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2013 Σελίδα 3
{0 n } { 1 x y = x y 0 n } s := 1; { s x y = x y 0 n } m := x; { s m y = x y 0 n } n := y; { s m n = x y 0 n } while (n!= 0) do { s m n = x y n 0 0 n = E 0 } Αμ. Συνθ. Φρουρός, Μετ. Εκφρ. { s m n = x y 0 n 1 < E 0 0 n } while (even(n)) do { s m n = x y 0 n 1 < E 0 even (n) 0 n = Ζ 0 } { s (m 2 ) n/2 = x y 0 n/2 1 < E 0 0 n/2 < Ζ 0 } m := m*m; Αμ. Συνθ., Φρουρός, Μετ. Εκφρ. { s m n/2 = x y 0 n/2 1 < E 0 0 n/2 < Ζ 0 } n := n / 2; { s m n = x y 0 n 1 < E 0 0 n < Ζ 0 } { s m n = x y 0 n 1 < E 0 even(n) } Κανόνας total-while { s m m n-1 = x y 0 n 1 < E 0 } n := n-1; { s m m n = x y 0 n < E 0 } s := s*m { s m n = x y 0 n < E 0 } { s m n = x y n = 0 } Κανόνας total-while {s = x y } Άσκηση 4 (20 μονάδες) Κατά τη διατύπωση των καινούριων κανόνων θα κάνουμε τις εξής υποθέσεις: 1. Υποθέτουμε ότι η γλώσσα δεν περιέχει εντολές while. Αυτό δεν βλάπτει την εκφραστικότητα της γλώσσας αφού κάθε εντολή τύπου while B C μπορεί να εκφραστεί με την ισοδύναμη δομή loop if B break else C. 2. Υποθέτουμε ότι το C αποτελείται από μια εντολή if B then C else C. Αυτό δεν βλάπτει την εκφραστικότητας της γλώσσας αφού αν το C δεν περιέχει καθόλου if τότε μπορεί να γραφτεί ως if true then C else skip ενώ αν είναι της μορφής C 1 ; if B then C else C ; C 2 τότε μπορεί να γραφτεί ως if B then C 1 ; C; C 2 else C 1 ; C ; C 2. 3. Τέλος, υποθέτουμε ότι αν έχουμε την εντολή loop [if B then C else C ] τότε η εντολή break εμφανίζεται στο C και όχι στο C και συγκεκριμένα ότι η εντολή C έχει τη μορφή C ;break. Και πάλι μπορούμε να δείξουμε ότι αυτό δεν επηρεάζει την εκφραστικότητα της γλώσσας. Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2013 Σελίδα 4
Ο καινούριος κανόνας για την εντολή loop C είναι ο εξής: { η B } C{ φ} { η B}C'{ η} { η} loop if B then C else C' { φ} Επίσης έχουμε τον πιο κάτω κανόνα για την εντολή break: { φ } break { φ} Break Loop Στην συνέχεια θα χρησιμοποιήσουμε τον πιο πάνω κανόνα για να αποδείξουμε την ορθότητα του προγράμματος που έχει δοθεί. Θα χρησιμοποιήσουμε ως η την έκφραση a x! = x 0! { x = x 0 >0 } { 1 x! = x 0! } a:= 1; { a x! = x 0! } loop( ) if x = 1 then { a x! = x 0! x = 1} { a=x 0! } break { a=x 0! } Κανόνας break else { a x! = x 0! x 1 } { a x (x 1)! = x 0! } a:= a*x; { a (x 1)! = x 0! } x:=x-1; { a x! = x 0! } { a=x 0! } Κανόνας loop Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2013 Σελίδα 5