Semantyka i weryfikacja programów/Ćwiczenia 2: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 1: | Linia 1: | ||
== Zawarto¶æ == | |||
Æwiczymy dalej semantykê ma³ych kroków. | |||
Uzupe³nimy semantykê jêzyka Tiny o semantykê operacyjn± | |||
wyra¿eñ boolowskich i arytmetycznych. | |||
Nastêpnie rozszerzymy nasz jêzyk o róznorodne konstrukcje iteracji. | |||
Na koniec zdefiniujemy operacje arytmetyczne liczb binarnych. | Na koniec zdefiniujemy operacje arytmetyczne liczb binarnych. | ||
== Rozszerzenia semantyki | == Rozszerzenia semantyki jêzyka Tiny == | ||
{{cwiczenie|1|cw1| | {{cwiczenie|1|cw1| | ||
Semantyka | Semantyka jêzyka Tiny z wyk³adu u¿ywa³a funkcji semantycznych | ||
<math> | <math> | ||
B, E : State \to State | B, E : State \to State | ||
</math> | </math> | ||
dla | dla okre¶lenia znaczenia wyra¿eñ boolowskich i arytmetycznych. | ||
Zdefiniuj znaczenie | Zdefiniuj znaczenie wyra¿eñ za pomoc± semantyki operacyjnej, | ||
w stylu | w stylu ma³ych kroków. | ||
}} | }} | ||
Linia 28: | Linia 29: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
Przypomnijmy | Przypomnijmy sk³adniê wyra¿eñ boolowskich i arytmetycznych: | ||
<math> | <math> | ||
Linia 59: | Linia 60: | ||
</math> | </math> | ||
Niech <math>\mathbf{BExp}</math> oznacza zbiór | Niech <math>\mathbf{BExp}</math> oznacza zbiór wyra¿eñ boolowskich, | ||
<math>b \in \mathbf{BExp}</math>. | <math>b \in \mathbf{BExp}</math>. | ||
Chcemy, aby tranzycje dla | Chcemy, aby tranzycje dla wyra¿eñ by³y postaci: | ||
<math> | <math> | ||
Linia 67: | Linia 68: | ||
</math> | </math> | ||
i podobnie dla | i podobnie dla wyra¿eñ boolowskich: | ||
<math> | <math> | ||
Linia 74: | Linia 75: | ||
gdzie <math>s \in \mathbf{State}</math>. | gdzie <math>s \in \mathbf{State}</math>. | ||
Dodatkowo | Dodatkowo bêdziemy potrzebowaæ równie¿ tranzycji postaci: | ||
<math> | <math> | ||
Linia 83: | Linia 84: | ||
b, s \,\Longrightarrow\, l | b, s \,\Longrightarrow\, l | ||
</math> | </math> | ||
gdzie <math>n \in</math> jest | gdzie <math>n \in</math> jest liczb± ca³kowit±, | ||
<math>n \in \mathbf{Num}</math>, a <math>l \in \mathbf{Bool} = \{ \mathbf{true}, \mathbf{false} \}</math>. | <math>n \in \mathbf{Num}</math>, a <math>l \in \mathbf{Bool} = \{ \mathbf{true}, \mathbf{false} \}</math>. | ||
Formalnie, zbiór konfiguracji dla semantyki | Formalnie, zbiór konfiguracji dla semantyki ca³ego jêzyka Tiny to | ||
<math> | <math> | ||
Linia 92: | Linia 93: | ||
</math> | </math> | ||
a konfiguracje | a konfiguracje koñcowe to <math>\mathbf{State}</math>; aczkolwiek | ||
konfiguracje ze zbioru <math>\mathbf{Num} \, \cup \, \mathbf{Bool}</math> | konfiguracje ze zbioru <math>\mathbf{Num} \, \cup \, \mathbf{Bool}</math> pe³ni± podobn± rolê | ||
dla | dla wyra¿eñ arytmetycznych i boolowskich jako konfiguracje koñcowe dla | ||
instrukcji. | instrukcji. | ||
Przypomnijmy, | Przypomnijmy, ¿e <math>\mathbf{Stmt}</math> oznacza zbiór instrukcji, <math>I \in \mathbf{Stmt}</math>. | ||
Zacznijmy od (chyba najprostszych) tranzycji dla | Zacznijmy od (chyba najprostszych) tranzycji dla sta³ych boolowskich i liczbowych: | ||
<math> | <math> | ||
Linia 106: | Linia 107: | ||
</math> | </math> | ||
Podobnie jak poprzednio, | Podobnie jak poprzednio, zak³adamy tutaj dla wygody, ¿e | ||
<math>\mathbf{Num} \subseteq \mathbf{Exp}</math> oraz <math>\mathbf{Bool} \subseteq \mathbf{BExp}</math>. | <math>\mathbf{Num} \subseteq \mathbf{Exp}</math> oraz <math>\mathbf{Bool} \subseteq \mathbf{BExp}</math>. | ||
Pozwala nam to nie | Pozwala nam to nie odró¿niaæ sta³ych wystêpuj±cych w wyra¿eniach | ||
a zatem | a zatem pojawiaj±cych siê po lewej stonie tranzycji | ||
od | od warto¶ci im odpowiadaj±cych pojawiaj±cych siê po prawej stronie. | ||
Przejd¼my do spójników logicznych, powiedzmy <math>b_1 \land b_2</math>. | |||
Poniewa¿ opisujemy teraz pojedyncze (ma³e) kroki sk³adaj±ce siê na | |||
wykonanie programu, musimy | wykonanie programu, musimy podaæ w jakiej kolejno¶ci bêd± siê | ||
obliczaæ <math>b_1</math> i <math>b_2</math>. Zacznijmy od strategii lewostronnej: | |||
<math> | <math> | ||
Linia 128: | Linia 129: | ||
</math> | </math> | ||
Mo¿emy zaniechaæ obliczania | |||
<math>b_2</math> | <math>b_2</math> je¶li <math>b_1</math> oblicza siê do false. | ||
Oto odpowiednio zmodyfikowane | Oto odpowiednio zmodyfikowane regu³y: | ||
<math> | <math> | ||
Linia 141: | Linia 142: | ||
</math> | </math> | ||
Analogicznie | Analogicznie regu³y prawostronne to: | ||
<math> | <math> | ||
Linia 152: | Linia 153: | ||
</math> | </math> | ||
Regu³y ''równoleg³e'' otrzymujemy jako sumê regu³ lewo- i | |||
prawostronnych (w sumie 6 | prawostronnych (w sumie 6 regu³). Zauwa¿my, ¿e obliczanie | ||
wyra¿eñ <math>b_1</math> i <math>b_2</math> odbywa siê teraz | |||
w twz. \''przeplocie": Pojedynczy krok polega na wykonaniu | w twz. \''przeplocie": Pojedynczy krok polega na wykonaniu | ||
jednego kroku obliczenia <math>b_1</math> albo jednego kroku | jednego kroku obliczenia <math>b_1</math> albo jednego kroku | ||
obliczenia <math>b_2</math>. | obliczenia <math>b_2</math>. | ||
Zwróæmy te¿ uwagê, ¿e nasze tranzycje nie posiadaj± teraz | |||
w³asno¶ci ''determinizmu'': wyra¿enie <math>b_1 \land b_2</math> | |||
mo¿e wyewoluowaæ w pojedyñczym kroku albo do | |||
<math>b'_1 \land b_2</math> albo do <math>b_1 \land b'_2</math>. | <math>b'_1 \land b_2</math> albo do <math>b_1 \land b'_2</math>. | ||
Na | Na szczê¶cie, koñcowy wynik, do jakiego oblicza siê wyra¿enie | ||
jest zawsze taki sam, | jest zawsze taki sam, niezale¿nie od przeplotu. | ||
Oto | Oto regu³y dla negacji: | ||
<math> | <math> | ||
Linia 176: | Linia 177: | ||
</math> | </math> | ||
Regu³y dla <math>e_1 \leq e_2</math> s± nastêpuj±ce: | |||
<math> | <math> | ||
Linia 192: | Linia 193: | ||
</math> | </math> | ||
Regu³y powy¿sze zale¿± od semantyki wyra¿en arytmetycznych. | |||
Zauwa¿my, ¿e ponownie pozostawili¶my dowolno¶æ je¶li chodzi o | |||
kolejno¶æ obliczania wyra¿eñ arytmetycznych <math>e_1</math> i <math>e_2</math>. | |||
Jako | Jako pierwsz± z instrukcji rozwa¿my przypisanie. | ||
Najpierw obliczamy | Najpierw obliczamy wyra¿enie po prawej stronie przypisania, | ||
a gdy | a gdy wyra¿enie to wyewoluuje do sta³ej (obliczy siê), modyfikujemy | ||
stan: | stan: | ||
Linia 208: | Linia 209: | ||
</math> | </math> | ||
Rozwa¿my teraz instrukcjê warunkow± i instrukcjê pêtli. | |||
Najpierw obliczamy | Najpierw obliczamy warto¶æ dozoru: | ||
<math> | <math> | ||
Linia 220: | Linia 221: | ||
</math> | </math> | ||
a gdy dozór jest | a gdy dozór jest ju¿ obliczony, podejmujemy decyzjê. | ||
W przypadku instrukcji warunkowej | W przypadku instrukcji warunkowej regu³y s± oczywiste: | ||
<math> | <math> | ||
Linia 229: | Linia 230: | ||
</math> | </math> | ||
Gorzej jest w przypadku instrukcji | Gorzej jest w przypadku instrukcji pêtli. Regu³a mog³aby wygl±daæ tak: | ||
<math> | <math> | ||
Linia 236: | Linia 237: | ||
</math> | </math> | ||
ale nie wiemy | ale nie wiemy ju¿, jaki by³ dozór pêtli (widzimy tylko wynik | ||
obliczenia tego dozoru w stanie s, czyli <math>\mathbf{true}</math>). | obliczenia tego dozoru w stanie s, czyli <math>\mathbf{true}</math>). | ||
Mo¿emy odwo³aæ siê do tranzytywnego domkniêcia relacji | |||
<math>\,\Longrightarrow\,</math> (czyli w zadadzie do semantyki | <math>\,\Longrightarrow\,</math> (czyli w zadadzie do semantyki du¿ych kroków): | ||
<math> | <math> | ||
Linia 250: | Linia 251: | ||
</math> | </math> | ||
Takie | Takie rozwi±zanie nie jest zatem ''czyst±'' semantyk± | ||
ma³ych kroków. | |||
Istniej± inne mo¿liwe rozwi±zania w stylu ma³ych kroków. | |||
Jedno z nich oparte jest na | Jedno z nich oparte jest na pomy¶le, aby ''rozwin±c'' pêtlê | ||
<math>\mathbf{while}\,</math>, zanim obliczymy | <math>\mathbf{while}\,</math>, zanim obliczymy warto¶æ dozoru <math>b</math>. | ||
Jedyn± regu³a dla pêtli <math>\mathbf{while}\,</math> by³aby wtedy regu³a: | |||
<math> | <math> | ||
Linia 261: | Linia 262: | ||
</math> | </math> | ||
Dziêki temu obliczany warunek logiczny <math>b</math> jest zawsze | |||
''jednorazowy''. | ''jednorazowy''. | ||
Znalezienie innych | Znalezienie innych rozwi±zañ, np. opartych na rozszerzeniu sk³adni, | ||
pozostawiamy dociekliwemu Czytelnikowi. | pozostawiamy dociekliwemu Czytelnikowi. | ||
Regu³y dla operacji arytmetycznych równie¿ pozostawiamy do napisania Czytelnikowi. | |||
</div></div> | </div></div> | ||
Linia 274: | Linia 275: | ||
{{cwiczenie|2|cw2| | {{cwiczenie|2|cw2| | ||
Rozszerzmy | Rozszerzmy jêzyk Tiny o nastêpuj±ce dobrze znane konstrukcje iteracji: | ||
<math> | <math> | ||
Linia 284: | Linia 285: | ||
</math> | </math> | ||
Napisz | Napisz semantykê ma³ych kroków dla powy¿szych konstrukcji. | ||
}} | }} | ||
Linia 295: | Linia 296: | ||
<br> | <br> | ||
Zacznijmy od pêtli <math>\mathbf{repeat}\, I \,\mathbf{until}\, b</math>. | |||
Zacznijmy od | Przyjrzyjmy siê dwóm podej¶ciom, które zastosowali¶my dla | ||
Przyjrzyjmy | pêtli <math>\mathbf{while}\,</math> w poprzednim zadaniu. | ||
Po pierwsze rozwiniêcie: | |||
Po pierwsze | |||
<math> | <math> | ||
Linia 305: | Linia 305: | ||
</math> | </math> | ||
Po drugie, spróbujmy | Po drugie, spróbujmy odwo³aæ siê do <math>\,\Longrightarrow\,^{*}</math> dla dozoru pêtli <math>b</math>: | ||
<math> | <math> | ||
Linia 320: | Linia 320: | ||
</math> | </math> | ||
Okazuje | Okazuje siê, ¿e jest jeszcze gorzej ni¿ w przypadku pêtli <math>\mathbf{while}\,</math>: | ||
nie | nie pamiêtamy ju¿, jaka by³a instrukcja wewnêtrzna naszej pêtli! | ||
Czyli takie | Czyli takie podej¶cie jest teraz nieskuteczne. | ||
Linia 329: | Linia 329: | ||
<br> | <br> | ||
Pêtla <math>\,\mathbf{do}\, e \,\mathbf{times}\, I</math>, w stanie <math>s</math>, oznacza wykonianie instrukcji <math>I</math> | |||
<math>n</math> razy, gdzie <math>n</math> to warto¶æ, do której oblicza siê | |||
<math>n</math> razy, gdzie <math>n</math> to | |||
<math>e</math> w stanie <math>s</math>. | <math>e</math> w stanie <math>s</math>. | ||
Czyli najpierw obliczmy <math>e</math> przy pomocy | Czyli najpierw obliczmy <math>e</math> przy pomocy regu³y: | ||
<math> | <math> | ||
Linia 346: | Linia 345: | ||
</math> | </math> | ||
Teraz jest juz | Teraz jest juz ³atwo: | ||
<math> | <math> | ||
Linia 363: | Linia 362: | ||
<br> | <br> | ||
W przypadku pêtli <math>\mathbf{for}\,</math> przyjmijmy, ¿e warto¶ci wyra¿eñ | |||
W przypadku | <math>e_1</math> i <math>e_2</math> obliczane s± przed pierwsz± iteracj± | ||
<math>e_1</math> i <math>e_2</math> obliczane | pêtli. | ||
Dodatkowo ustalmy, ¿e <math>e_1</math> bêdzie obliczone jako pierwsze. | |||
Dodatkowo ustalmy, | |||
Czyli: | Czyli: | ||
Linia 380: | Linia 378: | ||
</math> | </math> | ||
Zatem zakres zmiennej <math>x</math> mamy | Zatem zakres zmiennej <math>x</math> mamy ju¿ obliczony, tzn. jeste¶my | ||
w konfiguracji | w konfiguracji | ||
Linia 387: | Linia 385: | ||
</math> | </math> | ||
Dalsze | Dalsze regu³y mog± byæ podobne do regu³ dla pêtli <math>\,\mathbf{do}\, n \,\mathbf{times}\, I</math>: | ||
<math> | <math> | ||
Linia 400: | Linia 398: | ||
Zauwa¿my, warto¶æ zmiennej <math>x</math> po zakoñczeniu pêtli | |||
wynosi albo <math>n_2</math> albo pozostaje niezmieniona. | wynosi albo <math>n_2</math> albo pozostaje niezmieniona. | ||
Poniewa¿ nie zosta³o wyspecyfikowane jaka | |||
powinna | powinna byæ warto¶æ tej zmiennej, mo¿emy tak± semantykê uznaæ | ||
za | za poprawn±. | ||
'''Pytanie:''' | '''Pytanie:''' | ||
A | A gdyby¶my jednak za¿±dali przywrócenia na koniec warto¶ci zmiennej <math>x</math> | ||
sprzed | sprzed pêtli? | ||
Jak | Jak nale¿a³oby zmieniæ nasze regu³y? | ||
Semantykê dla <math>\,\mathbf{do}\, I \, \mathbf{while}\, b</math> pozostawiamy Czytelnikowi jako | |||
proste | proste æwiczenie. | ||
Oczywi¶cie minimalistyczne rozwi±zanie to | |||
<math> | <math> | ||
Linia 429: | Linia 427: | ||
{{cwiczenie|3|cw3| | {{cwiczenie|3|cw3| | ||
Rozwa¿my nastêpuj±cy jêzyk wyra¿eñ (liczby binarne z dodawaniem): | |||
<math> | <math> | ||
Linia 439: | Linia 437: | ||
</math> | </math> | ||
<math>\epsilon</math> oznacza | <math>\epsilon</math> oznacza s³owo puste, czyli np. <math>\epsilon 1 0 1 1</math> | ||
oznacza | oznacza binarn± liczbê 1011. | ||
Napisz | Napisz semantykê operacyjn± obliczaj±c± warto¶æ wyra¿eñ. | ||
}} | }} | ||
Linia 449: | Linia 447: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
Sk³adnia wyra¿eñ pozwala na wygodny dostêp do najmniej znacz±cego | |||
bitu liczby. Spróbujmy zatem | bitu liczby. Spróbujmy zatem zastosowaæ metodê dodawania | ||
pisemnego: | pisemnego: | ||
Linia 465: | Linia 463: | ||
</math> | </math> | ||
Ale co | Ale co zrobiæ z przeniesieniem? | ||
<math> | <math> | ||
Linia 471: | Linia 469: | ||
</math> | </math> | ||
Podstawowy | Podstawowy pomys³ polega na potraktowaniu przeniesienia jak dodatkowego sk³adnika: | ||
<math> | <math> | ||
Linia 477: | Linia 475: | ||
</math> | </math> | ||
Zauwa¿my, ¿e w sk³adni dopuszcza siê dowolne przeplatanie operatora dodawania | |||
i bitów <math>0, 1</math>. | i bitów <math>0, 1</math>. Tê dowolno¶æ wykorzystali¶my w³a¶nie w regu³ach | ||
powy¿ej. Gdyby nasz jêzyk ograniczyæ tylko do sk³adni | |||
<math> | <math> | ||
Linia 494: | Linia 492: | ||
</math> | </math> | ||
(nazwijmy | (nazwijmy j± ''sk³adni± ograniczon±'') to powy¿sze regu³y by³yby niepoprawne. | ||
Zanim dopiszemy | Zanim dopiszemy pozosta³e regu³y, okre¶lmy zbiór konfiguracji jako | ||
zbiór | zbiór wyra¿eñ. Konfiguracje koñcowe to wyra¿enia bez operatora dodawania | ||
(liczby binarne). Nasz | (liczby binarne). Nasz pomys³ jest taki, ¿e tranzycje stopniowo przesuwaj± | ||
operator dodawania w lewo, | operator dodawania w lewo, a¿ siê go ostatecznie ''pozbêd±''. | ||
Gdy obydwa | Gdy obydwa sk³adniki maj± tyle samo cyfr, do zakoñczenia dodawania | ||
potrzebujemy | potrzebujemy regu³y: | ||
<math> | <math> | ||
Linia 508: | Linia 506: | ||
</math> | </math> | ||
Gdy jeden ze | Gdy jeden ze sk³adników ma mniej cyfr ni¿ drugi, potrzebujemy regu³: | ||
<math> | <math> | ||
Linia 524: | Linia 522: | ||
</math> | </math> | ||
Niestety, nie | Niestety, nie mo¿emy u¿yæ regu³y przemienno¶ci: | ||
<math> | <math> | ||
Linia 530: | Linia 528: | ||
</math> | </math> | ||
gdy¿ spowodowa³aby ona mo¿liwo¶æ ''pêtlenia siê'', a zatem braku wyniku obliczenia. | |||
Na koniec dodajemy typowe | Na koniec dodajemy typowe regu³y opisuj±ce jak krok podwyra¿enia indukuje | ||
krok | krok ca³ego wyra¿enia: | ||
<math> | <math> | ||
Linia 556: | Linia 554: | ||
{{cwiczenie|4|cw4| | {{cwiczenie|4|cw4| | ||
Rozszerzmy | Rozszerzmy sk³adniê o jeden symbol <math>p</math> oznaczaj±cy | ||
'' | ''przepe³nienie'': | ||
<math> | <math> | ||
Linia 568: | Linia 566: | ||
</math> | </math> | ||
Na | Na przyk³ad <math>p 1 0 1</math> oznacza tê sam± liczbê co <math>\epsilon 1 0 1 | ||
</math>, ale z | </math>, ale z dodatkow± informacj±, ¿e podczas jej obliczania nast±pi³o | ||
'' | ''przepe³nienie''. | ||
Rozumiemy przez to | Rozumiemy przez to sytuacjê, gdy wynik ma wiêcej cyfr ni¿ ka¿dy z | ||
argumentów. Cyfry zero z lewej strony (najbardziej | argumentów. Cyfry zero z lewej strony (najbardziej znacz±ce) równie¿ | ||
uwa¿amy za pe³noprawne cyfry, nie nale¿y ich usuwaæ ani dodawaæ | |||
nowych. | |||
Napisz semantykê operacyjn± obliczaj±c± warto¶æ wyra¿enia wraz z | |||
informacja o ewentualnym przepe³nieniu. | |||
Wynik powinien byc poprawny przynajmniej dla wyra¿eñ <math>e</math> w sk³adni | |||
ograniczonej: | |||
<math> | |||
e \, ::= \,\, | |||
b \,\,|\,\, | |||
e_1 + e_2 | |||
</math> | |||
<math> | |||
b \, ::= \,\, | |||
\epsilon \,\,|\,\, | |||
b 0 \,\,|\,\, | |||
b 1. | |||
</math> | |||
}} | }} | ||
Linia 586: | Linia 598: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none"> | ||
Zadanie dotyczy w zasadzie | Zadanie dotyczy w zasadzie sk³adni ograniczonej, ale jako konfiguracji | ||
po¶rednich bêdziemy zapewne potrzebowaæ wyra¿eñ wykraczaj±cych poza | |||
tê sk³adniê, np. <math>(e_1 + e_2) 0</math>, podobnie jak w poprzednim | |||
zadaniu. Zatem mamy tu do czynienia z typowym zabiegiem rozszerzania | zadaniu. Zatem mamy tu do czynienia z typowym zabiegiem rozszerzania | ||
sk³adni na u¿ytek semantyki operacyjnej (z tym, ¿e rozszerzenie jest | |||
dane z góry i nie musimy go | dane z góry i nie musimy go wymy¶laæ :) | ||
Przyjmijmy, | Przyjmijmy, ¿e konfiguracjami s± dowolne wyra¿enia, a konfiguracjami | ||
koñcowymi wyra¿enia bez operatora dodawania (ale teraz mog± to byæ | |||
np. | np. wyra¿enia postaci <math>p 1 0 0</math>). | ||
Spróbujmy | Spróbujmy pozostawiæ wszystkie regu³y z poprzedniego zadania. | ||
Dodamy tylko kilka nowych | Dodamy tylko kilka nowych regu³, odpowiedzialnych za przepe³nienie. | ||
Zacznijmy od najprostszej sytuacji, gdy jeden ze | Zacznijmy od najprostszej sytuacji, gdy jeden ze sk³adników ma mniej | ||
cyfr, i to ten | cyfr, i to ten w³a¶nie sk³adnik odnotowa³ przepe³nienie: | ||
<math> | <math> | ||
Linia 612: | Linia 624: | ||
</math> | </math> | ||
W takiej sytuacji | W takiej sytuacji oczywi¶cie informacja o przepe³nieniu zostaje | ||
wymazana. | wymazana. | ||
Je¶li przepe³nienie zosta³o odnotowane w sk³adniku o wiêkszej liczbie | |||
cyfr, to | cyfr, to regu³y | ||
<math> | <math> | ||
Linia 627: | Linia 639: | ||
</math> | </math> | ||
z poprzedniego zadania | z poprzedniego zadania s± wystarczaj±ce. | ||
Rozwa¿my teraz przypadek, gdy obydwa sk³adniki maj± tê sam± liczbê | |||
cyfr. | cyfr. | ||
Je¶li obydwa odnotowa³y przepe³nienie, to oczywi¶cie informacja ta | |||
powinna | powinna zostaæ zachowana: | ||
<math> | <math> | ||
Linia 638: | Linia 650: | ||
</math> | </math> | ||
Ale co | Ale co nale¿y zrobiæ, gdy tylko jeden ze sk³adników odnotowa³ | ||
przepe³nienie? <math>p + \epsilon \,\Longrightarrow\, ?</math> | |||
Oczywi¶cie, w tej sytuacji ¿adnego przepe³nienia nie ma, poniewa¿ | |||
drugi | drugi sk³adnik ma wystarczaj±co du¿o cyfr by je przes³oniæ. | ||
Oto odpowiednie | Oto odpowiednie regu³y: | ||
<math> | <math> | ||
Linia 650: | Linia 662: | ||
</math> | </math> | ||
Na koniec | Na koniec zosta³o najwa¿niejsze: kiedy powinni¶my generowaæ sygna³ o | ||
przepe³nieniu? | |||
Przypomnijmy sobie | Przypomnijmy sobie regu³y dla dadawania pisemnego w poprzednim | ||
zadaniu. | zadaniu. | ||
Je¶li nie ma przeniesienia, to przepe³nienie nie mo¿e powstaæ. | |||
Natomiast | Natomiast je¶li jest przeniesienie, to stanowi ono ''potencjalne | ||
przepe³nienie''. | |||
Odpowiednia | Odpowiednia regu³a to | ||
<math> | <math> | ||
Linia 663: | Linia 675: | ||
</math> | </math> | ||
Nowy sztuczny | Nowy sztuczny sk³adnik <math>p 1</math> zawiera jakby na wszelki wypadek | ||
informacje o potencjalnym | informacje o potencjalnym przepe³nieniu. | ||
Je¶li którykolwiek z pozosta³ych sk³adników <math>e_1</math> i <math>e_2</math> | |||
ma przynajmniej | ma przynajmniej jedn± cyfrê, | ||
to <math>p</math> zostanie | to <math>p</math> zostanie usuniête. W przeciwnym wypadku symbol <math>p</math> | ||
i przetrwa i | i przetrwa i bêdzie poprawnie informowa³ o sytuacji przepe³nienia. | ||
Linia 678: | Linia 690: | ||
{{cwiczenie|1|cw1.dom| | |||
Podaj | Podaj przyk³ad wyra¿enia boolowskiego, które nie policzy siê | ||
ani przy | ani przy u¿yciu strategii lewo- ani prawostronnej, a policzy siê przy strategii | ||
równoleg³ej. | |||
}} | |||
{{cwiczenie|2|cw2.dom| | |||
Zmodyfikuj | Zmodyfikuj semantykê wyra¿eñ nastêpuj±co: dla ka¿dego podwyra¿enia niedeterministycznie | ||
wybierana jest albo strategia lewo- albo prawostronna, ale | wybierana jest albo strategia lewo- albo prawostronna, ale | ||
niedozwolony jest ,,przeplot | niedozwolony jest ,,przeplot". | ||
}} | |||
{{cwiczenie|3|cw3.dom| | |||
Rozwa¿ inn± semantykê pêtli <math>\mathbf{for}\, x = e_1 \,\mathbf{to}\, e_2 \,\mathbf{do}\, I</math>, | |||
w której | w której wyra¿enie <math>e_2</math> jest obliczane na nowo | ||
przed | przed ka¿d± iteracj± pêtli. | ||
Napisz | Napisz regu³y semantyczne dla tej instrukcji, nie odwo³uj±c | ||
siê do innych istrukcji pêtli. | |||
}} | |||
{{cwiczenie|4|cw4.dom| | |||
Dodaj do | Dodaj do wyra¿eñ binarnych operacjê odejmowania. | ||
}} | |||
{{cwiczenie|5|cw15.dom| | |||
Zaproponuj semantykê przypisania równoleg³ego w jêzyku Tiny: | |||
Zaproponuj | |||
<math> | <math> | ||
Linia 715: | Linia 730: | ||
</math> | </math> | ||
polegaj±cego na obliczeniu najpierw warto¶ci wyra¿eñ | |||
<math>e_1, \ldots, e_n</math> a | <math>e_1, \ldots, e_n</math> a nastêpnie na podstawieniu | ||
tych warto¶ci na zmienne <math>x_1, \ldots, x_n</math>. | |||
}} |
Wersja z 07:58, 9 sie 2006
Zawarto¶æ
Æwiczymy dalej semantykê ma³ych kroków. Uzupe³nimy semantykê jêzyka Tiny o semantykê operacyjn± wyra¿eñ boolowskich i arytmetycznych. Nastêpnie rozszerzymy nasz jêzyk o róznorodne konstrukcje iteracji. Na koniec zdefiniujemy operacje arytmetyczne liczb binarnych.
Rozszerzenia semantyki jêzyka Tiny
Ćwiczenie 1
Semantyka jêzyka Tiny z wyk³adu u¿ywa³a funkcji semantycznych dla okre¶lenia znaczenia wyra¿eñ boolowskich i arytmetycznych. Zdefiniuj znaczenie wyra¿eñ za pomoc± semantyki operacyjnej, w stylu ma³ych kroków.
Rozwiązanie
Ćwiczenie 2
Rozszerzmy jêzyk Tiny o nastêpuj±ce dobrze znane konstrukcje iteracji:
Napisz semantykê ma³ych kroków dla powy¿szych konstrukcji.
Rozwiązanie
Kalkulator binarny
Ćwiczenie 3
Rozwa¿my nastêpuj±cy jêzyk wyra¿eñ (liczby binarne z dodawaniem):
oznacza s³owo puste, czyli np. oznacza binarn± liczbê 1011. Napisz semantykê operacyjn± obliczaj±c± warto¶æ wyra¿eñ.
Rozwiązanie
Ćwiczenie 4
Rozszerzmy sk³adniê o jeden symbol oznaczaj±cy przepe³nienie:
Na przyk³ad oznacza tê sam± liczbê co , ale z dodatkow± informacj±, ¿e podczas jej obliczania nast±pi³o przepe³nienie. Rozumiemy przez to sytuacjê, gdy wynik ma wiêcej cyfr ni¿ ka¿dy z argumentów. Cyfry zero z lewej strony (najbardziej znacz±ce) równie¿ uwa¿amy za pe³noprawne cyfry, nie nale¿y ich usuwaæ ani dodawaæ nowych.
Napisz semantykê operacyjn± obliczaj±c± warto¶æ wyra¿enia wraz z informacja o ewentualnym przepe³nieniu. Wynik powinien byc poprawny przynajmniej dla wyra¿eñ w sk³adni ograniczonej:
Rozwiązanie
Zadania domowe
Ćwiczenie 1
Podaj przyk³ad wyra¿enia boolowskiego, które nie policzy siê ani przy u¿yciu strategii lewo- ani prawostronnej, a policzy siê przy strategii równoleg³ej.
Ćwiczenie 2
Zmodyfikuj semantykê wyra¿eñ nastêpuj±co: dla ka¿dego podwyra¿enia niedeterministycznie wybierana jest albo strategia lewo- albo prawostronna, ale niedozwolony jest ,,przeplot".
Ćwiczenie 3
Rozwa¿ inn± semantykê pêtli , w której wyra¿enie jest obliczane na nowo przed ka¿d± iteracj± pêtli. Napisz regu³y semantyczne dla tej instrukcji, nie odwo³uj±c siê do innych istrukcji pêtli.
Ćwiczenie 4
Dodaj do wyra¿eñ binarnych operacjê odejmowania.
Ćwiczenie 5
Zaproponuj semantykê przypisania równoleg³ego w jêzyku Tiny:
polegaj±cego na obliczeniu najpierw warto¶ci wyra¿eñ a nastêpnie na podstawieniu tych warto¶ci na zmienne .