Semantyka i Weryfikacja Programów Laboratorium 1 - prz

Transkrypt

Semantyka i Weryfikacja Programów Laboratorium 1 - prz
Semantyka i Weryfikacja Programów
Laboratorium 1
Wprowadzenie do semantyki denotacyjnej języka imperatywnego TINY
Literatura:
1. Cameron R. D., Denotational semantics, ­ w formie pdf dostępny na stronie www.cisek.prz­
rzeszow.pl
2. Gordon M. J. C., Denotacyjny opis języków programowania, WNT 1992
Podczas wykładów i laboratoriów stosowana jest notacja z [1].
1. Wprowadzenie
Dana jest semantyka denotacyjna języka TINY (Maly). .Dziedziny syntaktyczne to identyfikatory, wyrażenia i instrukcje oznaczane dalej jako.
Składnia wyrażeń:
Składnia instrukcji
Stan programu (pamięć, wejście, wyjście):
Pamięć jest odwzorowaniem zbioru identyfikatorów na wartości:
Wejście i wyjście określono jako:
Funkcja denotacyjna dla wyrażeń jest typu:
Funkcja denotacyjna dla instrukcji jest typu:
Denotacje dla wyrażeń w lambda-notacji :
Pytania kontrolne:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Co to jest dziedzina semantyczna.
Określ, co rozumiesz pod pojęciem wyrażenie.
Co to instrukcja i czym istotnym różni się od wyrażenia.
Co to jest stan programu i z jakich się składa elementów?
Co to jest wartość? Jakiego może być typu w języku TINY. Jak rozumiesz pojęcie pamięć? Jak się wiąże z pojęciem identyfikator? Mówi się, że identyfikator w języku imperatywnym wiąże się z typem, wartością i adresem w pamięci. Jak to należy rozumieć?
Jak zdefiniujesz pojęcie wejścia i wyjścia w języku imperatywnym. Odnieś to do pojęcia taśmy wejściowej i wyjściowej w modelu maszyny RAM.
Co to jest funkcja semantyczna w semantyce denotacyjnej?
Określ typ funkcji semantycznej dla wyrażeń. Wyjaśnij słownie posługując się językiem potocznym.
Określ typ funkcji semantycznej dla instrukcji. Wyjaśnij słownie posługując się językiem potocznym. Opisz za pomocą algorytmu (graficznie) sposób obliczania wartości wyrażeń w języku TINY. Uwzględnij konieczność sprawdzenia zgodności typów.
1. Negacja
2. Porównanie 3. Suma arytmetyczna
Opisz za pomocą algorytmu (graficznie) sposób wykonania instrukcji języka TINY. Uwzględnij na rysunku zmiany stanu programu 1. Instrukcja przypisania.
2. Instrukcja if...then...else fi.
3. Pętla while ... do ... od. 2. Przykłady realizacji programów – operatory logiczne
Realizację brakujących operatorów logicznych w języku TINY można zrealizować za pomocą instrukcji if
­ alternatywa p or q
if p then y:= true
else if q then y := true
else y := false fi
fi
Narysuj schemat blokowy i sprawdź dla wszystkich czterech możliwych kombinacji poprawność realizacji funkcji. Wyniki umieść w tabeli.
p
q
false
false
false
true
true
false
true
true
­ koniunkcja
p and q
y
if not p then y:= false
else if not q then y := false
else y := true fi
fi
Narysuj schemat blokowy i sprawdź dla wszystkich czterech możliwych kombinacji poprawność realizacji funkcji. Wyniki umieść w tabeli.
p
q
false
false
false
true
true
false
true
true
y
– mnożenie jako wielokrotne dodawanie
y := m * n
iloczyn := 0; //instr1 licz := 0; //instr2
while not licz = n do //wyr
iloczyn := iloczyn + m; //instr3 licz := licz +1 //instr4
od
Sporządź schemat blokowy dla programu. Przeprowadź obliczenia sprawdzające dla danych m = 3 i n = 2. Wyniki obliczeń (stan programu) umieść w tabeli :
Stan po:
instr1
instr2
instr3
instr1
instr2
instr3
instr1
instr2
instr3
instr1
instr2
instr3
iloczyn
licz
not licz = n
3. Elementarne programy i ich poprawność programów
Zad. 1.
Czy poprawny jest podany niżej program:
y := 1 + x
Podaj, z jakich elementów składa się program. Określ słownie algorytm wykonywania działań. Powołaj się na funkcje semantyczne języka TINY. Jakie sytuacje mogą powodować powstanie błędu?
Odpowiedź
Program składa się z pojedynczej instrukcji przypisania. Zgodnie z regułą składniową 10. Po lewej stronie operatora przypisania występuje identyfikator, a po prawej wyrażenie. Zgodnie z funkcją denotacyjną wykonanie instrukcji polega na obliczeniu wartości wyrażenia. W tym przypadku jest to wyrażenie z operatorem +, stosuje się więc regułę 9. Mówi ona, że najpierw oblicza się wartość wyrażenia po lewej stronie operatora a następnie po prawej i jeżeli można je wyznaczyć i są to wartości numeryczne, to wartość wyrażenia jest sumą arytmetyczną operandów.
Z lewej strony operator mamy wyrażenie stałe 1 jego wartością zgodnie z funkcją semantyczną nr 2 jest jeden. Z prawej strony mamy identyfikator, stosujemy regułę 6. Z treści programu nie wynika, czy identyfikatorowi x została przyporządkowana jakaś wartość w pamięci (jest warunek konieczny poprawności). Przyjmując, że tak, należy pamiętać, że wartość ta powinna być numeryczna (konieczne dla reguły 10).
Zad. 2.
Zbadaj poprawność podanego programu: x := 1 + true; Napisz na czym polega błąd (błędy). Powołaj się na właściwą funkcję semantyczną. Popraw ewentualne błędy. Określ stan programu po wykonaniu instrukcji.
Zad. 3.
Czy poprawny jest podany niżej program:
x := 1 + 1 = 1 Wskazówka: Zastanów się, który operator + (dodawania) czy = (porównania) ma wyższy priorytet. Czy wynika to z funkcji semantycznych? Napisz na czym polega niejednoznaczność. Jakiego typu będzie zmienna x.
Zad. 4.
Zapisz w języku TINY instrukcję:
y := x>0
Do jakiej dziedziny należą zmienne x i y?
Wskazówka: Ponieważ w języku TINY liczby mogą być tylko nieujemne można użyć operatora porównania i negacji.
Zad. 5.
Zapisz w języku TINY instrukcję:
y := x>1
Wskazówka: Użyj dwukrotnie (zagnieżdżonej) instrukcji if … then … else … fi. Zwróć uwagę na średniki (czy są potrzebne?). Przed napisaniem programu sporządź algorytm. Do jakiej dziedziny należą zmienne x i y?
Zad. 6.
Napisz program obliczający sumę dwóch liczb wprowadzanych ze strumienia wejściowego (instrukcja read). Wynik wyprowadzany jest do strumienia wyjściowego (output). Zacznij od sporządzenia algorytmu.
Zad. 7.
Poniżej dany jest program
x := read;
y := read;
i := 0;
koniec := false;
y_wieksze_x := false;
while (not koniec) do
if x = i then y_wieksze_x:=true; koniec:=true
else if y = i then y_wieksze_x: = false; koniec := true
else i:= i+1 fi
fi
od;
if y_wieksze_x then output y
else output x
fi
Czy program ten jest składniowo poprawny (zwróć szczególną uwagę na użycie średników). Narysuj schemat blokowy. Wypisz kolejno warunki poprawnego zakończenia programu wynikające z funkcji semantycznych. Czy pętla while może być tu nieskończona? Wykonaj obliczenia dla danych podanych przez prowadzącego.