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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Mengel (dyskusja | edycje)
Nie podano opisu zmian
 
Dorota (dyskusja | edycje)
Nie podano opisu zmian
Linia 43: Linia 43:
</math>
</math>


Deklaracja <math>\mathbf{var}\, x := e</math> wprowadza zmienną ''x'' i nadaje jej  
Deklaracja <math>\mathbf{var}\, x := e</math> wprowadza zmienną <math>x</math> i nadaje jej  
wartość obliczonego wyrażenia ''e''. Deklaracja <math>\mathbf{proc}\, P (x); i\, \mathbf{endproc}  
wartość obliczonego wyrażenia <math>e</math>. Deklaracja <math>\mathbf{proc}\, P (x); i\, \mathbf{endproc}  
</math> wprowadza procedurę o nazwie ''P'' z jednym parametrem ''x'' przekazywanym  
</math> wprowadza procedurę o nazwie <math>P</math> z jednym parametrem <math>x</math> przekazywanym  
przez zmienną. Treścią procedury jest instrukcja ''i''.
przez zmienną. Treścią procedury jest instrukcja <math>i</math>.


Instrukcja bloku <math>\mathbf{begin}\, d; i\,\mathbf{end}</math> polega na  
Instrukcja bloku <math>\mathbf{begin}\, d; i\,\mathbf{end}</math> polega na  
wykonaniu instrukcji ''i'' po uprzednim wzbogaceniu środowiska deklaracją ''d''.  
wykonaniu instrukcji <math>i</math> po uprzednim wzbogaceniu środowiska deklaracją <math>d</math>.  
Wszystkie zmienne i procedury wprowadzone przez ''d'' są lokalne w bloku.
Wszystkie zmienne i procedury wprowadzone przez <math>d</math> są lokalne w bloku.
Instrukcja <math>\mathbf{call}\, P (x) </math> to wywołanie procedury ''P''.
Instrukcja <math>\mathbf{call}\, P (x) </math> to wywołanie procedury <math>P</math>.


=== Zadanie 2 ===
=== Zadanie 2 ===

Wersja z 14:59, 29 wrz 2006

Procedury i funkcje. Przekazywanie parametrów.

Zadanie 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|𝐜𝐚𝐥𝐥P(x)|𝐛𝐞𝐠𝐢𝐧d;i𝐞𝐧𝐝

d::=𝐯𝐚𝐫x:=e|d1;d2|𝐩𝐫𝐨𝐜P(x);i𝐞𝐧𝐝𝐩𝐫𝐨𝐜

Deklaracja 𝐯𝐚𝐫x:=e wprowadza zmienną x i nadaje jej wartość obliczonego wyrażenia e. Deklaracja 𝐩𝐫𝐨𝐜P(x);i𝐞𝐧𝐝𝐩𝐫𝐨𝐜 wprowadza procedurę o nazwie P z jednym parametrem x przekazywanym przez zmienną. Treścią procedury jest instrukcja i.

Instrukcja bloku 𝐛𝐞𝐠𝐢𝐧d;i𝐞𝐧𝐝 polega na wykonaniu instrukcji i po uprzednim wzbogaceniu środowiska deklaracją d. Wszystkie zmienne i procedury wprowadzone przez d są lokalne w bloku. Instrukcja 𝐜𝐚𝐥𝐥P(x) to wywołanie procedury P.

Zadanie 2

Jaką wartość ma zmienna z przy semantyce z poprzedniego zadania po wykonaniu następującej instrukcji:

begin
  var
    y := 1;
    proc P (x); x := y endproc;
    begin
      var y := 2;
      var z := 0;
      call P(z);
    end
 end
    

Zadanie 3

Wyjaśnij różnicę między wiązaniami statycznymi a dynamicznymi. Zmień semantykę języka z zadania 1 tak, aby uzyskać dynamiczne wiązania identyfikatorów.

Zadanie 4

Czy semantyka z zadania 1 umożliwia pisanie procedur rekurencyjnych? A semantyka z zadania 3? Jak należy zmienić semantykę, aby procedury rekurencyjne były możliwe?

Zadanie 5

Przypuśćmy, że składnia wywołania procedury z zadania 1 przyjmuje teraz postać:

i::=𝐜𝐚𝐥𝐥P(e)

Pozostałe elementy nie zmieniają się. Przekazywanie parametrów odbywa się teraz jednak przez wartość. Opisz semantykę takiego języka. Zadbaj o możliwość definiowania procedur rekurencyjnych i statyczne wiązania zmiennych globalnych.