Semantyka i weryfikacja programów/Ćwiczenia 7: Różnice pomiędzy wersjami
Linia 43: | Linia 43: | ||
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ę | konstrukcję: pętlę '''repeat'''. Spróbuj wykonać to ćwiczenie nie | ||
sięgając do notatek z wykładu. Jeśli napotkasz trudności, odkrywaj | sięgając do notatek z wykładu. Jeśli napotkasz trudności, odkrywaj | ||
kolejne elementy poniższego opisu. | kolejne elementy poniższego opisu. | ||
Linia 59: | Linia 59: | ||
Użyjemy elementarnych dziedzin z wykładu: | Użyjemy elementarnych dziedzin z wykładu: | ||
* Int = | * Int <nowiki>=</nowiki> ..., -1, 0, 1, ... zawierający denotacje stałych | ||
liczbowych | liczbowych | ||
* Bool = | * Bool <nowiki>=</nowiki> , zawierający wartości logiczne | ||
* Var zawierający wszystkie dozwolone identyfikatory | * Var zawierający wszystkie dozwolone identyfikatory | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Przypomnijmy, że wartość wyrażenia arytmetycznego | Przypomnijmy, że wartość wyrażenia arytmetycznego <math>e</math> zależy od | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
wartości wszystkich występujących w nim zmiennych. | wartości wszystkich występujących w nim zmiennych. | ||
Linia 71: | Linia 71: | ||
</div> | </div> | ||
Wartości te są | Wartości te są "pamiętane" w stanie, który jest funkcją ze zbioru | ||
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 \ra 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>\E & : & Exp \ra State \ra Int </math></center> | |||
* Dla wyrażeń logicznych: | * Dla wyrażeń logicznych: | ||
<center><math>\B & : & BExp \ra State \ra Bool </math></center> | |||
* Dla instrukcji: | * Dla instrukcji: | ||
<center><math>\I & : & Stmt \ra Stmt \ra Stmt </math></center> | |||
* Oraz oczywistą funkcję dla stałych całkowitych: | * Oraz oczywistą funkcję dla stałych całkowitych: | ||
<center><math>\Z & : & Num \ra Z </math></center> | |||
=== Pętla '''for''' === | === Pętla '''for''' === |
Wersja z 11:59, 9 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.
Powyższy język to tak naprawdę Tiny z wykładu rozszerzony o jedną
konstrukcję: pętlę repeat. Spróbuj wykonać to ćwiczenie nie
sięgając do notatek z wykładu. Jeśli napotkasz trudności, odkrywaj
kolejne elementy poniższego opisu.
Kategorie składniowe występujące w tym języku to:
- wyrażenia Exp
- wyrażenia logiczne BExp
- instrukcje Stmt
- oraz, jak zwykle, stałe liczbowe Num
Zaczynamy jak zwykle od opisu dziedzin semantycznych. Nie przejmujemy się na razie szczegółami związanymi z konstrukcjami stałopunktowymi oraz umieszczeniem pineski we właściwych dziedzinach. Zakładamy, że wszystkie zmienne są zainicjowane na zero.
Użyjemy elementarnych dziedzin z wykładu:
- Int = ..., -1, 0, 1, ... zawierający denotacje stałych
liczbowych
- Bool = , zawierający wartości logiczne
- Var zawierający wszystkie dozwolone identyfikatory
Przypomnijmy, że wartość wyrażenia arytmetycznego zależy od
Wartości te są "pamiętane" w stanie, który jest funkcją ze zbioru Var w zbiór Int. Zbiór wszystkich stanów to:
Zdefiniujmy następnie niezbędne funkcje semantyczne.
- Dla wyrażeń mamy
- Dla wyrażeń logicznych:
- Dla instrukcji:
- Oraz oczywistą funkcję dla stałych całkowitych:
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
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.
Ćwiczenie 4
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