Semantyka i weryfikacja programów/Ćwiczenia 7: Różnice pomiędzy wersjami
Nie podano opisu zmian |
m Zastępowanie tekstu – „<math> ” na „<math>” |
||
(Nie pokazano 4 wersji utworzonych przez 2 użytkowników) | |||
Linia 38: | Linia 38: | ||
</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''. | ||
}} | }} | ||
<!-- | |||
Powyższy język to tak naprawdę TINY z wykładu rozszerzony o jedną | Powyższy język to tak naprawdę TINY z wykładu rozszerzony o jedną | ||
konstrukcję: pętlę '''repeat'''. Spróbuj wykonać to ćwiczenie nie | konstrukcję: pętlę '''repeat'''. Spróbuj wykonać to ćwiczenie nie | ||
Linia 73: | Linia 73: | ||
Var w zbiór Int. Zbiór wszystkich stanów to: | Var w zbiór Int. Zbiór wszystkich stanów to: | ||
<center><math>State = Var \rightarrow Int </math></center> | <center><math>State = Var \rightarrow Int</math></center> | ||
Zdefiniujmy następnie niezbędne funkcje semantyczne. | Zdefiniujmy następnie niezbędne funkcje semantyczne. | ||
* Dla wyrażeń mamy | * Dla wyrażeń mamy | ||
<center><math>\mathcal{E} & : & \mathrm Exp \rightarrow \mathrm State \rightarrow \mathrm Int | <center><math>\mathcal{E} & : & \mathrm Exp \rightarrow \mathrm State \rightarrow \mathrm Int</math></center> | ||
* Dla wyrażeń logicznych: | * Dla wyrażeń logicznych: | ||
<center><math>\mathcal{B} & : & \mathrm BExp \rightarrow \mathrm State \rightarrow \mathrm Bool | <center><math>\mathcal{B} & : & \mathrm BExp \rightarrow \mathrm State \rightarrow \mathrm Bool</math></center> | ||
* Dla instrukcji: | * Dla instrukcji: | ||
<center><math>\mathcal{I} & : & \mathrm Stmt \rightarrow \mathrm State \rightarrow \mathrm State | <center><math>\mathcal{I} & : & \mathrm Stmt \rightarrow \mathrm State \rightarrow \mathrm State</math></center> | ||
* Oraz oczywistą funkcję dla stałych całkowitych: | * Oraz oczywistą funkcję dla stałych całkowitych: | ||
<center><math>\mathcal{Z} & : & \mathrm Num \rightarrow \mathcal{Z} | <center><math>\mathcal{Z} & : & \mathrm Num \rightarrow \mathcal{Z}</math></center> | ||
Funkcji {Z} nie definiujemy, przyjmując jak zwykle, że jej wynikiem | Funkcji {Z} nie definiujemy, przyjmując jak zwykle, że jej wynikiem | ||
Linia 115: | Linia 115: | ||
<center><math>\mathcal{E} [\![x]\!] = \l s \in \mathrm State.s (x)</math></center> | <center><math>\mathcal{E} [\![x]\!] = \l s \in \mathrm State.s (x)</math></center> | ||
--> | |||
=== Pętla '''for''' === | === Pętla '''for''' === | ||
{{cwiczenie|2|cw2| | {{cwiczenie|2|cw2| | ||
Linia 130: | Linia 130: | ||
# Jeśli <math>x > m</math>, to pętla kończy się. | # Jeśli <math>x > m</math>, to pętla kończy się. | ||
# W przeciwnym razie: | # W przeciwnym razie: | ||
#* Wykonujemy instrukcję <math> i </math>. | #* Wykonujemy instrukcję <math>i</math>. | ||
#* Zwiększamy zmienną <math>x</math> o 1. | #* Zwiększamy zmienną <math>x</math> o 1. | ||
#* Powracamy do punktu 3. | #* Powracamy do punktu 3. | ||
Linia 136: | Linia 136: | ||
}} | }} | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<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| | {{cwiczenie|3|cw3| | ||
Linia 158: | Linia 158: | ||
}} | }} | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<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| | {{cwiczenie| 4|cw4| | ||
Linia 176: | Linia 176: | ||
}} | }} | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<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| | {{cwiczenie|5|cw5| | ||
Linia 196: | Linia 196: | ||
# Jeśli wyrażenie wylicza się do fałszu, to pętla kończy się. | # Jeśli wyrażenie wylicza się do fałszu, to pętla kończy się. | ||
# W przeciwnym razie: | # W przeciwnym razie: | ||
#* Wykonujemy instrukcję <math> i_3 </math>. | #* Wykonujemy instrukcję <math>i_3</math>. | ||
#* Wykonujemy instrukcję <math> i_2 </math>. | #* Wykonujemy instrukcję <math>i_2</math>. | ||
#* Powracamy do punktu 2. | #* Powracamy do punktu 2. | ||
}} | }} | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<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> | ||
Aktualna wersja na dzień 22:13, 11 wrz 2023
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.
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
Ć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
Ćwiczenie 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 jest zwiększana łącznie o 2+4+6+8+10. Jeśli uznamy, że zmiany zmiennej wewnątrz pętli nie wpływają na liczbę iteracji, to pętla wykona się 10 razy, a zmienna zostanie zwiększona o 2+3+4+5+6+7+8+9+10+11. Zdefiniuj taką semantykę.
Rozwiązanie
Ć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