Semantyka i weryfikacja programów/Ćwiczenia 2: Różnice pomiędzy wersjami
m Zastępowanie tekstu - "\Longrightarrow\" na "\Longrightarrow" |
m Zastępowanie tekstu – „,</math>” na „</math>,” |
||
Linia 212: | Linia 212: | ||
ale nie wiemy już, jaki był dozór pętli (widzimy tylko wynik obliczenia tego dozoru w stanie s, czyli <math>\mathbf{true}</math>). | ale nie wiemy już, jaki był dozór pętli (widzimy tylko wynik obliczenia tego dozoru w stanie s, czyli <math>\mathbf{true}</math>). | ||
Możemy odwołać się do tranzytywnego domknięcia relacji <math>\,\Longrightarrow | Możemy odwołać się do tranzytywnego domknięcia relacji <math>\,\Longrightarrow</math>, (czyli w zasadzie do semantyki dużych kroków): | ||
<math> | <math> | ||
Linia 224: | Linia 224: | ||
Istnieją inne możliwe rozwiązania w stylu małych kroków. | Istnieją inne możliwe rozwiązania w stylu małych kroków. | ||
Jedno z nich oparte jest na pomyśle, aby "rozwinąć" pętlę <math>\mathbf{while}\ | Jedno z nich oparte jest na pomyśle, aby "rozwinąć" pętlę <math>\mathbf{while}\</math>, zanim obliczymy wartość dozoru <math>b</math>. | ||
Jedyną reguła dla pętli <math>\mathbf{while}\ | Jedyną reguła dla pętli <math>\mathbf{while}\</math>, byłaby wtedy reguła: | ||
<math> | <math> | ||
Linia 261: | Linia 261: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''Instrukcja <math>\mathbf{repeat}\ | '''Instrukcja <math>\mathbf{repeat}\</math>,''' | ||
<br> | <br> | ||
Zacznijmy od pętli <math>\mathbf{repeat}\, I \,\mathbf{until}\, b</math>. | Zacznijmy od pętli <math>\mathbf{repeat}\, I \,\mathbf{until}\, b</math>. | ||
Przyjrzyjmy się dwóm podejściom, które zastosowaliśmy dla pętli <math>\mathbf{while}\ | Przyjrzyjmy się dwóm podejściom, które zastosowaliśmy dla pętli <math>\mathbf{while}\</math>, w poprzednim zadaniu. | ||
Po pierwsze, rozwinięcie: | Po pierwsze, rozwinięcie: | ||
Linia 287: | Linia 287: | ||
</math> | </math> | ||
Okazuje się, że jest jeszcze gorzej niż w przypadku pętli <math>\mathbf{while}\ | Okazuje się, że jest jeszcze gorzej niż w przypadku pętli <math>\mathbf{while}\</math>,: nie pamiętamy już, jaka była instrukcja wewnętrzna naszej pętli! | ||
Czyli takie podejście jest teraz nieskuteczne. | Czyli takie podejście jest teraz nieskuteczne. | ||
Linia 321: | Linia 321: | ||
<br> | <br> | ||
'''Instrukcja <math>\mathbf{for}\ | '''Instrukcja <math>\mathbf{for}\</math>,''' | ||
<br> | <br> | ||
W przypadku pętli <math>\mathbf{for}\ | W przypadku pętli <math>\mathbf{for}\</math>, przyjmijmy, że wartości wyrażeń <math>e_1</math> i <math>e_2</math> obliczane są przed pierwszą iteracją pętli. | ||
Dodatkowo ustalmy, że np. <math>e_1</math> będzie obliczone jako pierwsze. | Dodatkowo ustalmy, że np. <math>e_1</math> będzie obliczone jako pierwsze. | ||
Następnie podstawiamy wartość <math>e_1</math> na zmienną <math>x</math>. | Następnie podstawiamy wartość <math>e_1</math> na zmienną <math>x</math>. |
Wersja z 09:28, 5 wrz 2023
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:
reprezentujących sumę liczb binarnych.
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 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.
Ć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 .