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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Mengel (dyskusja | edycje)
Nie podano opisu zmian
Mengel (dyskusja | edycje)
Nie podano opisu zmian
Linia 46: Linia 46:
   
   
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
Jeszcze nie ma.
'''Funkcje semantyczne:'''
 
<math>\begin{array} {lcl}
\mathcal{E} & : & Exp \to Env \to S \to EV + \{err\}\\
\mathcal{D} & : & Dec \to Env \to S \to Env\times S + \{(err,err)\}\\
\mathcal{I} & : & Ins \to Env \to S \to S_{\bot} + \{err\}_{\bot}\\
\end{array} </math>
 
'''R"ownania:'''<br>
 
<math>\mathcal{E}[\![ n ]\!] = \lambda \varrho\in Env \cdot \lambda s\in S \cdot n</math><br>
 
<math>\mathcal{E}[\![ x ]\!] = \lambda \varrho\in Env\cdot\lambda s\in S\cdot\\
\hspace*{1.5cm}\ \mathrm{if}\  x\not\in
dom(\varrho)\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\ \varrho x\not\in Loc\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\  s(\varrho x)
\not\in\mathbb{N}\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\  s(\varrho x)</math><br>
 
<math>\mathcal{E}[\![ e_1\ {\tt +}\ e_2 ]\!] = \lambda\varrho\in Env\cdot\lambda s\in S\cdot\\
\hspace*{1.5cm}\ \mathrm{if}\ \mathcal{E}[\![ e_1 ]\!]\varrho s\not\in\mathbb{N}\ \mathrm{or}\
\mathcal{E}[\![ e_2 ]\!]\varrho s\not\in\mathbb{N}\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\  \mathcal{E}[\![ e_1 ]\!]\varrho s +\mathcal{E}[\![ e_2 ]\!]\varrho s</math><br>
 
<math>\mathcal{D}[\![ {\tt var}\ x\ {\tt = 0} ]\!] = \lambda\varrho\in Env\cdot\lambda s\in S\cdot\\
\hspace*{1.5cm}\ \mathrm{if}\  s^{-1}(\{free\})=\emptyset\ \mathrm{then}\ (err,err)\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{let}\ l = \mathrm{min}(s^{-1}(\{free\}))\\
\hspace*{1.5cm}\mathrm{in}\ (\varrho[l/x],s[0/l])</math><br>
 
<math>\mathcal{D}[\![ {\tt proc}\ x{\tt (}y{\tt )}\ {\tt \{}\ i\ {\tt \}} ]\!] =
\lambda\varrho\in Env\cdot\lambda s_0\in S\cdot\\
\hspace*{1.5cm}\ \mathrm{if}\  x=y\ \mathrm{then}\ (err,err)\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{let}\ F = \lambda f\in Proc\cdot\\
\hspace*{1.5cm}\hspace*{0.5cm}\lambda l\in Loc\cdot\lambda s\in S\cdot\\
\hspace*{1.5cm}\hspace*{1.5cm}\ \mathrm{if}\  s l\not\in\mathbb{N}\ \mathrm{then}\ err\\
\hspace*{1.5cm}\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\  s^{-1}(\{free\})=\emptyset\ \mathrm{then}\ err\\
\hspace*{1.5cm}\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{let}\ l'=\mathrm{min}(s^{-1}(\{free\}))\\
\hspace*{1.5cm}\hspace*{1.5cm}\mathrm{in}\ \mathcal{I}[\![ i ]\!]\varrho[f/x][l'/y]s[s l / l']\\
\hspace*{1.5cm}\mathrm{in}\ (\varrho[FIX(F)/x],s_0)</math><br>
 
<math>\mathcal{D}[\![ d_1\ {\tt ;}\ d_2 ]\!] = \lambda\varrho\in Env\cdot\lambda s\in S\cdot\\
\hspace*{1.5cm}\mathrm{let}\ (\varrho',s') = \mathcal{D}[\![ d_1 ]\!]\\
\hspace*{1.5cm}\mathrm{in}\ \ \mathrm{if}\ \varrho'=err\ \mathrm{then}\ (err,err)\\
\hspace*{1.5cm}\ \mathrm{else}\  \mathcal{D}[\![ d_2 ]\!]\varrho' s'</math><br>
 
