Άσκηση 1 Λύσεις Σειράς Ασκήσεων 5 Να υπολογίσετε τις ασθενέστερες προσυνθήκες έτσι ώστε οι πιο κάτω προδιαγραφές να είναι ορθές σύμφωνα (i) με την έννοια της μερικής ορθότητας και (ii) με την έννοια της ολικής ορθότητας. Να αιτιολογήσετε σύντομα τις απαντήσεις σας (δεν είναι απαραίτητο να κατασκευάσετε αποδείξεις με τους κανόνες). (α) Η ασθενέστερη προσυνθήκη της προδιαγραφής (τόσο για μερική όσο και για ολική ορθότητα) είναι η x = 1 x = 1 αφού προφανώς το x θα πάρει την τιμή 0 μόνο στις δύο αυτές περιπτώσεις. Ακολουθεί και η απόδειξη. { x = 1 x = 1 } { (x > 0 x 1 = 0) (x <= 0 x+1 = 0) } Συνεπαγωγή if x > 0 { x 1 = 0 } Προσυνθήκη if x := x 1 { x = 0 } { x + 1 = 0 } Προσυνθήκη x := x + 1 { x = 0 } { x = 0 } Καν. if (β) Η ασθενέστερη προσυνθήκη της προδιαγραφής (τόσο για μερική όσο και για ολική ορθότητα) είναι η x = a n n >= 0. Ακολουθεί και η απόδειξη. {x = a n n >= 0} {x*a = a n+1 n+1 > 0} Συνεπαγωγή x := x a; {x = a n+1 n+1 > 0} n := n + 1 {x = a n n > 0} (γ) Η ασθενέστερη προσυνθήκη της προδιαγραφής (τόσο για μερική όσο και για ολική ορθότητα) είναι η (i < j) A[j] > 1) (i >= j {A[i] > 0). Ακολουθεί και η απόδειξη. { (i < j) A[j] 1> 0) (i >= j {A[i] > 0) } if i < j {A[j] 1> 0} then A[i]:= A[j] 1 A[j] := A[i] 1 Προσυνθήκη if Προσυνθήκη Καν. if Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2014 Σελίδα 1
(δ) Η ασθενέστερη προσυνθήκη της προδιαγραφής για μερική ορθότητα είναι η true ενώ για ολική ορθότητα είναι η x k. Ακολουθούν οι αποδείξεις. Μερική ορθότητα Αμετάβλητη συνθήκη: true while (x!= k) { true x!= k } Αμ. Συνθ. και φρουρός Συνεπαγωγή x := x-1 {true x = k} Καν. partial while {x = k} Συνεπαγωγή Ολική ορθότητα Αμετάβλητη συνθήκη: true Μεταβλητή έκφραση: x k { k x } { 0 x k } Συνεπαγωγή while (x!= k) { true x!= k 0 x k = E 0 } Αμ. Συνθ. και Μετ. Εκφρ. και Φρουρός { true 0 x 1 k < E 0 } Συνεπαγωγή x := x-1 { true 0 x k < E 0 } {true x = k} Καν. while {x = k} Συνεπαγωγή Άσκηση 2 Να αποδείξετε την ορθότητα των πιο κάτω προδιαγραφών με την έννοια της μερικής ορθότητας. {y = 0} { (y+1 > 0 & y >= 0) [(y (y+1)> 0 y (y+1) y+(y+1)+y = y (y+1) y ) (y+1 > 0 & y >= 0) y+1 = y)} x := y + 1; (y (y+1) 0 y (y+1) = y (y+1) y )] { (x > 0 & y >= 0) [(y x > 0 y x y+x+y = y x y ) (y x 0 y x = y x y )] (x > 0 & y >= 0) x = y)} if (x > 0 & y >= 0) then { (y x > 0 y x y + x + y = y x y ) (y x 0 y x = y x y ) } x := y - x; Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2014 Σελίδα 2
{x=y} { (x > 0 x x + y = x y ) (x 0 x = x y ) } y := x - y { (x>0 x y=y ) (x 0 x = y)} if (x > 0) then {x y=y} x := x y {x=y} (β) Αμετάβλητη συνθήκη του while loop: lg a = lg x + r x 1 {a > 1} { lg a = lg a + 0 a 1 } Συνεπαγωγή x := a ; { lg a = lg x + 0 x 1 } r := 0; { lg a = lg x + r x 1 } while ( x > 1) { lg a = lg x + r x 1 x > 1 } Αμ. Συνθήκη και Φρουρός { lg a = lg (x div 2) + r + 1 x div 2 1 } Συνεπαγωγή (Δες εξήγηση *) x := x div 2 ; { lg a = lg x + r + 1 x 1 } r := r + 1 { lg a = lg x + r x 1 } { lg a = lg x + r x 1 x 1 } Καν. Partial while { r = lg a } Συνεπαγωγή Εξήγηση συνεπαγωγής (*): Έστω lg a = lg x + r x 1 x > 1. Τότε από τη δοσμένη σχέση lg x = lg (x div 2) +1, έχουμε lg a = lg (x div 2) + 1 + r x > 1 και επομένως lg a = lg (x div 2) + r + 1 x div 2 1 Άσκηση 3 Να αποδείξετε την ορθότητα των πιο κάτω προδιαγραφών με την έννοια της ολικής ορθότητας. (α) Αμετάβλητη συνθήκη του βρόχου είναι η x = b + z y = a z z 0 και μεταβλητή έκφραση η z. Ακολουθεί η απόδειξη. {x = a y = b a > b} {x = b + x y y = a x + y x y 0 } Συνεπαγωγή z := x - y; {x = b + z y = a z z 0 } Κανόνας Ανάθεσης while (1 z){ Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2014 Σελίδα 3
} {x = b + z y = a z z 1 0 z = E 0 } Αμ. Συνθ., Μετ. Εκφρ. και Φρ. {x 1 = b + z 1 y + 1 = a z + 1 z 1 0 0 z 1< E 0 } Συνεπαγωγή x := x - 1; {x = b + z 1 y + 1 = a z + 1 z 1 0 0 z 1 < E 0 } y := y + 1; {x = b + z 1 y = a z + 1 z 1 0 0 z 1 < E 0 } z := z - 1; {x = b + z y = a z z 0 0 z < E 0 } {x = b z y = a + z z < 1 z 0 } Καν. total while {x = b y = a} Συνεπαγωγή (β) O πιο κάτω αλγόριθμος υπολογίζει το στοιχείο πλειοψηφίας στον πίνακα Α[0,Ν 1] αν ένα τέτοιο στοιχείο υπάρχει. Στην προδιαγραφή συμβολίζουμε με #Α[i,j].x τον αριθμό των εμφανίσεων του στοιχείου x στον πίνακα Α[i,j]. Αμετάβλητη συνθήκη του βρόχου είναι η y [y x ( #Α[0,i 1].y i/2 )] x = A[j] c = #A.[j,i 1].x και μεταβλητή έκφραση η N i. Ακολουθεί η απόδειξη. {0 Ν } { y [y x ( #Α[0, 1].y 0/2 )] x = A[0] 0 = #A.[0,i 1].x 0 Ν } Συνεπαγωγή i := 0; { y [y x ( #Α[0,i 1].y i/2 )] x = A[0] 0 = #A.[0,i 1].x 0 Ν i } Καν. Αναθ. j := 0; { y [y x ( #Α[0,i 1].y i/2 )] x = A[j] 0 = #A.[j,i 1].x 0 Ν i } Καν. Αναθ. c := 0; { y [y x ( #Α[0,i 1].y i/2 )] x = A[j] c = #A.[j,i 1].x 0 Ν i } Καν. Ανάθ. while (i!= N) do { y [y x ( #Α[0,i 1].y i/2 )] x = A[j] c = #A.[j,i 1].x i N 0 Ν i = E 0 } Αμετ. Συνθ. Και Φρουρός και Μετ. Εκφρ. { 2c i j y[y A[i] (#Α[0,i].y (i+1)/2 ) 0 Ν i 1 < E 0 ] 2c > i j 0 Ν i 1 < E 0 A[i]=x y[y x ( #Α[0,i].y (i+1)/2 )] x=a[j] c+1 = #A.[j,i].x A[i] x y[y x ( #Α[0,i].y (i+1)/2 )] x=a[j] c=#a.[j,i].x } Συνεπαγωγή (*) if (2c i-j) do { y[y A[i] (#Α[0,i].y (i+1)/2 )] } Προσυνθήκη if { A[i]=A[i] y[y A[i] (#Α[0,i].y (i+1)/2 )] A[i]=A[i] 1= #A.[i,i].A[i] 0 Ν i 1 < E 0 A[i] A[i] y[y A[i] (#Α[0,i].y (i+1)/2 )] A[i]=A[i] 0=#A.[i,i].A[i] Συνεπαγωγή j := i; { A[i]=A[i] y[y A[i] (#Α[0,i].y (i+1)/2 )] Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2014 Σελίδα 4
A[i]=A[j] 1= #A.[j,i].A[i] A[i] A[i] y[y A[i] (#Α[0,i].y (i+1)/2 )] A[i]=A[j] 0=#A.[j,i].A[i] x := A[i]; { A[i]=x y[y x (#Α[0,i].y (i+1)/2 )] x=a[j] 1= #A.[j,i].x A[i] x y[y x (#Α[0,i].y (i+1)/2 )] x=a[j] 0=#A.[j,i].x c := 0; { A[i]=x y[y x (#Α[0,i].y (i+1)/2 )] x=a[j] c+1 = #A.[j,i].x A[i] x y[y x (#Α[0,i].y (i+1)/2 )] x=a[j] c=#a.[j,i].x { A[i] = x y [y x ( #Α[0,i].y (i+1)/2 )] x = A[j] c + 1 = #A.[j,i].x A[i] x y [y x ( #Α[0,i].y (i+1)/2 )] x = A[j] c = #A.[j,i].x Καν. Εντολής if if (A[i] = x) { y [y x ( #Α[0,i].y (i+1)/2 )] x = A[j] c + 1 = #A.[j,i].x Προσυνθήκη if i := i+1; { y [y x ( #Α[0,i 1].y i/2 )] x = A[j] c + 1 = #A.[j,i 1].x c := c+1; { y [y x ( #Α[0,i 1].y i/2 )] x = A[j] c = #A.[j,i 1].x { y [y x ( #Α[0,i].y (i + 1)/2 )] x = A[j] c = #A.[j,i].x 0 Ν i 1 < E 0 } Προσυνθήκη i := i+1; { y [y x ( #Α[0,i 1].y i/2 )] x = A[j] c = #A.[j,i 1].x { y [y x ( #Α[0,i 1].y i/2 )] x = A[j] c = #A.[j,i 1].x Καν. εντολής if { y [y x ( #Α[0,i 1].y i/2 )] x = A[j] c = #A.[j,i 1].x i = N } Κανόνας tot while { y [y x ( #Α[0,N 1].y N/2 )] } Συνεπαγωγή Απόδειξη συνεπαγωγής *: Έστω ότι y [y x ( #Α[0,i 1].y i/2 )] x = A[j] c = #A.[j,i 1].x i N Διακρίνουμε τις πιο κάτω περιπτώσεις: 2c i j. Πρέπει να δείξουμε ότι #Α[0,i].A[j] i/2. Αφού επίσης Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2014 Σελίδα 5
1. y [( #Α[0,j].y j/2 )] που συνεπάγεται #Α[0,j].Α[j] j/2 2. c = #A.[j,i 1].A[j] (i j)/2 έχουμε ότι #Α[0,i].A[j] (j+i j)/2 1 + 1 (i+1)/2. Επομένως το σκέλος της συνεπαγωγής 2c i j y[y A[i] (#Α[0,i].y (i+1)/2 )] αληθεύει. 2c > i j και A[i]=x. Προφανώς, αφού y [y x ( #Α[0,i 1].y i/2 )] και Α[i] = x, ισχύει επίσης ότι y[y x ( #Α[0,i].y (i+1)/2 )]. Επιπλέον, αφού c = #A.[j,i 1].x, έχουμε ότι c+1 = #A.[j,i].x. Επομένως το σκέλος της συνεπαγωγής 2c > i j A[i]=x y[y x ( #Α[0,i].y (i+1)/2 )] x=a[j] c+1 = #A.[j,i].x αληθεύει. 2c > i j και A[i] x. Γνωρίζουμε ότι y [y x ( #Α[0,i 1].y i/2 )]. Θέλουμε να δείξουμε ότι ( #Α[0,i].Α[i] i/2 )] επομένως απομένει να επιβεβαιώσουμε ότι για y = A[i], #Α[0,i].y i/2. Αφού επίσης 1. y [( #Α[0,j].y j/2 )] που συνεπάγεται #Α[0,j].Α[i] j/2 2. c = #A.[j,i 1].x > (i j)/2 που συνεπάγεται ότι #Α[j,i 1].A[i] < (i j)/2 έχουμε ότι #Α[0,i].y < (j+i j)/2 + 1 < (i+2)/2 (i+1)/2. Επομένως το σκέλος της συνεπαγωγής 2c > i j A[i] x y[y x ( #Α[0,i].y (i+1)/2 )] x=a[j] c=#a.[j,i].x αληθεύει. Αυτό ολοκληρώνει την απόδειξη. Άσκηση 4 Θέλουμε να προσθέσουμε στη γλώσσα μας WHILE (διαφάνεια 9 5), εντολές της μορφής: if? then C 1 C 2 Οι εντολές αυτές εκτελούνται επιλέγοντας για εκτέλεση μια από τις εντολές C 1 και C 2 μη ντετερμινιστικά. (α) Να προτείνετε κανόνα για την ανάλυση προδιαγραφών που σχετίζονται με την εντολή αυτή. Ο καινούριος κανόνας για την εντολή loop C είναι ο εξής: C1 C 2 if? then C C 1 2 nondeter (β) Ακολουθεί η απόδειξη της προδιαγραφής. Αμετάβλητη συνθήκη του while loop είναι η x 0 και μεταβλητή έκφραση η x. if? then { 0 0 } Συνεπαγωγή x := 0 { x 0 } Κανόνας Ανάθεσης Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2014 Σελίδα 6
{ 3 0 } Συνεπαγωγή x := 3 { x 0 } Κανόνας Ανάθεσης { x 0 } while x > 0 { x > 0 x 0 0 x = E 0 } Φρουρός και Αμ. Συνθ. και Μετ. Εκφρ. { x 1 0 0 x 1 < E 0 } Συνεπαγωγή x := x 1 { x 0 0 x < E 0 } { x 0 x 0 } Κανόνας total while { x = 0 } Συνεπαγωγή Λύσεις Σειρά Προβλημάτων 5 Χειμερινό Εξάμηνο 2014 Σελίδα 7