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
n­0
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 .
}

Podobne dokumenty