Semantyka i weryfikacja programów/Ćwiczenia 4
Zawarto¶æ
Napiszemy semantykê naturaln± jêzyka wyra¿eñ, rozwa¿ymy strategiê gorliw± (jak na wcze¶niejszych zajêciach, w semantyce ma³ych kroków) i leniw±. Rozwa¿ymy i statyczne i dynamiczne wi±zanie identyfikatorów. Nastêpnie rozszerzymy ten jêzyk o lambda-abstrakcjê i aplikacjê, otrzymuj±c prosty jêzyk funkcyjny.
Ró¿ne semantyki naturalne wyra¿eñ
Ćwiczenie 1 (semantyka gorliwa)
Napisz semantykê du¿ych kroków
dla jêzyka wyra¿eñ, którego semantykê ma³o-krokow±
napisali¶my na jednych z poprzednich æwiczeñ:
Rozwiązanie
Ćwiczenie 2 (semantyka leniwa)
Zmodyfikuj semantykê z poprzedniego zadania, aby uzyskaæ
leniw± ewaluacjê wyra¿eñ, zgodnie z dyrektyw±: nie obliczaj
wyra¿enia o ile jego wynik nie jest potrzebny
(albo: obliczaj warto¶æ wyra¿enia dopiero wtedy, gdy jego wynik jest
naprawdê potrzebny). Spójrzmy na przyk³ad:
Wed³ug semantyki z poprzedniego zadania wyra¿nie to nie ma warto¶ci, bo w deklaracji jest odwo³anie do niezainicjowanej zmiennej. Natomiast w semantyce leniwej wyra¿enie to obliczy siê do warto¶ci , gdy¿ wyra¿enie nie bêdzie wogóle obliczane. Bêdzie tak dlatego, ¿e w wyra¿eniu nie ma odwo³añ do zmiennej .
Rozwiązanie
Ćwiczenie 3 (semantyka dynamiczna)
Rozwa¿my teraz zupe³nie inny mechanizm wi±zania identyfikatorów,
zwany wi±zaniem dynamicznym.
Dla odró¿nienia, dotychczasowy sposób wi±zania (widoczno¶ci)
identyfikatorów bêdziemy nazywaæ wi±zaniem statycznym.
Oto przyk³adowe wyra¿enie:
które nie ma warto¶ci w pustym stanie pocz±tkowym, wed³ug semantyk z poprzednich zadañ, poniewa¿ odwo³anie do zmiennej w deklaracji jest niepoprawne. Tak samo jest nawet w semantyce leniwej, gdy¿ warto¶æ zmiennej bêdzie w koñcu policzona, i bêdzie wymaga³a odwo³ania do w stanie pustym.
Natomiast wyobra¿my sobie, ¿e zmieniamy semantykê leniw± nastêpuj±co: odwo³anie do zmiennej podczas obliczania warto¶ci bêdzie odnosi³o siê nie do stanu w momencie deklaracji , ale do stanu w momencie odwo³ania do . Jest to do¶æ rewolucyjna zmiana, zapewne sprzeczna z intuicjami programisty (statyczne regu³y widoczno¶ci zamieniamy na dynamiczne). W szczególno¶ci powy¿sze wyra¿enie policzy siê w semantyce dynamicznej do warto¶ci 11, poniewa¿ stan w momencie odwo³ania do zmiennej przypisuje zmiennej warto¶æ 10 !
Napisz semantykê naturaln± dla wi±zania dynamicznego.
Rozwiązanie
Prosty jêzyk funkcyjny
Ćwiczenie 4 (przekazywanie parametru przez warto¶æ)
Rozwa¿my prosty jêzyk funkcyjny rozszerzaj±cy
jêzyk wyra¿eñ z poprzednich zadañ nastêpuj±co:
Lambda-abstrakcja reprezentuje anonimow± (nienazwan±) funkcjê jednoargumentow±, natomiast wyra¿enie to aplikacja do (wyra¿enie powinno zatem obliczaæ siê do funkcji). Np.
Przyjmijmy statyczn± widoczno¶æ identyfikatorów. Mo¿liwe s± ró¿ne mechanizmy przekazywania parametrów. Na razie wybierzmy mechanizm przekazywania przez warto¶æ, zapewne doskonale znany Czytelnikowi: wyra¿enie bêd±ce parametrem aktualnym jest obliczane przed wywo³aniem funkcji, czyli w stanie, w którym jeste¶my z momencie wywo³ania funkcji.
Zaproponuj semantykê naturaln± dla tego jêzyka dla obydwu mechanizmów przekazywania parametrów.
Rozwiązanie
Ćwiczenie 5 (przekazywanie parametru przez nazwê)
Zaproponuj leniw± semantykê jêzyka z mechnizmem
przekazywanie parametru przez nazwê.
Mechanizm ten stanowi leniwy odpowiednik przekazywania przez warto¶æ:
nie obliczamy wyra¿enia bêd±cego parametrem aktualnym, a zamiast
jego warto¶ci przekazujemy do funkcji to wyra¿enie wraz ze
stanem z miejsca wywo³ania funkcji.
To ten stan bedzie brany pod uwagê, gdy obliczana bêdzie
warto¶æ parametru, tzn. przy odwo³aniu w ciele funkcji do
parametru formalnego. Oto przyk³ad programu:
który w stanie pustym (wszystkie zmienne nieokre¶lone) nie ma warto¶ci przy przekazywaniu parametru przez warto¶æ (bo odwo³anie do zmiennej jest niepoprawne) a oblicza siê do warto¶ci je¶li wybierzemy mechanizm przekazywania przez nazwê.
Rozwiązanie
Zadania domowe
Ćwiczenie 1
Podaj przyk³ad wyra¿enia takiego, które:
- ma warto¶æ w semantyce statycznej i dynamicznej, ale w ka¿dej inn±
- ma warto¶æ w semantyce leniwej a nie ma w dynamicznej
- ma warto¶æ w semantyce dynamicznej a nie ma w leniwej.
Ćwiczenie 2
W semantyce leniwej wyra¿eñ, je¶li jest wiele odwo³añ do jakiej¶ zmiennej, to obliczenie warto¶ci tej zmiennej nast±pi za ka¿dym razem od nowa. Zmodyfikuj tê semantykê tak, aby warto¶æ ta by³a obliczana co najwy¿ej raz. Zatem po pierwszym odwo³aniu do zmiennej, jej obliczona warto¶æ powinna zostaæ umieszczona w stanie, zastêpuj±c parê (wyra¿enie, stan).
Ćwiczenie 3
Zaproponuj dynamiczne odpowiedniki obydwu statycznych semantyk dla jêzyka funkcyjnego . Czyli zak³adamy, ¿e widoczno¶æ identyfikatorów, m.in. w ciele funkcji, jest dynamiczna. Oto przyk³ad programu, który w semantyce statycznej oblicza siê do warto¶ci , a w dynamicznej do warto¶ci (parametr przekazywany przez warto¶æ):
Rozwa¿ dwa mechanizmy przekazywania parametrów:
- przez warto¶æ
- przez nazwê
Ten drugi mechanizm rozumiemy teraz nastêpuj±co. Parametr aktualny nie jest obliczany w momencie zaaplikowania do niego funkcji, a do cia³a funkcji przekazuje siê wyra¿enie bêd±ce parametrem aktualnym. W momencie odwo³ania do parametru formalnego w ciele funkcji, wyra¿enie bêd±ce parametrem aktualnym jest obliczane w bie¿±cym stanie (a nie w stanie z miejsca wywo³ania funkcji). Jako przyk³ad pozwa¿my program:
Przy przekazywaniu przez warto¶æ, w stanie pustym program siê nie obliczy, poniewa¿ nie da siê obliczyæ parametru aktualnego . Natomiast przy przekazywaniu przez nazwê, parametr aktualny bêdzie obliczany dopiero w momencie odwo³ania do parametru formalnego , czyli w momencie obliczania warto¶ci wyra¿enia . W stanie tym zmienna ma ju¿ warto¶æ, a zatem warto¶ci± ca³ego programu bêdzie 21.