Semantyka i weryfikacja programów/Ćwiczenia 1: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 1: | Linia 1: | ||
== Zawartość == | == Zawartość == | ||
Linia 96: | Linia 95: | ||
to <math>\mathbf{Num} \times \mathbf{State}</math>. | to <math>\mathbf{Num} \times \mathbf{State}</math>. | ||
}} | }} | ||
Najprostsze są tranzycje prowadzące do konfiguracji końcowej: | Najprostsze są tranzycje prowadzące do konfiguracji końcowej: | ||
Linia 267: | Linia 251: | ||
''nieokreślone'', czyli zmienne są niezainicjowane, a odwołanie do | ''nieokreślone'', czyli zmienne są niezainicjowane, a odwołanie do | ||
niezainicjowanej zmiennej jest uważane za niepoprawne. | niezainicjowanej zmiennej jest uważane za niepoprawne. | ||
}} | |||
{{przyklad||| | |||
<math> | <math> | ||
Linia 275: | Linia 260: | ||
\quad \quad \mapsto \quad \quad \mbox{wynik} = 24 | \quad \quad \mapsto \quad \quad \mbox{wynik} = 24 | ||
</math> | </math> | ||
<math> | <math> | ||
\mathbf{let}\, y = 5 \,\mathbf{in}\, \mathbf{let}\, x = (\, \mathbf{let}\, y = 3 \,\mathbf{in}\, y+y \,) \,\mathbf{in}\, x+y | \mathbf{let}\, y = 5 \,\mathbf{in}\, \mathbf{let}\, x = (\, \mathbf{let}\, y = 3 \,\mathbf{in}\, y+y \,) \,\mathbf{in}\, x+y | ||
\quad \quad \mapsto \quad \quad \mbox{wynik} = 11 | \quad \quad \mapsto \quad \quad \mbox{wynik} = 11 | ||
</math> | </math> | ||
<math> | <math> | ||
\mathbf{let}\, z = 5 \,\mathbf{in}\, x+z | \mathbf{let}\, z = 5 \,\mathbf{in}\, x+z | ||
Linia 284: | Linia 271: | ||
zmiennej}\, x | zmiennej}\, x | ||
</math> | </math> | ||
<math> | <math> | ||
\mathbf{let}\, x = 1 \,\mathbf{in}\, \mathbf{let}\, x = x+x \,\mathbf{in}\, x+x | \mathbf{let}\, x = 1 \,\mathbf{in}\, \mathbf{let}\, x = x+x \,\mathbf{in}\, x+x | ||
Linia 399: | Linia 387: | ||
'''Wariant 1''' | '''Wariant 1''' | ||
<br> | <br> | ||
Wygodne i eleganckie rozwiązanie tego problemu jest możliwe, jeśli | Wygodne i eleganckie rozwiązanie tego problemu jest możliwe, jeśli | ||
Linia 481: | Linia 468: | ||
'''Wariant 2''' | '''Wariant 2''' | ||
<br> | <br> | ||
Zanim przejdziemy do kolejnego wariantu, zastanówmy się czy | Zanim przejdziemy do kolejnego wariantu, zastanówmy się czy |
Wersja z 08:08, 8 sie 2006
Zawartość
Tematem tych zajęć jest semantyka operacyjna wyrażeń (małe kroki).
Zadania z rozwiązaniami
Ćwiczenie 1
Rozważmy bardzo prosty język wyrażeń, którego składnia opisana jest następującą gramatyką:
Wynikiem wyrażenienia warunkowego jest wartość wyrażenia , o ile wyrażenie oblicza się do wartości różnej od zera; w przeciwnym przypadku wynikiem jest wartość wyrażenia .
Zaproponuj semantykę operacyjną (małe kroki) dla tego języka.
Rozwiązanie
Ćwiczenie 2
Rozszerzmy język wyrażeń z poprzedniego zadania o jedną konstrukcję
Wyrażenie zawiera w sobie deklarację , która stanowi mechanizm wiązania identyfikatorów w naszym języku. Deklaracja wprowadza nową zmienną oraz przypisuje jej wartość. Wartość wyrażenia obliczamy następująco: najpierw oblicza się wartość , podstawia ją na zmienna , a następnie oblicza wyrażenie . Zakresem zmiennej jest wyrażenie , czyli wewnątrz można odwoływać się (wielokrotnie) do zmiennej ; Ogólniej, odwołania do zmiennej w wyrażeniu odnoszą się do najbliższej (najbardziej zagnieżdzonej) deklaracji tej zmiennej. Taki mechanizm wiązania identyfikatorów nazywamy wiązaniem statycznym. Przyjmujemy zwykłe reguły przesłaniania zmiennych. Np., jeśli w występuje podwyrażenie to odwołania do wewnątrz odnoszą się do najbliższej deklaracji zmiennej .
Zakładamy, że na początku wartości wszystkich zmiennych są nieokreślone, czyli zmienne są niezainicjowane, a odwołanie do niezainicjowanej zmiennej jest uważane za niepoprawne.
Przykład
Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mathbf{let}\, z = 5 \,\mathbf{in}\, x+z \quad \quad \mapsto \quad \quad \mbox{brak wyniku; odwołanie do niezainicjowanej zmiennej}\, x }
Rozwiązanie
Zadania domowe
Zadanie 1
Zapisz wariant 2 semantyki z poprzedniego zadania.
Zadanie 2
Dotychczas wystąpienie błędu podczas obliczania wyrażenia, np. odwołanie do niezainicjowanej zmiennej, powodowało, że wyrażenie nie posiadało wartości (nie było ciągu tranzycji prowadzących do konfiguracji końcowej). Zmodyfikuj którąś z semantyk z poprzednich zadań tak, aby błąd był komunikowany jako jedna z konfiguracji końcowych. To znaczy: jeśli obliczenie wyrażenia w stanie jest niemożliwe bo wystąpił błąd, to
Zadanie 3
Rozważ rozszerzenie języka wyrażeń o wyrażenia boolowskie:
Zaproponuj semantykę małych kroków dla tego języka. Rozważ różne strategie obliczania wyrażeń boolowskich, oraz podejście leniwe. Na przykład w strategii lewostronnej dla , gdy zostało obliczone do , nie ma wogóle potrzeby obliczania .