Semantyka i weryfikacja programów/Ćwiczenia 7: Różnice pomiędzy wersjami
Linia 1: | Linia 1: | ||
== Semantyka bezpośrednia instrukcji. Konstrukcje iteracyjne. == | == Semantyka bezpośrednia instrukcji. Konstrukcje iteracyjne. == | ||
=== | === Pętle '''while''' i '''repeat''' === | ||
{{cwiczenie|1|cw1| | {{cwiczenie|1|cw1| | ||
Linia 23: | Linia 23: | ||
<math> | <math> | ||
b \, ::= \,\, | b \, ::= \,\, | ||
e_1 | e_1\, = \, e_2 \,\,|\,\, | ||
\mathbf{not}\,\, b \,\,|\,\, | \mathbf{not}\,\, b \,\,|\,\, | ||
b_1\,\, \mathbf{or}\,\, b_2 | b_1\,\, \mathbf{or}\,\, b_2 | ||
Linia 30: | Linia 30: | ||
<math> | <math> | ||
i \, ::= \,\, | i \, ::= \,\, | ||
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 \,\,|\,\, | ||
Linia 51: | Linia 51: | ||
}} | }} | ||
=== | === Pętla '''for''' === | ||
{{cwiczenie|2|cw2| | |||
Rozszerzmy język z poprzedniego zadania o instrukcję: | Rozszerzmy język z poprzedniego zadania o instrukcję: | ||
Linia 68: | Linia 69: | ||
#* Powracamy do punktu 3. | #* Powracamy do punktu 3. | ||
Zauważmy, że wyrażenie <math>e_1</math> jest tu wyliczane tylko raz, ale <math>e_2</math> oblicza się przy każdym obrocie pętli. | Zauważmy, że wyrażenie <math>e_1</math> jest tu wyliczane tylko raz, ale <math>e_2</math> oblicza się przy każdym obrocie pętli. | ||
}} | |||
{{rozwiazanie|2|roz2| | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Jeszcze nie ma. | Jeszcze nie ma. | ||
</div> | </div> | ||
</div> | </div> | ||
}} | |||
{{cwiczenie|3|cw3| | |||
Zmieńmy semantykę instrukcji for z poprzedniego zadania tak, aby | 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: | oba wyrażenia obliczały się tylko raz. Tym razem wyliczenie pętli polega na: | ||
Linia 87: | Linia 91: | ||
#* Zwiększamy zmienną <math>x</math> o 1. | #* Zwiększamy zmienną <math>x</math> o 1. | ||
#* Powracamy do punktu 4. | #* Powracamy do punktu 4. | ||
}} | |||
{{rozwiazanie|3|roz3| | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Jeszcze nie ma. | Jeszcze nie ma. | ||
</div> | </div> | ||
</div> | </div> | ||
}} | |||
{{cwiczenie|4|cw4| | |||
O pętli for można jednak myśleć jeszcze inaczej. Można wymagać, aby wszelkie zmiany wartości zmiennej sterującej <math>x</math> 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: | O pętli for można jednak myśleć jeszcze inaczej. Można wymagać, aby wszelkie zmiany wartości zmiennej sterującej <math>x</math> 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''' | '''for''' x := 1 '''to''' 10 '''do''' | ||
Linia 101: | Linia 108: | ||
y := y + x; | 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ę. | 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ę. | ||
}} | |||
{{rozwiazanie|4|roz4| | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Jeszcze nie ma. | Jeszcze nie ma. | ||
</div> | </div> | ||
</div> | </div> | ||
}} | |||
{{cwiczenie|5|cw5| | |||
W języku C pętla '''for''' ma następującą postać: | W języku C pętla '''for''' ma następującą postać: | ||
<math> | <math> | ||
Linia 123: | Linia 133: | ||
#* Wykonujemy instrukcję <math> i_2 </math>. | #* Wykonujemy instrukcję <math> i_2 </math>. | ||
#* Powracamy do punktu 2. | #* Powracamy do punktu 2. | ||
}} | |||
{{rozwiazanie|5|roz5| | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Jeszcze nie ma. | Jeszcze nie ma. | ||
</div> | </div> | ||
</div> | </div> | ||
}} |
Wersja z 14:01, 5 sie 2006
Semantyka bezpośrednia instrukcji. Konstrukcje iteracyjne.
Pętle while i repeat
Ć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
Pętla for
Ćwiczenie 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 2
Ćwiczenie 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 3
Ćwiczenie 4
Rozwiązanie 4
Ćwiczenie 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 5