Semantyka i weryfikacja programów/Ćwiczenia 13: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 121: | Linia 121: | ||
<math>{\color{Red}\{N \land x \leq n\}}</math> | <math>{\color{Red}\{N \land x \leq n\}}</math> | ||
<math>{\color{Green}Downarrow}</math> <span style="color:brown">// tę implikację należy udowodnić </span> | <math>{\color{Green}\Downarrow}</math> <span style="color:brown">// tę implikację należy udowodnić </span> | ||
<math>{\color{Red}\{N[x \mapsto x{+}1]\}}</math> | <math>{\color{Red}\{N[x \mapsto x{+}1]\}}</math> | ||
y := y + x; | y := y + x; | ||
Linia 139: | Linia 139: | ||
y := 0; | y := 0; | ||
<math>{\color{Red}\{n \geq 0 \land x = 1 \land y = 0\}}</math> | <math>{\color{Red}\{n \geq 0 \land x = 1 \land y = 0\}}</math> | ||
<math>{\color{Green}Downarrow}</math> <span style="color:brown">// 1 </span> | <math>{\color{Green}\Downarrow}</math> <span style="color:brown">// 1 </span> | ||
<math>{\color{Red}\{N\}}</math> | <math>{\color{Red}\{N\}}</math> | ||
while x <= n do | while x <= n do | ||
( | ( | ||
<math>{\color{Red}\{N \land x \leq n\}}</math> | <math>{\color{Red}\{N \land x \leq n\}}</math> | ||
<math>{\color{Green}Downarrow}</math> <span style="color:brown">// 2 </span> | <math>{\color{Green}\Downarrow}</math> <span style="color:brown">// 2 </span> | ||
<math>{\color{Red}\{N[x \mapsto x{+}1][y \mapsto y{+}x]\}}</math> | <math>{\color{Red}\{N[x \mapsto x{+}1][y \mapsto y{+}x]\}}</math> | ||
y := y + x; | y := y + x; | ||
Linia 152: | Linia 152: | ||
) | ) | ||
<math>{\color{Red}\{N \land x > n\}}</math> | <math>{\color{Red}\{N \land x > n\}}</math> | ||
<math>{\color{Green}Downarrow}</math> <span style="color:brown">// 3 </span> | <math>{\color{Green}\Downarrow}</math> <span style="color:brown">// 3 </span> | ||
<math>{\color{Red}\{y=\frac{n\cdot(n+1)}{2}\}}</math> | <math>{\color{Red}\{y=\frac{n\cdot(n+1)}{2}\}}</math> | ||
Linia 197: | Linia 197: | ||
y := 0; | y := 0; | ||
<math>{\color{Red}\{n \geq 0 \land x = 1 \land y = 0\}}</math> | <math>{\color{Red}\{n \geq 0 \land x = 1 \land y = 0\}}</math> | ||
<math>{\color{Green}Downarrow}</math> <span style="color:brown">// 1 </span> | <math>{\color{Green}\Downarrow}</math> <span style="color:brown">// 1 </span> | ||
<math>{\color{Red}\{N\}}</math> | <math>{\color{Red}\{N\}}</math> | ||
while <math>{\color{Red}\{N\}}</math> x <= n do | while <math>{\color{Red}\{N\}}</math> x <= n do | ||
Linia 229: | Linia 229: | ||
<math>{\color{Red}\{n \geq 1\}}</math> | <math>{\color{Red}\{n \geq 1\}}</math> | ||
<math>{\color{Green}Downarrow}</math> <span style="color:brown">// 1 </span> | <math>{\color{Green}\Downarrow}</math> <span style="color:brown">// 1 </span> | ||
<math>{\color{Red}\{N[y \mapsto 0][x \mapsto 1]\}}</math> | <math>{\color{Red}\{N[y \mapsto 0][x \mapsto 1]\}}</math> | ||
x := 1; | x := 1; | ||
Linia 241: | Linia 241: | ||
<math>{\color{Red}\{n \geq 1\}}</math> | <math>{\color{Red}\{n \geq 1\}}</math> | ||
<math>{\color{Green}Downarrow}</math> <span style="color:brown">// 1 </span> | <math>{\color{Green}\Downarrow}</math> <span style="color:brown">// 1 </span> | ||
<math>{\color{Red}\{N[y \mapsto 0][x \mapsto 1]\}}</math> | <math>{\color{Red}\{N[y \mapsto 0][x \mapsto 1]\}}</math> | ||
x := 1; | x := 1; | ||
Linia 249: | Linia 249: | ||
( | ( | ||
<math>{\color{Red}\{N \land x \leq n\}}</math> | <math>{\color{Red}\{N \land x \leq n\}}</math> | ||
<math>{\color{Green}Downarrow}</math> <span style="color:brown">// 2 </span> | <math>{\color{Green}\Downarrow}</math> <span style="color:brown">// 2 </span> | ||
<math>{\color{Red}\{N[x \mapsto x{+}1][y \mapsto y{+}x]\}}</math> | <math>{\color{Red}\{N[x \mapsto x{+}1][y \mapsto y{+}x]\}}</math> | ||
y := y + x; | y := y + x; | ||
Linia 257: | Linia 257: | ||
) | ) | ||
<math>{\color{Red}\{N \land x > n\}}</math> | <math>{\color{Red}\{N \land x > n\}}</math> | ||
<math>{\color{Green}Downarrow}</math> <span style="color:brown">// 3 </span> | <math>{\color{Green}\Downarrow}</math> <span style="color:brown">// 3 </span> | ||
<math>{\color{Red}\{y=\frac{n\cdot(n+1)}{2}\}}</math> | <math>{\color{Red}\{y=\frac{n\cdot(n+1)}{2}\}}</math> | ||
Linia 433: | Linia 433: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
<math>\mathbf{repeat}\, I \,\mathbf{until}\, b</math> zachowuje się tak samo jak <math>I; while \neg b \,\mathbf{do}\, I</math>. | <math>\mathbf{repeat}\, I \,\mathbf{until}\, b</math> zachowuje się tak samo jak <math>I; \mathbf{while}\, \neg b \,\mathbf{do}\, I</math>. | ||
Stąd łatwo otrzymać regułę: | Stąd łatwo otrzymać regułę: | ||
<math> | <math> | ||
\frac{ | \frac{{\color{Red}\{\alpha\}} I {\color{Red}\{\beta\}} | ||
\quad | \quad | ||
{\color{Red}\{\beta \land \neg b\}} I {\color{Red}\{\beta\}}} | |||
{ | {{\color{Red}\{\alpha\}} \mathbf{repeat}\, I \,\mathbf{until}\, b {\color{Red}\{\beta \land b\}}} | ||
</math> | </math> | ||
Linia 447: | Linia 447: | ||
<math> | <math> | ||
\frac{ | \frac{{\color{Red}\{\beta\}} I {\color{Red}\{\beta\}} | ||
\quad | \quad | ||
{\color{Red}\{\beta \land \neg b\}}</math> I {\color{Red}\{\beta\}}} | |||
{ | {{\color{Red}\{\beta\}} \mathbf{repeat}\, I \,\mathbf{until}\, b {\color{Red}\{\beta \land b\}}} | ||
</math> | </math> | ||
Linia 457: | Linia 457: | ||
<math> | <math> | ||
\frac{ | \frac{{\color{Red}\{\beta\}} I {\color{Red}\{\beta\}}} | ||
{ | {{\color{Red}\{\beta\}} \mathbf{repeat}\, I \,\mathbf{until}\, b {\color{Red}\{\beta \land b\}}} | ||
</math> | </math> | ||
Linia 466: | Linia 466: | ||
<math> | <math> | ||
\frac{ | \frac{{\color{Red}\{\alpha\}} I {\color{Red}\{\beta\}} | ||
\quad | \quad | ||
\beta \land \neg b \implies \alpha} | \beta \land \neg b \implies \alpha} | ||
{ | {{\color{Red}\{\alpha\}} \mathbf{repeat}\, I \,\mathbf{until}\, b {\color{Red}\{\beta \land b\}}} | ||
</math> | </math> | ||
Wersja z 08:16, 14 sie 2006
Zawartość
Poprawność częściowa prostych programów w języku Tiny.
Poprawność częściowa
Ćwiczenie 1
Przeprowadź dowód poprawności częściowej poniższego programu:
x := 1; y := 0; while x <= n do y := y + x; x := x + 1
Rozwiązanie
Ćwiczenie 2
Uzupełnij poniższe reguły:
Rozwiązanie
Ćwiczenie 3 (potęgowanie binarne)
Dowiedź poprawności częściowej poniższego programu:
z := 1; p := x; q := y; while q <> 0 do if odd(q) then z := z * p; q := q div 2; p := p * p
Wyrażenie odd(q) ma wartość wtedy i tylko wtedy, gdy q jest nieparzyste.
Rozwiązanie
Ćwiczenie 4
Zaproponuj regułe dla instrukcji .
Rozwiązanie
}
{{\color{Red}\{\beta\}} \mathbf{repeat}\, I \,\mathbf{until}\, b {\color{Red}\{\beta \land b\}}}
</math>
Jeśli to . Zatem powyzszą regułę można uprościć:
otrzymując regułę prostszą ale słabszą: we wnętrzu pętli nie możemy korzystać z tego, że począwszy od drugiej iteracji nie zachodzi !
Jeszcze inna możliwość to:
}}
Zadania domowe
Ćwiczenie 1
Wyprowadź ostatnią regułę dla pętli z pierwszej reguły.
Ćwiczenie 2
Napisz program obliczający najmniejszy wspólny dzielnik dwóch liczb i przeprowadź dowód poprawności częściowej.
Ćwiczenie 3
Przeprowadź dowód poprawności częściowej:
a = 1; b := 1; y := 1; while y <= x do y := y + 3*a + 3*b + 1; a = a + 2*b + 1; b := b + 1;
Wskazówka