Semantyka i Weryfikacja Programów
Transkrypt
Semantyka i Weryfikacja Programów
Semantyka i Weryfikacja Programów - Laboratorium 7 Weryfikacja twierdzeń logicznych Cel. Celem ćwiczenia jest zapoznanie się z metodą automatycznego dowodzenia twierdzeń, tzn. weryfikacji, czy dane twierdzenie jest tautologią (twierdzenie prawdziwe nazywa się tautologią). Przykładami takich problemów są: - dowodzenie twierdzeń w klasycznym ujęciu, tzn. czy z założenia wynika teza (implikacja) - badanie równoważności wyrażeń (np. wzory upraszczające) - weryfikacja, czy program daje wynik zgodny ze swą specyfikacją - weryfikacja, czy schemat elektroniczny, na którym ma być wzorowany program, realizuje wymaganą funkcję. Podstawowy program automatycznego weryfikatora tautologii zaprezentowano na wykładzie 5 i następnych. Poniżej podano wersję zmodyfikowaną, wygodniejszą w użyciu i optymalniejszą pod względem czasu obliczeń. Niżej omówiono jedynie różnice w stosunku do wersji oryginalnej oprogramowania. Deklaracja typu danych prop Wprowadzono infiksowe konstruktory typu i zdefiniowano ich priorytety, Uzupełniono typ prop o symboliczną prawdę i fałsz. Ułatwia to symboliczne zapisywanie wyrażeń rachunku zdań. infix infix 6 5 **; ++; datatype prop = | | | | At of string !! of prop ++ of prop * prop ** of prop * prop T | F; (* (* (* (* (* atom *) negacja *) alternatywa - suma *) koniunkcja - iloczyn *) symboliczne prawda i falsz *) Przykład Poniżej zdefiniowano atomy i zapisano symbolicznie wyrażenie p or q and r. val p = At "p"; val q = At "q"; val r = At "r"; val wyraz = p ++ q ** r; (* uzycie nawiasow nie jest konieczne *) Implikacja i równoważność. Zdefiniowano je infiksowo jako funkcje o odpowiednich priorytetach: infix 4 --> ; fun p --> q = !!p ++ q; infix 4 <=> ; fun p<=>q = p ** q ++ !!p ** !! q; Przekształcenie do normalnej formy negacyjnej. Funkcję nnf weryfikatora uzupełniono o nowe warianty z wprowadzonymi konstruktorami T i F. fun | | | | | | | | | | nnf nnf nnf nnf nnf nnf nnf nnf nnf nnf nnf (At a) (!!(At a)) (!!T) (!!F) T F (!!(!! p)) (!!((p++q))) (!!((p**q)) (p**q) (p++q) = = = = = = = = = = = At a !!(At a) F (* zaprzeczenie prawdy jest falszem *) T T (* brak negacji, konstruktor pozostaje *) F nnf p (* podwojna negacja *) nnf (!!p ** !!q) (* negacja sumy,iloczyn negacji *) nnf (!!p ++ !!q) (nnf p) ** (nnf q) (nnf p) ++ (nnf q); -1- Kanoniczna forma koniunkcyjna. Przytoczone niżej funkcje roz i cnf nie wymagają wprowadzenia zmian. fun roz(p,q**r) = roz(p,q) ** roz(p,r) (* p+q*r = (p+q)*(p+r) *) | roz(q**r,p) = roz(q,p) ** roz(r,p) (* q*r+p = (q+p)*(r+p) *) | roz(p,q) = p ++ q ; (* zaden skladnik nie jest koniunkcja *) fun cnf (p ++ q) = roz(cnf p , cnf q) (* Alt zastapione przez roz (j.w.) *) | cnf (p ** q) = (cnf p) ** (cnf q) (* rozklad skladnikow iloczynu *) | cnf p = p; (* pojedynczy atom lub stala *) Przebieg weryfikacji. W alternatywach oprócz atomów i ich negacji występują teraz konstruktor T i F. Sprawdzanie poprawności wykonuje się w dwóch etapach: 1. Sprawdzenie za pomocą podanej niżej funkcji chk_alt , czy w alternatywie znajduje się T (wtedy jest ona tautologią). (* sprawdzenie, czy w alternatywie znajduje się T *) fun chk_alt (T) = true (* tak, alternatywa jest tautologia *) | chk_alt(p++q) = (chk_alt p) orelse (chk_alt q) | chk_alt _ = false; 2. Wyznaczenie części wspólnej list atomów zanegowanych i niezanegowanych, podobnie jak w dotychczasowym weryfikatorze. Funkcje neg i pos uzupełniono o warianty z nowymi konstruktorami T i F (ale są one pomijane). exception NieCNF; (* wyrazenie nie przeksztalcone do CNF *) fun | | | | | pos pos pos pos pos pos (At a) = [a] (!! (At _)) = [] (p++q) = pos p @ pos q T = [] F = [] _ = raise NieCNF; fun | | | | | neg neg neg neg neg neg (At _) (!! (At a)) (p ++ q) T F _ infix mem; fun x mem [] = = = = = = [] [a] neg p @ neg q [] [] raise NieCNF; = false | x mem (y::l) = (x=y) orelse (x mem l); (* czesc wspolna dwu list *) fun inter ([],ys)=[] | inter (x::xs,ys) = if x mem ys then x::inter(xs,ys) else inter(xs,ys); Funkcja sprawdzająca (* funkcja sprawdzajaca *) fun taut (p**q) = taut p andalso taut q(* p,q - czynniki Kon *) | taut p = (chk_alt p) orelse ([] <> inter(pos p, neg p)); fun check(s) = taut (cnf (nnf (s))); (* zbiorcza funkcja *) Cały przedstawiony wyżej program znajduje się w załączonym pliku „lab_5.sml”. -2- Przykłady P.1. Dowód twierdzenia Prawdziwość koniunkcji implikuje prawdziwość alternatywy, tzn. p ⋅ q → ( p + q ) val p = At "p" and q = At "q"; (* deklaracje symboli jako atomy *) val tw = p ** q --> (p ++ q); (* symboliczny zapis twierdzenia *) check tw; (* automatyczna weryfikacja *) P.2. Równoważność wzorów A. Wykazanie, że wyrażenie p + p ⋅ p + q jest prawdziwe (true) dla dowolnych p, q val wyr = p ++ !! (p ** !!(p ++ q)); (* zapis wyrażenia *) check wyr; (* weryfikacja *) B. Sprawdzenie, że wyrażenia p ≡ q i ( p → q ) ⋅ (q → p) są równoważne. val wz1 = p <=> q; (* pierwszy wzor *) val wz2 = (p-->q) ** (q-->p); (* drugi *) val tw = wz1 <=> wz2; (* twierdzenie o ich rownowazności *) check tw; (* weryfikacja *) P.3. Sterowanie logiczne Dany jest mikrokomputerowy układ START-STOP włączania i wyłączania pewnej maszyny. s ta r t s ta n s to p µP out M s ta n Specyfikacja programu ma postać: OUT = ( START + STAN ) ⋅ STOP Sterowanie jest realizowane przez program mikroprocesora w dziedzinie boolowskiej. Jego zapis zgodny z metodą FBD (zob. wykł. 6) jest reprezentowany w postaci bramek AND, OR, NOT (bloków funkcyjnych) w postaci układu s ta r t s ta n s to p O R NO T y1 AND out y2 Niżej podano przykładowy program realizujący takie sterowanie (wartość logiczna – true, false). (* funkcje biblioteczne występujące na schemacie *) fun OR(x1,x2) = x1 orelse x2; fun AND(x1,x2) = x1 andalso x2; fun NOT(x) = not x; (* funkcja sterujaca *) fun start_stop(start, stan, let val y1 = OR(start,stan) val y2 = NOT(stop) val y3 = AND(y1,y2); in y3 end; stop) = (* wyjście bloku pierwszego *) (* wyjście bloku drugiego *) (* wyjście bloku trzeciego *) (* obliczenie wyjscia ukladu - sterowania *) val out = start_stop(true, false, false); (* rezultat bool *) -3- Weryfikacja programu sterującego Realizacja i weryfikacja w dziedzinie symbolicznej jest następująca: (* definicja atomów reprezentujacych sygnaly *) val START = At "start" and STOP = At "stop" and STAN = At "stan"; (* funkcje symboliczne *) fun OR_S(X1,X2) = X1++X2; fun AND_S(X1,X2) = X1**X2; fun NOT_S(X) = !!X; (* symboliczne wykonanie – odpowiadajace funkcji start_stop*) val Y1 = OR_S(START,STAN); val Y2 = NOT_S(STOP); val Y3 = AND_S(Y1,Y2); val OUT = Y3; (* symboliczny rezultat wykonania programu *) val SPEC_OUT = (START ++ STAN) ** !! STOP; (* specyfikacja symboliczna *) (* twierdzenie o rownowaznosci specyfikacji i wyniku *) val tw = SPEC_OUT <=> OUT; check tw; (* weryfikacja - rezultatem jest true *) P. 4. Schematy elektroniczne Programy realizujące funkcje zabezpieczeń są często wzorowane na sprawdzonych rozwiązaniach sprzętowych. Na poniższych rysunkach pokazano kolejno: 1) ideę funkcjonowania multipleksera 4:1 (4WE, 1WY) 2) symbol logiczny multipleksera 3) realizację funkcji y = abc + abc + ab 4) realizację funkcji y = abcd + abcd + abc d + abc d + abc d + abcd + abc d + abc d (1) (2) 3 S S 2 out 0 1 2 3 0 1 1 (3) b a S S 1 MUX 1 S 0 S 0 0 out (4) b a 0 1 S S MUX 1 c c 0 1 2 3 0 1 MUX y c d -4- c 0 1 2 3 y Specyfikacja i realizacja multipleksera Specyfikację można zapisać jako y= !s0·!s1·x0 + !s0· s1·x1 + !s0· s1·x2 + s0· s1· x3. Realizacja multipleksera w dziedzinie boolowskiej jest następująca: fun mux4(s0,s1,x0,x1,x2,x3) = if not s0 andalso not s1 then x0 else if s0 andalso not s1 then x1 else if not s0 andalso s1 then x2 else x3; Specyfikację można zapisać symbolicznie stosując pomocnicze wielowejściowe funkcje koniunkcji i alternatywy. (* realizacja symboliczna funkcji wielowejsciowych *) fun OR4_S(X1,X2,X3,X4) = X1 ++ X2 ++ X3 ++ X4; fun AND3_S(X1,X2,X3) = X1 ** X2 ** X3; fun MUX4_S(S0,S1,X0,X1,X2,X3) OR4_S( AND3_S(!! S0, !!S1, AND3_S( S0, !!S1, AND3_S(!! S0, S1, AND3_S( S0, S1, ); = X0), X1), X2), X3) Sprawdzenie realizacji funkcji z rys. 3 (* realizacja symboliczna funkcji z rys.3 *) val A = At "A" and B = At "B" and C = At "C"; val uklad = MUX4_S(B, A, F, T, C, !!C); (* specyfikacja *) val spec = A ** B ** !!C ++ A ** !!B ** C ++ !!A ** B; (* twierdzenie *) val tw = uklad <=> spec; (* sprawdzenie *) check tw; Rezultatem jest true, co potwierdza poprawność realizacji. Sprawdzenie realizacji funkcji z rys. 4 (* realizacja symboliczna funkcji z rys.4 *) val A = At "A" and B = At "B" and C = At "C" and D = At "D"; fun NAND_S(X1,X2) = !! (X1 ** X2); (* definicja funkcji NAND *) val Y1 = NAND_S(!!C,D); val Y = MUX4_S(B, A, F, Y1, !!C, Y1); (* specyfikacja *) val spec = A ** B ** !!A ** B ** A ** !!B ** A ** B ** (* twierdzenie *) val tw = Y <=> spec; check tw; (* sprawdzenie C !!C !!C !!C ** D ++ !!A ** B ** C ** D ++ ** !!D ++ !!A ** B ** C ** !!D ++ ** !!D ++ A ** !!B ** !!C ** D ++ ** !!D ++ A ** B ** C ** !!D ; - trwa dlugo ok. 20 sekund!!!*) Polecenia -5- 1. Zweryfikuj formalnie podane niżej równoważności: c d + cd = c cd + c d + c d = cd 2. Zrealizuj (narysuj schemat) i zweryfikuj formalnie układ multipleksera zbudowanego wyłącznie z wielowejściowych bramek NAND. Wskazówki. ● Wykorzystaj specyfikację układu w postaci alternatywy koniunkcji. ● Skorzystaj z tożsamości: !(a·a) = !a ● Zastosuj w praktyce przekształcenia: a+b = !(!(a+b)) = !(!a·!b) -6- Zadania do samodzielnego rozwiązania 1. Udowodnij, że z założenia (a + b) ⋅ ( a → b) wynika teza a → b (implikacja). 2. Sprawdź formalnie, czy prawdziwe są następujące wzory ? a) ab + c a + bc = ab b) abc + abc = a c) a + abc = ab + a c 3. Jaką funkcję realizuje przedstawiony na poniższym rysunku układ? Wykaż formalnie. b a S S 0 1 MUX 1 0 1 2 3 f 4. Sprawdź formalnie które z poniższych wzorów są prawdziwe? a) [( p → q) → r ] ≡ [ p → ( q → r )] b) [( p ⇔ q ) ⇔ r ] ≡ [( p ⇔ q ) ⋅ ( q ⇔ r )] 5. Sprawdź formalnie które z poniższych wzorów są prawdziwe? a) ( p + q) ⋅ ( p + r ) ⋅ ( q + r ) ≡ ( p + q ) ⋅ ( p + r ) b) q ⇒ [( p + q) ⇒ p ] DX 0 n 6. Dekoder jest układem o n wejściach i 2 wyjściach. Do dekodera 2:4 dołączono sygnały A, B. Zaproponuj układ, który dołączony do wyjść dekodera odtworzy sygnały A,B. Wykaż formalnie poprawność działania. A B 0 1 1 2 ? A B 3 7. Wykaż słuszność następującego rozumowania: Jeśli student nie złoży projektu, to nie zaliczy przedmiotu X. Jeśli student nie zaliczy przedmiotu X, to nie przejdzie na następny rok. Zatem jeśli student przeszedł na następny rok, to znaczy, że musiał złożyć projekt z przedmiotu X. Wskazówka. Jako atomy można przyjąć następujące zdania logiczne: 1) student składa projekt, 2) przedmiot X zaliczony, 3) student przechodzi na następny rok. -7- 8. Zaproponuj układ, który 4-bitowe słowo uzupełni 5-tym bitem parzystości (even), tzn. słowo oryginalne słowo z bitem parzystości 0 1 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 Jaką funkcję logiczną realizuje układ? Podaj specyfikację i zweryfikuj formalnie. Wsk.: Użyj bramek EXOR 9. Wykaż, że poniższy układ realizuje podaną funkcję. a b x = a(b + cd ) x c d 10. Koder ma zamieniać kod unitarny „1 z 10” na kod BCD. Jeżeli wyjściom a, b, c, d przyporządkować wagi – a=1, b=2, c=4, d=8, to otrzymuje się następujące wyrażenia logiczne a=x1+x3+x5+x7+x9 b=x2+x3+x6+x7 c=x4+x5+x6+x7 d=x8+x9 x1 x2 x3 ... x9 a b c d Zaproponuj programową realizację kodera i wykaż, że odpowiada ona specyfikacji. -8- 11. Dwa spośród sześciu sygnałów sterujących odłącznikami transformatorów i odłącznikiem sekcyjnym w stacji dwutransformatorowej mają postać x =a+c , gdzie: a, b z =e+a+c+b+d +c+d – stany przekaźników podnapięciowych (1 – jest napięcie (true)) c, d – stany odłączników transformatorów (1 – zamknięty) e – stan odłącznika sekcyjnego (1 – zamknięty) x – sygnał otwierania odłącznika transformatora I (1 – otwieranie) z – sygnał zamykania odłącznika sekcyjnego (1 – zamykanie). Narysuj schemat złożony z dowolnych bramek i zweryfikuj go. 12. Udowodnij formalnie, że następujące dwa układy kombinacyjnie nie generują identycznych wyjść. b a c a c Y Y d 13. Górny moduł wyświetlacza 7-segmentowego jest zapalany zgodnie z funkcją x = ab d + acd + bcd + abc Zaproponuj układ złożony z multipleksera 4:1 i bramek, który zrealizuje taką funkcję. Wykaż formalnie jego poprawność. -9-