<math>\mathcal{I}[\![ x\ {\tt :=}\ e ]\!] = \lambda\varrho\in Env\cdot\lambda s\in S\cdot\\
\hspace*{1.5cm}\ \mathrm{if}\  x\not\in dom(\varrho)\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\  \varrho x\not\in Loc\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\  s(\varrho x)\not\in\mathbb{N}\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\  \mathcal{E}[\![ e ]\!]\varrho s\not\in\mathbb{N}\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\  s[\mathcal{E}[\![ e ]\!]\varrho s/ \varrho x]</math><br>
 
<math>\mathcal{I}[\![ i_1\ {\tt ;}\ i_2 ]\!] = \lambda\varrho\in Env\cdot\lambda s\in S\cdot\\
\hspace*{1.5cm}\ \mathrm{if}\  \mathcal{I}[\![ i_1 ]\!]\varrho s = err\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\  \mathcal{I}[\![ i_2 ]\!]\varrho(\mathcal{I}[\![ i_1 ]\!]\varrho s)</math><br>
 
<math>\mathcal{I}[\![ {\tt skip} ]\!] = \lambda\varrho\in Env\cdot\lambda s\in S\cdot s</math><br>
 
<math>\mathcal{I}[\![ {\tt begin}\ d\ {\tt in}\ i\ {\tt end} ]\!] = \lambda\varrho\in
Env\cdot\lambda s\in S\cdot\\
\hspace*{1.5cm}\mathrm{let}\ (\varrho',s') = \mathcal{D}[\![ d ]\!]\\
\hspace*{1.5cm}\mathrm{in}\ \mathrm{if}\  \varrho'=err\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\  \mathcal{I}[\![ i ]\!]\varrho' s'</math><br>
 
<math>\mathcal{I}[\![ {\tt if}\ e\ {\tt = 0\ then\ }i{\tt\ fi} ]\!] = \lambda\varrho\in
Env\cdot\lambda s\in S\cdot\\
\hspace*{1.5cm}\ \mathrm{if}\  \mathcal{E}[\![ e ]\!]\varrho s\not\in\mathbb{N}\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\  \mathcal{E}[\![ e ]\!]\varrho s = 0\ \mathrm{then}\ \mathcal{I}[\![ i ]\!]\varrho s\\
\hspace*{1.5cm}\ \mathrm{else}\  s</math><br>
 
<math>\mathcal{I}[\![ {\tt while}\ e\ {\tt \ne 0\ do}\ i\ {\tt done} ]\!] =
\lambda\varrho\in Env\cdot\lambda s_0\in S\cdot\\
\hspace*{1.5cm}\mathrm{let}\ F = \lambda f\in S\to S_{\bot}+\{err\}_{\bot}\cdot\\
\hspace*{1.5cm}\hspace*{0.5cm} \lambda s\in S\cdot\\
\hspace*{1.5cm}\hspace*{1.5cm}\mathrm{let}\ n=\mathcal{E}[\![ e ]\!]\varrho s\\
\hspace*{1.5cm}\hspace*{1.5cm}\mathrm{in}\ \mathrm{if}\  n\not\in\mathbb{N}\ \mathrm{then}\ err\\
\hspace*{1.5cm}\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\  n = 0\ \mathrm{then}\  s\\
\hspace*{1.5cm}\hspace*{1.5cm}\ \mathrm{else}\  f s\\
\hspace*{1.5cm}\mathrm{in} FIX(F) s_0</math><br>
 
<math>\mathcal{I}[\![ {\tt call}\ x_1{\tt (}x_2{\tt )} ]\!] = \lambda \varrho\in
Env\cdot\lambda s\in S\cdot\\
\hspace*{1.5cm}\ \mathrm{if}\  x_1\not\in dom(\varrho)\ \mathrm{then}\  err\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\  \varrho x_1\not\in Proc\ \mathrm{then}\  err\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\  x_2\not\in dom(\varrho)\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\  \varrho x_2\not\in Loc\ \mathrm{then}\  err\\
\hspace*{1.5cm}\ \mathrm{else}\ \mathrm{if}\  s(\varrho x_2)\not\in\mathbb{N}\ \mathrm{then}\ err\\
\hspace*{1.5cm}\ \mathrm{else}\  \varrho x_1 (\varrho x_2)</math><br>
 
 
</div>
</div>
</div>
</div>

Wersja z 19:40, 6 sie 2006

Semantyka bezpośrednia instrukcji. Konstrukcje iteracyjne.

Pętle while i repeat

Ćwiczenie 1

Zdefiniuj semantykę denotacyjną następującego języka:

n::=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.

Rozwiązanie

{{{3}}}

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}}}