Semantyka i weryfikacja programów/Ćwiczenia 7: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
Linia 18: | Linia 18: | ||
n \,\,|\,\, | n \,\,|\,\, | ||
x \,\,|\,\, | x \,\,|\,\, | ||
e_1 | e_1\,\, + \,\, e_2 | ||
</math> | </math> | ||
<math> | <math> | ||
b \, ::= \,\, | b \, ::= \,\, | ||
e_1 = e_2 \,\,|\,\, | e_1\,\, = \,\, e_2 \,\,|\,\, | ||
\mathbf{not}\, b \,\,|\,\, | \mathbf{not}\,\, b \,\,|\,\, | ||
b_1\, \mathbf{or} | b_1\,\, \mathbf{or}\,\, b_2 | ||
</math> | </math> | ||
Linia 32: | Linia 32: | ||
x := e \,\,|\,\, | x := e \,\,|\,\, | ||
i_1; i_2 \,\,|\,\, | i_1; i_2 \,\,|\,\, | ||
\mathbf{if}\, b \,\mathbf{then}\, i_1 \,\mathbf{else}\, i_2 \,\,|\,\, | \mathbf{if}\,\, b \,\,\mathbf{then}\,\, i_1 \,\,\mathbf{else}\,\, i_2 \,\,|\,\, | ||
\mathbf{skip} \,\,|\,\, | \mathbf{skip} \,\,|\,\, | ||
\mathbf{while}\, b \,\mathbf{do}\, i \,\,|\,\, | \mathbf{while}\,\, b \,\,\mathbf{do}\,\, i \,\,|\,\, | ||
\mathbf{repeat}\, i \,\mathbf{until} | \mathbf{repeat}\,\, i \,\mathbf{until}\,\, b | ||
</math> | </math> | ||
Pętla <math> \mathbf{repeat}\, i \,\mathbf{until}\, b </math> polega na wykonaniu instrukcji ''i'', a następnie wyliczeniu warunku logicznego ''b''. Jeśli warunek jest prawdziwy wykonanie pętli kończy się, w przeciwnym razie powracamy do wykonania instrukcji ''i''. | Pętla <math> \mathbf{repeat}\,\, i \,\,\mathbf{until}\,\, b </math> polega na wykonaniu instrukcji ''i'', a następnie wyliczeniu warunku logicznego ''b''. Jeśli warunek jest prawdziwy wykonanie pętli kończy się, w przeciwnym razie powracamy do wykonania instrukcji ''i''. | ||
}} | }} | ||
Wersja z 13:56, 5 sie 2006
Semantyka bezpośrednia instrukcji. Konstrukcje iteracyjne.
Zadanie 1
Ćwiczenie 1
Zdefiniuj semantykę denotacyjną następującego języka:
Pętla polega na wykonaniu instrukcji i, a następnie wyliczeniu warunku logicznego b. Jeśli warunek jest prawdziwy wykonanie pętli kończy się, w przeciwnym razie powracamy do wykonania instrukcji i.
Rozwiązanie
Zadanie 2
Rozszerzmy język z poprzedniego zadania o instrukcję:
Wykonanie takiej pętli polega na:
- Wyliczeniu wartości wyrażenia .
- Przypisaniu wartości na zmienną .
- Wyliczeniu wartości wyrażenia .
- Jeśli , to pętla kończy się.
- W przeciwnym razie:
- Wykonujemy instrukcję .
- Zwiększamy zmienną o 1.
- Powracamy do punktu 3.
Zauważmy, że wyrażenie jest tu wyliczane tylko raz, ale oblicza się przy każdym obrocie pętli.
Rozwiązanie
Zadanie 3
Zmieńmy semantykę instrukcji for z poprzedniego zadania tak, aby oba wyrażenia obliczały się tylko raz. Tym razem wyliczenie pętli polega na:
- Wyliczeniu wartości wyrażenia .
- Przypisaniu wartości na zmienną .
- Wyliczeniu wartości wyrażenia .
- Jeśli , to pętla kończy się.
- W przeciwnym razie:
- Wykonujemy instrukcję .
- Zwiększamy zmienną o 1.
- Powracamy do punktu 4.
Rozwiązanie
Zadanie 4
O pętli for można jednak myśleć jeszcze inaczej. Można wymagać, aby wszelkie zmiany wartości zmiennej sterującej wewnątrz wykonania pętli nie miały wpływu na liczbę iteracji tej pętli. Przykładowo przy semantyce z poprzedniego zadania pętla:
for x := 1 to 10 do x := x + 1; y := y + x;
wykonuje się pięć razy, a zmienna y jest zwiększana łącznie o 2+4+6+8+10. Jeśli uznamy, że zmiany zmiennej x wewnątrz pętli nie wpływają na liczbę iteracji, to pętla wykona się 10 razy, a zmienna y zostanie zwiększona o 2+3+4+5+6+7+8+9+10+11. Zdefiniuj taką semantykę.
Rozwiązanie
Zadanie 5
W języku C pętla for ma następującą postać:
Jej wykonanie polega na:
- Wykonaniu instrukcji .
- Wyliczeniu wartości wyrażenia .
- Jeśli wyrażenie wylicza się do fałszu, to pętla kończy się.
- W przeciwnym razie:
- Wykonujemy instrukcję .
- Wykonujemy instrukcję .
- Powracamy do punktu 2.
Rozwiązanie