Άσκηση 1 (15 μονάδες) Σειρά Προβλημάτων 5 Λύσεις Να δώσετε προδιαγραφές (τριάδες Hoare) για τα πιο κάτω προγράμματα: (α) Ένα πρόγραμμα το οποίο παίρνει ως δεδομένο εισόδου δύο πίνακες Α και Β και ελέγχει κατά πόσο περιέχουν κάποιο κοινό στοιχείο. (β) Ένα πρόγραμμα το οποίο παίρνει ως δεδομένο εισόδου δύο πίνακες Α και Β και επιστρέφει τη μακρύτερη κοινή τους αρχική ακολουθία. (γ) Ένα πρόγραμμα το οποίο παίρνει ως δεδομένο εισόδου ένα πίνακα Α και τον ταξινομεί. (α) Έστω M και N σταθερές που αντιστοιχούν στα μεγέθη των πινάκων A και B. Υποθέτουμε ότι το πρόγραμμα υπολογίζει την τιμή της μεταβλητής result η οποία τελικά θα περιέχει την λογική τιμή που εκφράζει κατά πόσο οι δύο πίνακες περιέχουν κάποιο κοινό στοιχείο. {M 0 N 0 C { i, 0 i < M j, 0 j < N A[i] = B[j] result = true (β) Έστω M και N σταθερές που αντιστοιχούν στα μεγέθη των πινάκων A και B. Υποθέτουμε ότι το πρόγραμμα υπολογίζει την τιμή της μεταβλητής result η οποία τελικά θα περιέχει την ακέραια τιμή για την οποία Α[0..result] είναι η μακρύτερη κοινή αρχική υποακολουθία των Α και Β. {M 0 /\ N 0 C { 0 result < min(m, N) ( i, 0 i result : A[i] = B[i]) A[result+1] B[result+1] (γ) Έστω M σταθερά που αντιστοιχεί στο μέγεθος του πίνακα A. {A = [x 1,,x M], M 0 C {( i, 0 i < M 1 : Α[i] Α[i+1]) {A[i] 0 i < M = {x 1,,x M Άσκηση 2 (α) Να αποδείξετε την ορθότητα της προδιαγραφής = par { x = x 0 y = y 0 P { x y 0 όπου ο κώδικας του Ρ δίνεται πιο κάτω. if (x > 0) if (y > 0) x := y + 1; x := y - x; Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2017 Σελίδα 1 από 7
{ x = x 0 y = y 0 Προσυνθήκη { (x + y > 0 x + y + y y 0 ) (x + y 0 [y > 0 y+1 y 0 y 0 y (x + y) y 0 ]) Συνεπαγωγή * { (x > 0 x + y y 0 ) (x 0 [ y > 0 y+1 y 0 y 0 y x y 0 ]) if (x > 0) { x + y y 0 { x y 0 { y > 0 y+1 y 0 y 0 y x y 0 if (y > 0) { y+1 y 0 x := y + 1; { x y 0 { y x y 0 x := y - x; { x y 0 { x y 0 Κανόνας if Σχετικά με τη Συνεπαγωγή (*) σημειώνουμε ότι: Αφού y = y 0: x + y > 0 x + y + y y 0 x + y > 0 x + y + y y Αφού y = y 0: x + y > 0 x + y 0 True x + y 0 [(y > 0 y+1 y 0) (y 0 y (x + y) y 0) ] x + y 0 [(y > 0 y+1 y) (y 0 y (x + y) y )] x + y 0 [(y > 0 true) (y 0 y (x + y) y ) ] x + y 0 [true (y 0 y (x + y) y) ] x + y 0 [y 0 (x + y) 0 ] x + y 0 [y 0 x + y 0 ] True (β) Θεωρήστε τη συνάρτηση gcd(x,y) η οποία επιστρέφει τον μέγιστο κοινό διαιρέτη ανάμεσα στις τιμές Χ και Υ ικανοποιεί τις πιο κάτω προτάσεις: (X>Y) gcd(x,y)=gcd(x Y,Y) gcd(x,y) = gcd(y,x) gcd(x,x) = X Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2017 Σελίδα 2 από 7
Αποδείξτε την πιο κάτω προδιαγραφή υπό την έννοια της μερικής ορθότητας: {(A>0) (B>0) (gcd(a,b)=gcd(x,y)) while A>B A := A-B; while B>A B := B-A {(0<B) (B A) (gcd(a,b)=gcd(x,y)) Αμετάβλητη συνθήκη πρώτου βρόχου: 0 < B gcd(a,b) = gcd(x,y) Αμετάβλητη συνθήκη δεύτερου βρόχου: gcd(a,b) = gcd(x,y) {Α > 0 B > 0 gcd(a,b) = gcd(x,y) Προσυνθήκη { B > 0 gcd(a,b) = gcd(x,y) Συνεπαγωγή while (A > B) { { B > 0 gcd(a,b) = gcd(x,y) Α > Β Αμετ. Συνθ. και Φρουρός { B > 0 gcd(a Β,B) = gcd(x,y) Συνεπαγωγή 1 A = A-B; { B > 0 gcd(a,b) = gcd(x,y) { B > 0 gcd(a,b) = gcd{x,y Α Β Καν. partial while {0 < B gcd(a,b) = gcd(x,y) Συνεπαγωγή while (B > A) { {0 < B gcd(a,b) = gcd(x,y) B > A Αμετ. Συνθ. και Φρουρός {0 < B A gcd(a,b A) = gcd(x,y) Συνεπαγωγή 2 B = B-A; {0 < B gcd(a,b) = gcd(x,y) Αξίωμα ανάθεσης { B A 0 < B gcd(a,b) = gcd(x,y) Καν. partial while Σημειώστε ότι για την απόδειξη των συνεπαγωγών 1 και 2 χρησιμοποιούνται οι προτάσεις που δόθηκαν στην άσκηση αναφορικά με τη συνάρτηση gcd. Συγκεκριμένα, με δεδομένο ότι gcd(a,b) = gcd(x,y) και B > A προκύπτει το gcd(a, B A) = gcd(x,y) ως εξής: gcd(x,y) = gcd(a,b) = gcd(b,a) = gcd(b A,A) = gcd(a, B A) Άσκηση 3 (α) Να αποδείξετε την ορθότητα της πρότασης = tot { n 0 C { m =, k = { A{i] 0 i < n, A[i] < 50 όπου ο κώδικας του C δίνεται πιο κάτω. k := 0; m := 0; i := 0; while (i < n){ if (A[i] < 50) k++; Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2017 Σελίδα 3 από 7
i++; m := m/n; Αμετάβλητη Συνθήκη: i n m= k = { A[j] 0 j < i, A[j] < 50 Μεταβλητή Έκφραση: i { n 0 { 0 n 0 = 0 = { A[j] 0 j < 0, A[j] < 50 0 0 Συνεπαγωγή k := 0; { 0 n 0 = k = { A[j] 0 j < 0, A[j] < 50 0 0 m := 0; { 0 n m= k = { A[j] 0 j < 0, A[j] < 50 0 0 i := 0; { i n m= k = { A[j] 0 j < i, A[j] < 50 0 i while (i < n){ { i < n i n m= k = { A[j] 0 j < i, A[j] < 50 0 i = E 0 Αμετ. Συνθ. και Φρουρός και Μετ. Έκφραση { A[i]<50 i +1 n m + A[i] = k+1 = { A[j] 0 j < i+1, A[j] < 50 A[i] 50 i+1 n m+a[i]= k= {A[j] 0 j<i+1, A[j]<50 0 i+1<e 0 Συνεπαγωγή if (A[i] < 50) { i+1 n m+a[i] = k+1 = { A[j] 0 j < i+1, A[j] < 50 0 i + 1< E 0 k++; { i+1 n m + A[i] = k = { A[j] 0 j < i+1, A[j] < 50 0 i + 1< E 0 { i +1 n m= k = { A[j] 0 j < i+1, A[j] < 50 0 i + 1< E 0 { i +1 n m + A[i] = k = { A[j] 0 j < i+1, A[j] < 50 0 i + 1< E 0 { i +1 n m= k = { A[j] 0 j < i+1, A[j] < 50 0 i + 1< E 0 { i +1 n m= k = { A[j] 0 j < i+1, A[j] < 50 0 i + 1< E 0 Κανόνας if i++; { i n m= k = { A[j] 0 j < i, A[j] < 50 0 i < E 0 { i n i n m= k = { A[j] 0 j < i, A[j] < 50 Καν. total while { m= k = { A{i] 0 i < n, A[i] < 50 Συνεπαγωγή m := m/n; { m = k = { A{i] 0 i < n, A[i] < 50 Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2017 Σελίδα 4 από 7
(β) Να αποδείξετε την ορθότητα της προδιαγραφής = tot {x = a n = b n 0 C {p = a b όπου ο κώδικας του C δίνεται πιο κάτω. p := 1; while (n!= 0) if (n mod 2 = 1) then p := p*x p := p; n := n div 2; x := x*x Χρησιμοποιούμε ως αμετάβλητη συνθήκη την η = p x n = a b και ως μεταβλητή έκφραση την n. {x = a n = b n 0 { x n = a b 0 n Συνεπαγωγή p := 1; {p x n = a b 0 n while (n!= 0) {p x n = a b n 0 0 n = Ε 0 {[n mod 2 0 p x 2 n div2+1 = a b 0 n div 2 < Ε 0 ] [n mod 2 = 0 p x 2 n div2 = a b 0 n div 2 < Ε 0] if (n mod 2 = 1) { px (x x) n div2 = a b 0 n div 2 < Ε 0 then p := p*x Αμ. Συν., Μετ. Εκφρ. και Φρουρός Συνεπαγωγή { p (x x) n div2 = a b 0 n div 2 < Ε 0 { p (x x) n div2 = a b 0 n div 2 < Ε 0 p := p; { p (x x) n div2 = a b 0 n div 2 < Ε 0 { p (x x) n div2 = a b 0 n div 2 < Ε 0 Κανόνας if n := n div 2; { p (x x) n = a b 0 n < E 0 x := x*x { p x n = a b 0 n < E 0 {p x n = a b n = 0 Καν. Total while {p = a b Συνεπαγωγή Άσκηση 4 (α) Θεωρήστε τα πιο κάτω αξιώματα για τον τελεστή της ανάθεσης: (i) { p X:= E { p[e/x] (ii) { p[e/x] X:= E {p (iii) { p X:= E { p X = E (iv) { p X = E X:= E { p Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2017 Σελίδα 5 από 7
Να αποφασίσετε ποια από τα αξιώματα είναι ορθά. Για κάθε ορθό αξίωμα να δώσετε ένα σύντομο επιχείρημα που να υποστηρίζει την ορθότητά του και για κάθε λανθασμένο αξίωμα να δώσετε ένα αντιπαράδειγμα. (β) Για οποιαδήποτε μεταβλητή Χ, ας γράψουμε Χ++ για την έκφραση η οποία υπολογίζεται ως την τιμή Χ+1 χωρίς όμως να μεταβάλλεται η τιμή της μεταβλητής Χ. Για παράδειγμα, αν η μεταβλητή Χ έχει την τιμή 3, εκτέλεση της εντολής Υ := Χ++ έχει ως αποτέλεσμα το Υ να πάρει την τιμή 4 χωρίς να αλλάξει η τιμή του Χ. Να εξηγήσετε γιατί εισαγωγή του πιο πάνω τύπου εκφράσεων στην γλώσσα while θα έχει ως αποτέλεσμα να χάσει την εγκυρότητά του το αξίωμα της ανάθεσης (διαφάνεια 9 13). (γ) Θεωρήστε τον τελεστή X += E o οποίος ορίζεται ως Χ := Χ+Ε. Να ορίσετε ένα καινούριο αξίωμα για αυτόν τον τελεστή και να συζητήσετε σύντομα την ορθότητά του. (δ) Να γράψετε ένα αξίωμα για την εντολή ταυτόχρονης ανάθεσης Χ 1, Χ 2,, Χ n := E 1, E 2, E n. (Η εντολή αυτή έχει ως αποτέλεσμα, αφού υπολογιστούν οι τιμές των εκφράσεων E 1, E 2, E n, να ανατεθούν ταυτόχρονα αυτές οι τιμές στις μεταβλητές Χ 1, Χ 2,, Χ n.) Ποια η ασθενέστερη προσυνθήκη της ταυτόχρονης ανάθεσης Χ 1, Χ 2,, Χ n := E 1, E 2, E n και ποια της ακολουθίας αναθέσεων Χ 1:= E 1; Χ 2:= E 2; ; Χ n := E n ; Λύση (i) { p X:= E { p[e/x] Το αξίωμα είναι λάθος. Για παράδειγμα η χρήση του θα μας οδηγούσε στο συμπέρασμα ότι { Χ = Ε+1 X:= E { Ε = Ε+1 που είναι προφανώς λανθασμένο. (ii) { p[e/x] X:= E {p Το αξίωμα είναι ορθό: Αν κάποια συνθήκη p ισχύει μετά από την ανάθεση X:= E για τη μεταβλητή Χ τότε η συνθήκη αυτή θα πρέπει να ήταν αληθής και πριν από την ανάθεση για το Ε. (iii) { p X:= E { p X = E Το αξίωμα είναι λάθος. Για παράδειγμα η χρήση του θα μας οδηγούσε στο συμπέρασμα ότι { Χ = Ε+1 X:= E { Χ=Ε+1 Χ=Ε που είναι προφανώς λανθασμένο. (iv) { p X = E X:= E { p Το αξίωμα είναι ορθό. Προφανώς αν η εκτέλεση της ανάθεσης ξεκινήσει από μια κατάσταση όπου p και X = E, η ανάθεση δεν θα αλλάξει την κατάσταση του προγράμματος (το Χ είχε την τιμή Ε από την αρχή) επομένως η συνθήκη p θα συνεχίσει να ικανοποιείται. (β) H εκφώνηση της άσκηση περιείχε τυπογραφικό λάθος. Η σωστή εκφώνηση είναι η εξής: Για οποιαδήποτε μεταβλητή Χ, ας γράψουμε Χ++ για την έκφραση η οποία υπολογίζεται ως την τιμή Χ+1 καθώς αυξάνει κατά 1 τη τιμή της μεταβλητής Χ. Για παράδειγμα, αν η μεταβλητή Χ έχει την τιμή 3 εκτέλεση της εντολής Υ := Χ++ έχει ως αποτέλεσμα τόσο το Υ όσο και το Χ να πάρουν την τιμή 4. Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2017 Σελίδα 6 από 7
Να εξηγήσετε γιατί εισαγωγή του πιο πάνω τύπου εκφράσεων στην γλώσσα while θα έχει ως αποτέλεσμα να χάσει την εγκυρότητά του το αξίωμα της ανάθεσης (διαφάνεια 9 13). Η εισαγωγή της έκφρασης αυτής στη γλώσσα έχει σαν αποτέλεσμα να χάσει την εγκυρότητά του το αξίωμα της ανάθεσης γιατί σε μία ανάθεση είναι δυνατόν να αλλάξουν ταυτόχρονα οι τιμές δύο και όχι μίας μεταβλητής, κάτι που δεν λαμβάνει υπόψη του ο κανόνας. Για παράδειγμα, ο υπάρχων κανόνας θα μας δώσει προδιαγραφές όπως την { Χ + 1 = Χ Υ:= Χ++ { Υ = Χ που προφανώς είναι λανθασμένη. (γ) O τελεστής X += E έχει οριστεί ως Χ := Χ+Ε. Κατάλληλο αξίωμα για την απόδειξη της ορθότητας προδιαγραφών που αφορούν τον τελεστή αυτό είναι το: {p[χ+e/x] X += E {p Το αξίωμα αυτό προκύπτει από το αξίωμα του τελεστή της ανάθεσης και τον ορισμό του τελεστή υπό μελέτη. (δ) Ακολουθεί αξίωμα για την εντολή ταυτόχρονης ανάθεσης: {p[e 1, E 2, E n / Χ 1, Χ 2,, Χ n] Χ 1, Χ 2,, Χ n := E 1, E 2, E n {p Παρατηρούμε ότι ενώ η ασθενέστερη προσυνθήκη της ταυτόχρονης ανάθεσης Χ 1, Χ 2,, Χ n := E 1, E 2, E n είναι η p[e 1, E 2, E n / Χ 1, Χ 2,, Χ n], η ασθενέστερη προσυνθήκη της ακολουθίας αναθέσεων Χ 1:= E 1; Χ 2:= E 2; ; Χ n := E n είναι η ( ((p[e n / Χ n])[ E n 1 / Χ n 1]) )[ E 1 / Χ 1] Έτσι, για παράδειγμα, ισχύει ότι {3=3, Χ+1=5 Χ,Υ:=3, Χ+1 {X=3, Y=5 που μας δίνει ως ασθενέστερη προσυνθήκη την Χ=4 ενώ {Y+1=3, Υ+2 = 5 Χ:= Y+1; {X=3, Χ+1=5 Υ:=Χ+1 {X=3, Y=5 που μας δίνει ως ασθενέστερη προσυνθήκη την Y = 2 Υ = 3 false. Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2017 Σελίδα 7 από 7