Semantyka i weryfikacja programów/Ćwiczenia 7: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Mengel (dyskusja | edycje)
Mengel (dyskusja | edycje)
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ę {\bf repeat}. Spróbuj wykonać to ćwiczenie nie
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 = \{\ldots, -1, 0, 1, \ldots\} zawierający denotacje stałych
* Int <nowiki>=</nowiki> ..., -1, 0, 1, ... zawierający denotacje stałych
liczbowych
liczbowych
* Bool = \{\tt, \ff\} zawierający wartości logiczne
* 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 $e$ zależy od  
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ą ,,pamiętane'' w stanie, który jest funkcją ze zbioru
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:
\[ State = Var \ra Int \]
 
<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  
\[\E & : & Exp \ra State \ra Int  \]
 
<center><math>\E & : & Exp \ra State \ra Int  </math></center>
 
* Dla wyrażeń logicznych:  
* Dla wyrażeń logicznych:  
\[\B & : & BExp \ra State \ra Bool  \]
 
<center><math>\B & : & BExp \ra State \ra Bool  </math></center>
 
* Dla instrukcji:
* Dla instrukcji:
\[\I & : & Stmt \ra Stmt \ra Stmt  \]
 
<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:
\[\Z & : & Num \ra Z  \]
 
<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:

n::=1|0|1|

x::=(identyfikatory)

e::=n|x|e1+e2

b::=e1=e2|𝐧𝐨𝐭b|b1𝐨𝐫b2

i::=x:=e|i1;i2|𝐢𝐟b𝐭𝐡𝐞𝐧i1𝐞𝐥𝐬𝐞i2|𝐬𝐤𝐢𝐩|𝐰𝐡𝐢𝐥𝐞b𝐝𝐨i|𝐫𝐞𝐩𝐞𝐚𝐭i𝐮𝐧𝐭𝐢𝐥b

Pętla 𝐫𝐞𝐩𝐞𝐚𝐭i𝐮𝐧𝐭𝐢𝐥b 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 e 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:

Parser nie mógł rozpoznać (nieznana funkcja „\ra”): {\displaystyle State = Var \ra Int }

Zdefiniujmy następnie niezbędne funkcje semantyczne.

  • Dla wyrażeń mamy
Parser nie mógł rozpoznać (nieznana funkcja „\E”): {\displaystyle \E & : & Exp \ra State \ra Int }
  • Dla wyrażeń logicznych:
Parser nie mógł rozpoznać (nieznana funkcja „\B”): {\displaystyle \B & : & BExp \ra State \ra Bool }
  • Dla instrukcji:
Parser nie mógł rozpoznać (nieznana funkcja „\I”): {\displaystyle \I & : & Stmt \ra Stmt \ra Stmt }
  • Oraz oczywistą funkcję dla stałych całkowitych:
Parser nie mógł rozpoznać (błąd składni): {\displaystyle \Z & : & Num \ra Z }

Pętla for

Ćwiczenie 2

Rozszerzmy język z poprzedniego zadania o instrukcję:

i::=𝐟𝐨𝐫x:=e1𝐭𝐨e2𝐝𝐨i

Wykonanie takiej pętli polega na:

  1. Wyliczeniu wartości n wyrażenia e1.
  2. Przypisaniu wartości n na zmienną x.
  3. Wyliczeniu wartości m wyrażenia e2.
  4. Jeśli x>m, to pętla kończy się.
  5. W przeciwnym razie:
    • Wykonujemy instrukcję i.
    • Zwiększamy zmienną x o 1.
    • Powracamy do punktu 3.

Zauważmy, że wyrażenie e1 jest tu wyliczane tylko raz, ale e2 oblicza się przy każdym obrocie pętli.

Rozwiązanie

{{{3}}}

Ć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:

  1. Wyliczeniu wartości n wyrażenia e1.
  2. Przypisaniu wartości n na zmienną x.
  3. Wyliczeniu wartości m wyrażenia e2.
  4. Jeśli x>m, to pętla kończy się.
  5. W przeciwnym razie:
    • Wykonujemy instrukcję i.
    • Zwiększamy zmienną x o 1.
    • Powracamy do punktu 4.

Rozwiązanie

{{{3}}}

O pętli for można jednak myśleć jeszcze inaczej. Można wymagać, aby wszelkie zmiany wartości zmiennej sterującej x 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

{{{3}}}

Ćwiczenie 5

W języku C pętla for ma następującą postać: i::=𝐟𝐨𝐫(i1;b;i2)i3

Jej wykonanie polega na:

  1. Wykonaniu instrukcji i1.
  2. Wyliczeniu wartości wyrażenia b.
  3. Jeśli wyrażenie wylicza się do fałszu, to pętla kończy się.
  4. W przeciwnym razie:
    • Wykonujemy instrukcję i3.
    • Wykonujemy instrukcję i2.
    • Powracamy do punktu 2.

Rozwiązanie

{{{3}}}