Wykład 06 Metody Analizy Programów System Hoare Grażyna Mirkowska PJWSTK, 29 listopada 2000 Wyklad 06 Metody Analizy Programów System Hoare'a
System Hoare’a 1969 Niech P1, P2, P będą programami, a a,b- formułami. H1 {a(x/t)} x:= t {a(x)} H2 {a}P1{a’}, {a’} P2{b} {a} begin P1; P2 end {b} H3 {a g}P1{b}, {a g} P2 {b } {a} if g then P1 else P2 fi {b} H4 {a g}P{a} , {a} while g do P od {a g } H5 (a1 a), {a }P{b}, (b b1) {a1} P {b1} Aksjomat instrukcji przypisania Reguła instrukcji złożonej Reguła instrukcji warunkowej Reguła instrukcji iteracji Reguła konsekwencji Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Przykład 1/6 Flaga Holenderska begin i :=1; j :=1; k :=1; while kn do if bleu(k) then zamień(k,j); zamień(j,i); i := i+1; j := j+1 else if blanc(k) then zamień(k,j); j:= j+1 fi fi; k := k+1; od end; DANE: tablica C(1: n) kolorowych kul białych niebieskich i czerwonych. bleu(i), blanc(i), rouge(i) są predykatami wskazującymi kolor kuli . Procedura zamień(i,j) dokonuje zamiany położenia i-tej i j-tej kuli. begin aux := C(i); C(i) := C(j); C(j):= aux end; SZUKANE: tablica C uporządkowana tak, by wszystkie kule niebieskie poprzedzały kule białe, a kule biale poprzedzały kule czerwone. Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Idea algorytmu ijk k=i=j=1 Idea algorytmu jest następująca: zbiór pozycji dzielimy na 4 części, które zawierają odpowiednio kule niebieskie, kule białe, kule czerwone i zbiór kul jeszcze “do rozważenia”. Na każdym etapie algorytmu jedna z kul ze zbioru „do rozważenia” zostaje przeniesiona na właściwe miejsce. Indeks k wskazuje pozycję pierwszego z lewej miejsca jeszcze nie rozważanego ( na początku k=1), i- wskazuje pierwszą pozycję z prawej na której może się pojawić kula niebieska , j- pierwszą pozycję od prawej, na której może się pojawić kula biała. i j k i j k i j k Wyklad 06 Metody Analizy Programów System Hoare'a
Co chcemy udowodnić? Fakty pomocnicze Udowodnimy, stosując reguły Hoare, że przedstawiony program jest dobrym rozwiązaniem problemu „flagi Holenderskiej”, tzn R |= {a} P {b}, gdzie a (i) (bleu(i) blanc(i) rouge(i)) b(i, j) [(x)(1x<i bleu(x)) (ix<j blanc(x)) ( j x<n+1 rouge(x))] R jest dowolną arytmetyczną strukturą danych, w której określona jest realcja liniowego porządku i operacja następnika. rouge(i) (blanc(i) blue(i)) blue(i) (blanc(i) rouge(i)) blanc(i) (rouge(i) blue(i)) Fakty pomocnicze {blue(k) rouge(j)} zamień(k,j) {blue(j) rouge(k)} {blanc(i) blue(j)} zamień(j,i) {blue(i) blanc(j)} {blanc(k) rouge(j)} zamień(k,j) {blanc(j) rouge(k)} To są dodatkowe założenia o strukturzedanych. Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Załóżmy, że formuła a jest prawdziwa Rozważmy formułę d, która ma opisywać sytuację ogólną w każdym kroku pętli d: (x)((1x<i bleu(x) ) (ix<j blanc(x)) ( jx<k rouge(x))) k n+1 i j k P’: if bleu(k) then zamień(k,j); zamień(j,i); i := i+1; j := j+1 else if blanc(k) then zamień(k,j); j:= j+1 fi fi; k := k+1; 1 przypadek {d k n bleu(k)} [zamień(k,j); zamień(j,i)] {( x) ((1 x i bleu(x) ) (i < x j blanc(x))) ( j < x k rouge(x)) k n+1} i j k 2 przypadek {d k n bleu(k) blanc(k)} [zamień(k,j)] {( x) ((1 x < i bleu(x) ) (i x j blanc(x)) ( j< x k rouge(x))) k n+1} NIEZMIENNIK ? {d k n} P’ {d } Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Rzeczywiście: {d bleu(k)} [zamień(k,j); zamień(j,i); j:=j+1; k:=k+1] {d } {d bleu(k) blanc(k)} [zamień(k,j); j:=j+1; k:=k+1] {d } (d bleu(k) blanc(k)) (rouge(k) d ) Wynika stąd na mocy reguł H2 i H3 Hoare’a, że d jest niezmiennikiem pętli w naszym programie, czyli udowodniliśmy {d k n} P’ {d } Zatem na mocy reguły H4 mamy również udowodnione {d} while k n do P’ od {d k n } Ale R |= (d k=n+1) b Zatem na mocy reguły konsekwencji H5 otrzymujemy R |= {a} P {b} H2 {a}P1{a’}, {a’} P2{b} {a} begin P1; P2 end {b} H3 {a g}P1{b}, {a g} P2 {b } {a} if g then P1 else P2 fi {b} H4 {a g}P{a} , {a} while g do P od {a g } H5 (a1 a), {a }P{b}, (b b1) {a1} P {b1} Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Przykład 2/6 Rozdzielanie zbioru Problem: Dany jest zbiór skończony X o elememtach z pewnego liniowo uporząd-kowanego zbioru <E, >. Dany jest podział zbioru X=(t1,t2) taki, że card(t1)=n, card(t2)=m. Zadanie polega na znalezieniu takiego podziału (tt1,tt2) zbioru X , że każdy element zbioru tt1 jest niewiększy od dowolnego elementu zbioru tt2 i card(tt1)=n, card(tt2)=m. Załóżmy, że struktura danych M, do której należą elementy zbioru X, posiada funkcje max, min, delete oraz insert o następujących własnościach (Wł_Str) ( xt ) x max(t) ( xt) min(t) x max(t) t min(t) t [t := insert(e,t)] e t (x t [t := insert(e,t)] x t) [t := delete(e,t)] e t ((x t x e) [t := delete(e,t)] x t) P:begin x := max(t1); y := min(t2); while x > y do t1 := delete(x,t1); t1 := insert(y,t1); t2 := delete(y,t2); t2 := insert(x,t2); x := max(t1); y := min(t2); od end; M może być np. kolejką priorytetową. Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Idea algorytmu zbiór t1 zbiór t2 zbiór t1 zbiór t2 Wyklad 06 Metody Analizy Programów System Hoare'a
Co chcemy udowodnić? Fakty pomocnicze Twierdzenie Warunek wstępny: a = card(t1)=n card(t2)=m t1 t2 = X t1 t2= Warunek Końcowy: b = card(t1)=n card(t2)=m t1 t2 = X t1 t2= ) (x, xt1)(y, y t2) x y Twierdzenie Program P (rozdzielania zbioru) jest częściowo poprany ze względu na warunek początkowy a i warunek końcowy b w każdej strukturze danych, w której prawdziwe są warunki (Wł_Str), tzn. Jeżeli M |= Wł_Str, to M |= {a} P {b}. Z tych faktów wynika np. że wykonanie ciągu instrukcji t1 := delete(x,t1); t1 := insert(y,t1); t2 := delete(y,t2); t2 := insert(x,t2); nie zmienia mocy zbiorów t1 i t2. Fakty pomocnicze {card(t)=k et1 } [t := delete(e,t)] {card(t)=k-1} {card(t)=k et1 } [t := insert(e,t)] {card(t)=k+1} To są dodatkowe informacje o strukturzedanych. Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Formuła a= card(t1)=n card(t2)=m t1 t2 = X t1 t2= jest niezmiennikiem pętli w programie P, tzn. {a x>y} P’{a} Po zastosowaniu reguły dla iteracji H4 mamy udowodnione {a} P {a max(t1)>min(t2)} Ponieważ M|= max(t1)> min(t2) ( xt1)( yt2) x y we wszystkich rozważanych strukturach, zatem na mocy H5, {a} P {b} cnd. H4 {a g}P{a} , {a} while g do P od {a g } H5 (a1 a), {a }P{b}, (b b1) {a1} P {b1} Wyklad 06 Metody Analizy Programów System Hoare'a
Czy ten algorytm zawsze kończy obliczenie? Niech d(t1,t2)= liczba elementów x t1, dla których istnieje element y w t2 taki, że y<x. FAKT Ciąg wartości funkcji d maleje przy każdej iteracji pętli w programie P. P: begin x := max(t1); y := min(t2); while x > y do t1 := delete(x,t1); t1 := insert(y,t1); t2 := delete(y,t2); t2 := insert(x,t2); x := max(t1); y := min(t2); od end; d(t1,t2) = i Ile iteracji wykona ten algorytm w najgorszym razie? Min(n,m ) d(t1,t2) < i Np.: 579 |6782 Ponieważ d(t1,t2) jest liczbą naturalną i 0 d(t1,t2) n dla wszystkich wartości t1 otrzymanych w trakcie realizacji algorytmu, zatem po skończonej liczbie kroków algorytm zatrzyma się. Wyklad 06 Metody Analizy Programów System Hoare'a
Przykład 3/6 Funkcja McCarthy Problem Zbadać częściową poprawność tego programu w strukturze liczb naturalnych ze względu na specyfikację < x 100 , 1 z y 111> Rozważmy program begin y := x; z := 1; while (y 100 z1)do if y 100 then y := y+11; z:= z+1 else y := y-10; z:= z-1 fi od end; y £111 z 1 (y £111 z 1) y£100) (y >100 y £111 z 1 z1) y+11 £111 z +1 1 y£100) y £111 z 1 Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Twierdzenie 1 Formuła d = (y £111 z 1) jest niezmiennikiem pętli w programie P, tzn. N |= {d (y£100 z 1)} P {d}. Dowód. W strukturze liczb naturalnych następujący ciąg implikacji jest prawdziwy (y£100 d (y£100 z 1)) ( y£100 y £111 z 1) (y£100 (y+11 £111 z +11) ) (1) Stosując dwa razy regułę H1 otrzymamy N |= {y+11 £111 z +1 1} (y := y+11) {y £111 z +1 1} N |= {y £111 z +1 1} (z :=z+1) {y £111 z 1} Na mocy reguły H2 mamy N |= {y+11 £111 z +1 1} begin y := y+11; z := z+1 end {y £111 z 1} Korzystając z (1) możemy wzmocnić tę ostatnią własność (reguła H5). Zatem N |= {y£100 d (y£100 z 1)} begin y := y+11; z := z+1 end {y £111 z 1} (2) H1 {a(x/t)} x:= t {a(x)} Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a To samo rozumowanie może być powtórzone w przypadku, gdy y >100 . Zatem mamy N |= y>100 d (y£100 z1) y>100 (y £111 z 1 z 1) y>100 (z-1>0 y-10£101 ) (3) Stosując do powyższego dwa razy regulę H1 otrzymamy kolejno N |= {z-1>0 y-10£101} (y :=y-10) { z-1>0 y£101} N |= { z-1>0 y£101} (z :=z-1) { z 1 y£101 } Stąd na mocy reguły H2 oraz formuły (3) mamy N |= {z-1>0 y-10£101} begin y :=y-10; z:=z-1 end { z 1 y£101 } Pozostało tylko zastosować regułę H5 do zdań (2), (4) i mamy : N |= {y>100 d (y£100 z 1)} begin y :=y-10; z:=z-1 end {d} (4) Ostatecznie N |= {d (y£100 z 1)} P {d} H1 {a(x/t)} x:= t {a(x)} H5 (a1 a), {a }P{b}, (b b1) {a1} P {b1} Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Twierdzenie Program P jest częściowo poprawny ze względu na warunek początkowy x£100 i warunek końcowy (y £111 z 1), N |= {x £ 100} P {y £111 z 1} Dowód Oczywiście mamy N |= {x £ 100} (y:=x; z:=1) {y £111 z 1} Na mocy poprzedniego twierdzenia N |= { y£111 z 1 (y 100 z1)} P {y£111 z 1} Zatem korzystając z reguły pętli H4 mamy: N |= {x £ 100} P {y >100 y £111 z 1} H4 {a g}P{a} , {a} while g do P od {a g } Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Twierdzenie Program P zatrzymuje sięę dla wszystkich danych spełniających warunek x 100 w strukturze liczb naturalnych. Dowód Niech f(y,z) = -2*y+21*z+201 . Oczywiście mamy : f(y,z)=a (-2(y+11)+21(z+1)+201)= a-1 f(y,z)=a (-2(y-10)+21(z-1)+201)= a-1 Stosując regułę H1, możemy wywnioskować co następuje {f(y,z)=a } [y :=y+11; z:=z+1] {f(y,z) = a-1} {f(y,z)=a } [y :=y-10; z:=z-1] {f(y,z) = a-1} Dzięki regule H2 otrzymamy {f(y,z)=a} P {f(y,z)=a-1}. Oznacza to. że wartości funkcji f(y,z) maleją przy kolejnych iteracjach pętli . Na mocy niezmiennika mamy y £ 111, 1 £z , a stąd f(y,z) = -2y +21z+201 £ -222+21+201 £ 0). Zatem istnieje w każdym obliczeniu taki punkt, którym warunek pętli nie będzie spełniony, tzn program zatrzyma się. Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Definicja Całkowita poprawność Powiemy, że program jest całkowicie poprawny za względu na warunek początkowy a i warunek końcowy b wttw - dla wszystkich danych początkowych spełniających warunek a, program zatrzymuje się oraz - otrzymane wyniki spełniają warunek końcowy b. Wyklad 06 Metody Analizy Programów System Hoare'a
Wyklad 06 Metody Analizy Programów System Hoare'a Definicja Najsłabszy warunek wstępny. Najsłabszym warunkiem wstępnym programu P w strukturze M nazywmy taką formułę a, kóra spełnia warunki: (1) dla dowolnych danych początkowych w M, spełniających warunek a, wyniki programu istnieją i spełniają warunek b, tzn. M |= (a => Pb), (tzn. program P jest całkowicie poprawny ze względu na <a,b> w strukturze M), (2) każdy inny warunek d spełniający (1),tzn. M |= (d => Pb), implikuje a w strukturze M, tzn. M |= (d =>a). Twierdzenie Niech a będzie formulą równoważną Pb w M. Wtedy a jest najsłabszym warunkiem wstępnym programu P ze względu na formułę b. Dowód: Oczywiście mamy M |= (a =>Pb). Niech d będzie taką formułą, że M |= (d => Pb). Wtedy również mamy M |= (d =>a). Cnd. Wyklad 06 Metody Analizy Programów System Hoare'a