O metodach weryfikacji formalnej
Transkrypt
O metodach weryfikacji formalnej
O metodach weryfikacji formalnej Poprawność składniowa Czy specyfikacja jest zgodna z regułami składniowymi danego języka? Poprawność semantyczna Czy specyfikacja opisuje właściwie dziedzinę/system? Metody weryfikacji Dowodzenie twierdzeń Weryfikacja modelowa Przykład – Dowodzenie twierdzeń Wydziały mogą grupować w sobie mniejsze wydziały (podwydziały), tworząc strukturę hierarchiczną. Każdy podwydział ma tylko jeden swój wydział nadrzędny [...] 0..* Wydział jest podwydziałemI 1 Pytanie Czy ta specyfikacja jest poprawna? W – skończony zbiór wydziałów R – relacja „ jest podwydziałem” R ⊆W ×W ∀w ∈ W · |{ y : wRy }| = 1 ∀x ∈ W · ¬xRx (przeciwzwrotność) ∀x, y , z ∈ W · xRy ∧ yRz ⇒ xRz (przechodniość) Pytanie Czy W 6= ∅ ? (może istnieć jakiś wydział) 1 Każdy ciąg w1 , w2 , .. taki że wi Rwi+1 jest różnoelementowy 2 Niech w1 , ..., wn będzie najdłuższy 3 |{ y : wn Ry }| = 1 czyli istnieje wn+1 takie że wn Rwn+1 Sprzeczność Przykład – Weryfikacja modelowa void AC controller() { string msg; int is_room_hot=0; /* w pokoju nie jest gorąco */ int is_door_closed=1; /* drzwi zamknięte */ int ac=0; /* klimatyzacja wyłączona */ while (1) { msg=get_message_from_queue(); if (msg=="room_is_hot") is_room_hot = 1; if (msg=="room_is_cool") is_room_hot = 0; if (msg=="open_door") { is_door_closed = 0; ac=0; }; if (msg=="close_door") { is_door_closed = 1; if (is_room_hot) ac = 1; }; }; } h – gorąco, c – drzwi zamknięte, a – włączona klimatyzacja stan początkowy: h = 0, c = 1, a = 0 room is hot → h = 1 open door → c = 0, a = 0 room is cool → h = 0 close door → c = 1, if (h) a = 1 Pytania Czy zawsze (h = 1 ∧ c = 1 ⇒ a = 1) ? Czy zawsze (a = 1 ⇒ c = 1) ? open door start h=0 c=1 a=0 h=0 c=0 a=0 room is hot room is hot h=1 c=1 a=0 h=1 c=0 a=0 close door h=1 c=1 a=1