zatrzymać się
Transkrypt
zatrzymać się
Wykład 4. POPRAWNOŚĆ, str. 1 O poprawności Które z tych odpowiedzi są poprawne? 1. Euklides z Aleksandrii 2. Jowisz 1 jest poprawną odpowiedzią na pytanie „kto stworzył podwaliny klasycznej geometrii” i jest niepoprawną odpowiedzią na pytanie „ jaka jest najmasywniejsza planeta w naszym Ukł. Słonecznym?” 2 – na odwrót. Poprawność nigdy nie jest absolutna. Wykład 4. POPRAWNOŚĆ, str. 2 O poprawności Czy ta mapa jest poprawna? • niepoprawna mapa Podhala, • niepoprawna mapa Mazur, • niepoprawna mapa hipsometryczna (fizyczna) Kaszub, • poprawna mapa przeglądowa okolic Gdańska. Poprawność nigdy nie jest absolutna. Poprawność zawsze zależy od przyjętych kryteriów. To dotyczy również poprawności programów. Wykład 4. POPRAWNOŚĆ, str. 3 Poprawność programów Kryteria poprawności programu — asercje W programie mamy do czynienia z następującymi napisami, których wartość zmienia się, zależnie od chwilowej wartości zmiennych: • wyrażenia, np. x+y x 1 −10 y −5 110 y −5 110 x y 1 −5 x −4 y −5 −10 110 x 100 y 110 x+y −4 100 • formuły rzędu 0 czyli wyrażenia o wartościach logicznych, np. x+y>0 x 1 −10 • instrukcje, np. x = x+y; x+y>0 fałsz prawda x=x+y; Wykład 4. POPRAWNOŚĆ, str. 4 Poprawność programów Kryteria poprawności programu — asercje W dyskusji o programie mamy jeszcze do czynienia z • asercjami (inaczej: formułami rzędu 1) mającymi wartość logiczną, ale nie zawsze możliwą do wyliczenia przez program; – formuły rzędu 0 są asercjami; – formuły z kwantyfikatorami też są asercjami; np. ∀y∈R x < y 2 x 1 −10 ∀y∈R x < y 2 fałsz prawda Niezmienniki pętli są asercjami. Asercje używane są do formułowania kryteriów poprawności programów. Wykład 4. POPRAWNOŚĆ, str. 5 Poprawność programów Załóżmy, że posiadamy jakieś kryterium poprawności wyników obliczeń (np. „program ma obliczać funkcję . . . ”). Na danym stanie zmiennych s program K może • nie zatrzymać się — wejść w nieskończone obliczenie; np. program while (x==x) x=0; albo • zatrzymać się z wynikiem niepoprawnym — niespełniającym kryterium albo • zatrzymać się z wynikiem poprawnym — spełniającym kryterium. Wykład 4. POPRAWNOŚĆ, str. 6 Poprawność programów DEFINICJA: M Program K jest całkowicie poprawny względem asercji P i Q wtedy i tylko wtedy, gdy dla dowolnego stanu s zmiennych programu spełniającego asercję P , K przeprowadza stan s w jakiś stan s′ spełniający asercję Q. Przykład: M Program while(n>0){ s=s*n; n=n-1; } jest całkowicie poprawny względem asercji n 0 & s = 1 i s = n! . Program while(x==x)x=0; nie jest całkowicie poprawny względem asercji prawda i fałsz. Program while(x==x)x=0; jest całkowicie poprawny względem asercji fałsz i prawda. Wykład 4. POPRAWNOŚĆ, str. 7 Poprawność programów DEFINICJA: M Program K jest częściowo poprawny względem asercji P i Q wtedy i tylko wtedy, gdy dla dowolnego stanu s zmiennych programu spełniającego asercję P , jeśli K przeprowadza stan s w s′ , to stan s′ spełnia asercję Q. Przykład: M Program while(x==x)x=0; jest częściowo poprawny względem asercji prawda i fałsz, ponieważ: jeśli program while(x==x)x=0; przeprowadza stan s spełniający asercję prawda (czyli każdy) w stan s′ (na pewno nie przeprowadza, bo się pętli), to (nieistniejący) stan s′ spełnia asercję fałsz. Wykład 4. POPRAWNOŚĆ, str. 8 Poprawność programów Przykład: M Program while(x==x)x=0; jest częściowo poprawny względem asercji prawda i fałsz. Program while(x==x)x=0; nie jest całkowicie poprawny względem asercji prawda i fałsz. TWIERDZENIE: M Program K jest całkowicie poprawny względem asercji P i Q wtedy i tylko wtedy, gdy • K jest częściowo poprawny względem P i Q, oraz • K daje wynik (zatrzymuje się) na każdym stanie zmiennych, dla którego P jest prawdziwe. Zwykle zależy nam na dowodzie całkowitej poprawności; w tym celu dowodzimy częściową poprawność i zatrzymywanie. Wykład 4. POPRAWNOŚĆ, str. 9 Poprawność programów Logika Hoare’a dla częściowej poprawności Dla dowolnych asercji P i Q oraz instrukcji K, zapis /∗ P ∗/ K /∗ Q ∗/ czytamy: K jest częściowo poprawna wzgl. P i Q Przykład: M /∗ n 0 ∗/ i=0; while (i<n) { a[i]=0; i=i+1; } /∗ ∀i∈{0,1,2,...,n−1} a[i] = 0 ∗/ — instrukcja i=0; while (i<n) { a[i]=0; i=i+1; } jest częściowo poprawna względem n0 i ∀i∈{0,1,2,...,n−1} a[i] = 0 Wykład 4. POPRAWNOŚĆ, str. 10 Poprawność programów Logika Hoare’a dla częściowej poprawności — składa się z reguł wywodu postaci (nazwa reguły) przesłanka1 przesłanka2 ··· przesłankan wniosek C. A. R. Hoare (zdjęcie z Wikipedii) (dla n = 0, czyli w braku przesłanek, regułę nazywamy aksjomatem). Jeśli dowiedzione są już wszystkie przesłanki, to reguła zezwala na dołączenie wniosku do tez dowiedzionych. Logika Hoare’a zawiera po jednej regule dla każdego rodzaju instrukcji w języku programowania, oraz jedną uniwersalną regułę konsekwencji. Wykład 4. POPRAWNOŚĆ, str. 11 Poprawność programów Logika Hoare’a dla częściowej poprawności (reg. następstwa) /∗P ∗/ K /∗Q∗/ /∗Q∗/ L /∗R∗/ /∗P ∗/ K L /∗R∗/ (reg. pętli) /∗ P & W ∗/ K /∗P ∗/ /∗P ∗/ while (W ) K /∗ P & ¬W ∗/ (reg. pełnej instr. warunkowej) /∗ P & W ∗/ K /∗Q∗/ /∗ P & ¬W ∗/ L /∗Q∗/ /∗P ∗/ if (W ) K else L /∗Q ∗/ (reg. uproszcz. instr. warunkowej) /∗ P & W ∗/ K /∗Q∗/ P & ¬W ⇒ Q /∗P ∗/ if (W ) K /∗Q∗/ (aksj. przypisania) /∗P (w)∗/ x=w; /∗P (x)∗/ (reg. konsekwencji) P ⇒ P′ /∗P ′ ∗/ K /∗Q′ ∗/ Q′ ⇒ Q /∗P ∗/ K /∗Q∗/ Wykład 4. POPRAWNOŚĆ, str. 12 Poprawność programów Logika Hoare’a dla częściowej poprawności Aksjomat przypisania — zastępowanie „pod prąd”: P (w) (aksj. przypisania) /∗P (w)∗/ x=w; /∗P (x)∗/ ? x=w; To, co chcemy wiedzieć o wartości zm. x po wykonaniu komendy x=w; musimy wiedzieć o wartości wyr. w przed wykonaniem tej komendy. Przykład: M • /∗ n/5 = 2 ∗/ n = n/5; /∗ n = 2 ∗/ — jeśli n/5 = 2, to po przypisaniu n = n/5; będzie n = 2; • /∗ n = 2 ∗/ n = n/5; /∗ n = 0 ∗/ — jeśli n = 2, to po przypisaniu n = n/5; będzie n = 0 (więc nie n/5 = 2). P (x) ? Wykład 4. POPRAWNOŚĆ, str. 13 Poprawność programów Logika Hoare’a dla częściowej poprawności Reguła pętli z niezmiennikiem: (reg. pętli) /∗ P & W ∗/ K /∗P ∗/ /∗P ∗/ while (W ) K /∗ P & ¬W ∗/ Jeśli komenda K zachowuje asercję P (pod warunkiem, że na jej wejściu spełnione jest W ), to przez cały czas działania pętli spełnione będzie P , a po jej zakończeniu spełnione będzie P & ¬W . P ? W | ¬W P &W ? K P P & ¬W ? Przykład: M • Ponieważ /∗ n ¬ 1000 & n < 1000 ∗/ n = n+1; /∗ n ¬ 1000 ∗/ , to /∗ n ¬ 1000 ∗/ while (n<1000) n = n+1; /∗ n ¬ 1000 & ¬n < 1000 ∗/ . Wykład 4. POPRAWNOŚĆ, str. 14 Poprawność programów Logika Hoare’a dla częściowej poprawności Reguła konsekwencji logicznej: (reg. konsekwencji) P ⇒ P′ /∗P ′ ∗/ K /∗Q′ ∗/ Q′ ⇒ Q /∗P ∗/ K /∗Q∗/ W stwierdzeniu częściowej poprawności komendy K wzmocnienie przed-warunku oraz osłabienie po-warunku zachowują częściową poprawność. P ? P ′ K Q′ ? Przykład: M • Ponieważ /∗ n ¬ 1000 ∗/ while (n<1000) n = n+1; /∗ n ¬ 1000 & ¬n < 1000 ∗/ oraz n = 0 ⇒ n ¬ 1000 i n ¬ 1000 & ¬n < 1000 ⇒ n = 1000 to /∗ n = 0 ∗/ while (n<1000) n = n+1; /∗ n = 1000 ∗/ . Q Wykład 4. POPRAWNOŚĆ, str. 15 Poprawność programów Proszę przyjrzeć się krytycznie wszystkim regułom logiki Hoare’a. W razie niejasności — pytać. Wykład 4. POPRAWNOŚĆ, str. 16 Poprawność programów Przykład: M 1 /∗ i = 0 ¬ n & 0 = 0 ∗/ s=0; /∗ i = 0 ¬ n & s = 0 ∗/ — z aksj. przypisania 2 /∗ 0 = 0 ¬ n & 0 = 0 ∗/ i=0; /∗ i = 0 ¬ n & 0 = 0 ∗/ — z aksj. przypisania 3 /∗ 0 = 0 ¬ n & 0 = 0 ∗/ i=0; s=0; /∗ i = 0 ¬ n & s = 0 ∗/ — z reg. następstwa zastosowanej do 2 i 1 4 /∗ n 0 ∗/ i=0; s=0; /∗ 0 ¬ i ¬ n & s = — z reg. konsekwencji zastos. do n 0 ⇒ 0 = 0 ¬ n & 0 = 0, i(i+1) 2 3 oraz i=0¬n&s=0 ⇒ 0¬i¬n&s= i(i+1) 2 ∗/ Wykład 4. POPRAWNOŚĆ, str. 17 Poprawność programów Przykład: M5 /∗ 0 ¬ i ¬ n & s + i = — z aksj. przypisania i(i+1) 2 ∗/ s=s+i; /∗ 0 ¬ i ¬ n & s = 6 ∗/ /∗ 0 ¬ i + 1 ¬ n & s + i + 1 = (i+1)(i+1+1) 2 i=i+1; ∗/ /∗ 0 ¬ i ¬ n & s + i = i(i+1) 2 — z aksj. przypisania 7 /∗ 0 ¬ i + 1 ¬ n & s + i + 1 = i=i+1; s=s+i; ∗/ /∗ 0 ¬ i ¬ n & s = i(i+1) 2 (i+1)(i+1+1) 2 i(i+1) 2 ∗/ ∗/ — z reg. następstwa zastosowanej do 6 i 5 8 /∗ 0 ¬ i ¬ n & s = i=i+1; s=s+i; /∗ 0 ¬ i ¬ n & s = i(i+1) 2 & i < n ∗/ i(i+1) 2 ∗/ — z reg. konsek. zastos. do 7 oraz 0 ¬ i ¬ n & s = i(i+1) &i<n ⇒ 0¬i+1¬n&s+i+1= 2 (i+1)(i+1+1) 2 Wykład 4. POPRAWNOŚĆ, str. 18 Poprawność programów Przykład: M8 /∗ 0 ¬ i ¬ n & s = i=i+1; s=s+i; /∗ 0 ¬ i ¬ n & s = 9 i(i+1) 2 & i < n ∗/ i(i+1) 2 ∗/ ∗/ /∗ 0 ¬ i ¬ n & s = i(i+1) 2 while (i<n) { i=i+1; s=s+i; } /∗ 0 ¬ i ¬ n & s = i(i+1) & ¬i < n ∗/ 2 — z reg. pętli zastosowanej do 8 10 /∗ 0 ¬ i ¬ n & s = i(i+1) ∗/ 2 while (i<n) { i=i+1; s=s+i; } /∗ s = n(n+1) ∗/ 2 — z reg. konsek. zastos. do 9 oraz 0 ¬ i ¬ n & s = i(i+1) & ¬i < n ⇒ s = 2 n(n+1) 2 Wykład 4. POPRAWNOŚĆ, str. 19 Poprawność programów Przykład: M4 /∗ n 0 ∗/ i=0; s=0; /∗ 0 ¬ i ¬ n & s = 10 /∗ 0 ¬ i ¬ n & s = i(i+1) 2 ∗/ i(i+1) 2 ∗/ while (i<n) { i=i+1; s=s+i; } /∗ s = n(n+1) ∗/ 2 11 /∗ n 0 ∗/ i=0; s=0; while (i<n) { i=i+1; s=s+i; } /∗ s = n(n+1) ∗/ 2 — z reg. następstwa zastosowanej do 4 i 10 Udowodniliśmy, że ten program wylicza wartość n(n + 1) s= (o ile się zatrzymuje). 2 Wykład 4. POPRAWNOŚĆ, str. 20 Poprawność DEFINICJA: (przypomnienie) M Program K jest częściowo poprawny względem asercji P i Q wtedy i tylko wtedy, gdy ∀s P (s) & K(s) istnieje =⇒ Q(K(s)) DEFINICJA: (przypomnienie) M Program K jestcałkowicie poprawny względem asercji P i Q wtedy i tylko wtedy, gdy ∀s P (s) =⇒ K(s) istnieje & Q(K(s)) TWIERDZENIE: (przypomnienie) M Program K jest całkowicie poprawny względem asercji P i Q wtedy i tylko wtedy, gdy częściowo poprawny względem P i Q, oraz • K jest • ∀s P (s) =⇒ K(s) istnieje . Wykład 4. POPRAWNOŚĆ, str. 21 Własność stopu programu Żeby udowodnić, że obliczenie pętli while zatrzymuje się, należy znaleźć licznik pętli , czyli jakąś całkowitą wielkość zależną od zmiennych programu, taką która • maleje za każdym obrotem pętli, • jest niemniejsza od zera dla każdego stanu zmiennych spełniającego niezmiennik. Przykład: (sprawdzanie, czy n jest liczbą pierwszą) M // n 2 p=2; q=n; x=n+n; Licznik pętli: q − p + 1 . // 1 < p ¬ q + 1 & x = p · q Maleje, bo while (p<=q && x!=n) { albo q maleje, albo p rośnie. if (n<x) { q=q-1; x=x-p; } Jeśli spełniony jest niezmiennik, else { p=p+1; x=x+q; } to q − p + 1 0 . }