mapa Aleksandrii
Transkrypt
mapa Aleksandrii
Wykład 4. POPRAWNOŚĆ, str. 1 O poprawności Które z tych odpowiedzi są poprawne? 1. Euklides z Aleksandrii 2. Jowisz 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” 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?” 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. 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 Poprawność programów Czy ta mapa jest poprawna? • niepoprawna mapa Podhala, • niepoprawna mapa Mazur, • niepoprawna mapa hipsometryczna (fizyczna) Kaszub, • poprawna mapa przeglądowa okolic Gdańska. Wykład 4. POPRAWNOŚĆ, str. 2 Poprawność programów Czy ta mapa jest poprawna? • niepoprawna mapa Podhala, • niepoprawna mapa Mazur, • niepoprawna mapa hipsometryczna (fizyczna) Kaszub, • poprawna mapa przeglądowa okolic Gdańska. Wykład 4. POPRAWNOŚĆ, str. 2 Poprawność programów Czy ta mapa jest poprawna? • niepoprawna mapa Podhala, • niepoprawna mapa Mazur, • niepoprawna mapa hipsometryczna (fizyczna) Kaszub, • poprawna mapa przeglądowa okolic Gdańska. Wykład 4. POPRAWNOŚĆ, str. 2 Poprawność programów Czy ta mapa jest poprawna? • niepoprawna mapa Podhala, • niepoprawna mapa Mazur, • niepoprawna mapa hipsometryczna (fizyczna) Kaszub, • poprawna mapa przeglądowa okolic Gdańska. Wykład 4. POPRAWNOŚĆ, str. 2 Poprawność programów Czy ta mapa jest poprawna? • niepoprawna mapa Podhala, • niepoprawna mapa Mazur, • niepoprawna mapa hipsometryczna (fizyczna) Kaszub, • poprawna mapa przeglądowa okolic Gdańska. Wykład 4. POPRAWNOŚĆ, str. 2 Poprawność programów 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. Wykład 4. POPRAWNOŚĆ, str. 2 Poprawność programów 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. Wykład 4. POPRAWNOŚĆ, str. 2 Poprawność programów 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 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 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 x+y −4 100 • formuły rzędu 0 czyli wyrażenia o wartościach logicznych, np. x+y>0 x 1 −10 y −5 110 x+y>0 fałsz prawda • instrukcje, np. x = x+y; x y x=x+y; 1 −5 x −4 y −5 −10 110 x 100 y 110 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 x+y −4 100 • formuły rzędu 0 czyli wyrażenia o wartościach logicznych, np. x+y>0 x 1 −10 y −5 110 x+y>0 fałsz prawda • instrukcje, np. x = x+y; x y x=x+y; 1 −5 x −4 y −5 −10 110 x 100 y 110 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 x+y −4 100 • formuły rzędu 0 czyli wyrażenia o wartościach logicznych, np. x+y>0 x 1 −10 y −5 110 x+y>0 fałsz prawda • instrukcje, np. x = x+y; x y x=x+y; 1 −5 x −4 y −5 −10 110 x 100 y 110 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 x+y −4 100 • formuły rzędu 0 czyli wyrażenia o wartościach logicznych, np. x+y>0 x 1 −10 y −5 110 x+y>0 fałsz prawda • instrukcje, np. x = x+y; x y x=x+y; 1 −5 x −4 y −5 −10 110 x 100 y 110 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 x+y −4 100 • formuły rzędu 0 czyli wyrażenia o wartościach logicznych, np. x+y>0 x 1 −10 y −5 110 x+y>0 fałsz prawda • instrukcje, np. x = x+y; x 1 −10 y x=x+y; −5 x −4 y −5 110 x 100 y 110 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 x+y −4 100 • formuły rzędu 0 czyli wyrażenia o wartościach logicznych, np. x+y>0 x 1 −10 y −5 110 x+y>0 fałsz prawda • instrukcje, np. x = x+y; x y x=x+y; 1 −5 x −4 y −5 −10 110 x 100 y 110 Wykład 4. POPRAWNOŚĆ, str. 4 Poprawność programów Kryteria poprawności programu — asercje W dyskusji o programie 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 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 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 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 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 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. 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ę . . . ”). 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; 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; 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 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 , 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. 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! . 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. 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 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. 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 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. 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. 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. 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. 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. 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. 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. 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. 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 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 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 ∗/ 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 C. A. R. Hoare (zdjęcie z Wikipedii) 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) 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). 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. 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. 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 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 ∗/ 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 ∗/ 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∗/ 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∗/ 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 ∗/ (aksj. przypisania) /∗P (w)∗/ x=w; /∗P (x)∗/ (reg. uproszcz. instr. warunkowej) /∗ P & W ∗/ K /∗Q∗/ P & ¬W ⇒ Q /∗P ∗/ if (W ) K /∗Q∗/ (reg. konsekwencji) P ⇒ P′ /∗P ′ ∗/ K /∗Q′ ∗/ Q′ ⇒ Q /∗P ∗/ K /∗Q∗/ 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 ∗/ (aksj. przypisania) /∗P (w)∗/ x=w; /∗P (x)∗/ (reg. uproszcz. instr. warunkowej) /∗ P & W ∗/ K /∗Q∗/ P & ¬W ⇒ Q /∗P ∗/ if (W ) K /∗Q∗/ (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”: (aksj. przypisania) /∗P (w)∗/ x=w; /∗P (x)∗/ 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. Wykład 4. POPRAWNOŚĆ, str. 12 Poprawność programów Logika Hoare’a dla częściowej poprawności Aksjomat przypisania — zastępowanie „pod prąd”: (aksj. przypisania) /∗P (w)∗/ x=w; /∗P (x)∗/ 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. ??? ? x=w; P (x) ? Wykład 4. POPRAWNOŚĆ, str. 12 Poprawność programów Logika Hoare’a dla częściowej poprawności Aksjomat przypisania — zastępowanie „pod prąd”: (aksj. przypisania) /∗P (w)∗/ x=w; /∗P (x)∗/ 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. P (w) ? x=w; P (x) ? Wykład 4. POPRAWNOŚĆ, str. 12 Poprawność programów Logika Hoare’a dla częściowej poprawności Aksjomat przypisania — zastępowanie „pod prąd”: (aksj. przypisania) /∗P (w)∗/ x=w; /∗P (x)∗/ 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. P (w) ? x=w; P (x) ? Wykład 4. POPRAWNOŚĆ, str. 12 Poprawność programów Logika Hoare’a dla częściowej poprawności Aksjomat przypisania — zastępowanie „pod prąd”: (aksj. przypisania) /∗P (w)∗/ x=w; /∗P (x)∗/ 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 ∗/ P (w) ? x=w; P (x) ? 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; P (x) ? 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 ∗/ P (x) ? 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 P (x) ? 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 . 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 . ? W | ¬W ? K ? 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 . ? W | ¬W P &W ? K P ? 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 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 ? Przykład: M • Ponieważ /∗ n ¬ 1000 & n < 1000 ∗/ n = n+1; /∗ n ¬ 1000 ∗/ P & ¬W 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ść. 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 ? K Q′ ? 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 zachowuje częściową poprawność. P ′ P ? K Q′ ? 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′ ? Q 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 ∗/ Q 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 Q 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 Q 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. 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 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 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 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 = i(i+1) 2 ∗/ Wykład 4. POPRAWNOŚĆ, str. 17 Poprawność programów Przykład: M5 /∗ 0 ¬ i ¬ n & s + i = — z aksj. przypisania 6 i(i+1) 2 ∗/ s=s+i; /∗ 0 ¬ i ¬ n & s = /∗ 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 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 ∗/ — z reg. następstwa zastosowanej do 6 i 5 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 = i(i+1) 2 & i < n ∗/ i(i+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; } & ¬i < n ∗/ /∗ 0 ¬ i ¬ n & s = i(i+1) 2 — z reg. pętli zastosowanej do 8 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 = i(i+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 ∗/ while (i<n) { i=i+1; s=s+i; } /∗ s = n(n+1) ∗/ 2 i(i+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 ∗/ 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)) 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)) 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 • K jest częściowo poprawny względem P i Q, oraz • ∀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 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 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. 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 . } 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 . } 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 . } 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 . }