9 Esempi di Model Checking Usando LTL e CTL 9.1 Il forno a micro-onde Questo esempio è proposto in E. M. Clarke, O. Grumberg and D. A. Peled. Model Checking. The MIT Press e nelle dispense di Massimo Franceschet A crash course on model checking disponibili on-line. Consideriamo la seguente descrizione del comportamento di un forno a micro onde: per cuocere il cibo nel forno, aprire la porta, inserirvi il cibo e chiudere la porta. Non mettere contenitori metallici nel forno. Premere il bottone Start. Il forno si scalderà per 30 secondi, quindi comincerà la cottura. Al ternime della cottura il forno si spegne. Il forno si spegne anche nel caso in cui durante la cottura la porta venga aperta. Se il forno è avviato mentre la porta è aperta si produce un errore ed esso non si scalderà. In tal caso il bottone Reset può essere usato. To cook food in the oven, open the door, put the food inside, and close the door. Do not put metal containers in the oven. Press the start button. The oven will warmup for 30 seconds, and then it will start cooking. When the cooking is done, the oven will stop. The oven will stop also whenever the door is opened during cooking. If the oven is started while the door is open, an error will occur, and the oven will not heat. In such a case, the reset button may be used. Si consideri il seguente sistema di transizione per la specifica del forno a microonde M = S,,L: S = {α 0,...,α 6 }; = { (α 0,α 1 ), (α 0,α 3 ), (α 1,α 2 ), (α 2,α 1 ), (α 2,α 3 ), (α 3,α 0 ), (α 3,α 4 ), (α 4,α 5 ), (α 5,α 6 ), (α 6,α 0 ), (α 6,α 3 ), (α 6,α 6 ) }; L(α 0 )=, L(α 1 )={Start,Error}, L(α 2 )={Start,Close,Error}, L(α 3 )={Close}, L(α 4 )={Start,Close}, L(α 5 )={Start,Close,Heat}, L(α 6 )={Close,Heat}. Verifichiamo quali stati soddisfano le seguenti specifiche formalizzate come formule della logica CTL: 1. se il forno è caldo allora la porta è chiusa: AG (Heat Close). Svolgimento: stabiliamo prima di tutto quali stati soddisfano le formule proposizionali: Heat N N N N N Y Y Close N N Y Y Y Y Y Heat Close Y Y Y Y Y Y Y Ricordiamo che, per il significato di AG, una formula del tipo AG H è soddisfatta in uno stato α se α soddisfa H e tutti gli stati immediati successori di α soddisfano la formula AG H. In altri termini: uno stato non può soddisfare AG H senza soddisfare H. Quindi, gli stati che soddisfano AG H sono un sottoinsieme di quelli che soddisfano H. 47
Chiamiamo stati candidati quelli che non abbiamo ancora escluso possano soddisfare AG H. Nel nostro caso la formula H coincide con la formula Heat Close. Quindi gli stati candidati a soddisfare AG (Heat Close) sono tutti gli stati: AG (Heat Close) Y Y Y Y Y Y Y Partendo da α 0, vediamo che per ciascuno degli stati candidati a soddisfare AG (Heat Close) vale che tutti i suoi successori immediati sono anch essi stati candidati a soddisfare AG (Heat Close). Quindi nessuno tra α 0,...,α 6 cambia il proprio status di stato candidato a soddisfare AG (Heat Close). Dato che nulla è cambiato durante l iterazione concludiamo che tutti gli stati soddisfano AG (Heat Close). 2. Ogni volta che il bottone di avvio (Start) è premuto, è garantito che il forno si scalderà: AG (Start AF Heat). Svolgimento: Procediamo stabilendo quali stati soddisfano le sottoformule di AG (Start AF Heat). Ricordiamo che, per il significato di AF, se uno stato α soddisfa H oppure tutti gli stati immediatamente raggiungibili da α soddisfano AF H, allora α soddisfa AF H. In altri termini: gli stati che soddisfano H sono un sottoinsieme di quelli che soddisfano AF H, perchè a quelli che soddisfano H vanno aggiunti quelli per cui tutti gli immediati successori AF H. In base a quanto abbiamo stabilito per Heat nel punto precedente abbiamo che α 5 e α 6 sono due stati che soddisfano AF Heat e che costituiscono un sottoinsieme degli stati che soddisfano AF Heat. Data quindi AF Heat N N N N N Y Y facciamo una iterazione sulla tabella per vedere se tra gli stati ve ne sia qualcuno i cui successori immediati soddisfano AF Heat. Lo stato α 4 ha questa caratteristica, quindi aggiorniamo la tabella come segue: AF Heat N N N N Y Y Y Una ulteriore iterazione non porta alcun cambiamento alla tabella. Abbiamo quindi stabilito quali stati soddisfano AF Heat. Possiamo immediatamente stabilire quali stati soddisfano Start AF Heat: Start N Y Y N Y Y N AF Heat N N N N Y Y Y Start AF Heat Y N N Y Y Y Y Da questo risultato possiamo partire per stabilire quali stati soddisfano AG (Start AF Heat). Seguendo il ragionamento fatto al punto precedente gli stati che soddisfano AG (Start AF Heat) sono un sottoinsieme di quelli che soddisfano Start AF Heat che fungono da stati candidati: AG (Start AF Heat) Y N N Y Y Y Y 48
Mostriamo che nessuno stato soddisfa AG (Start AF Heat): lo stato α 0 non soddisfa AG (Start AF Heat) perchè tra i suoi immediati successori vi è α 1 che non soddisfa AG (Start AF Heat). Quindi la tabella viene aggiornata come segue: AG (Start AF Heat) N N N Y Y Y Y Un altro stato candidato a soddisfare AG (Start AF Heat)èα 3, il quale non soddisfa AG (Start AF Heat) perchè non la soddisfa il suo immediato successore α 0. Quindi la tabella viene aggiornata come segue: AG (Start AF Heat) N N N N Y Y Y Lo stato α 4 resta candidato a soddisfare AG (Start AF Heat)perchèα 5, l unico suo successore, soddisfa AG (Start AF Heat). Analogamente, α 5 resta candidato perchè il suo unico immediato successore α 6 è candidato a soddisfare AG (Start AF Heat). Infine, scopriamo che α 6 non soddisfa AG (Start AF Heat) perchè esiste un suo successore immediato, α 0 per esempio, che non soddisfa AG (Start AF Heat). Al termine di questa iterazione la tabella è: AG (Start AF Heat) N N N N Y Y N Dato che durante l iterazione abbiamo fatto dei cambiamenti facciamo una nuova iterazione. Restano due stati candidati: α 4 e α 5. Lo stato α 4 non richiede alpcun aggiornamento, invece α 5 non è più candidato perchè adesso abbiamo scoperto che α 6 non soddisfa AG (Start AF Heat). La tabella risulta quindi AG (Start AF Heat) N N N N Y N N Dato che abbiamo fatto un aggiornamento facciamo una nuova iterazione. L unico candidato è α 4. Dato che il suo successore α 5 non soddisfa AG (Start AF Heat) otteniamo che neppure α 4 soddisfa la formula. Perveniamo quindi al risultato AG (Start AF Heat) N N N N N N N Quindi nessuno stato soddisfa AG (Start AF Heat) che interpretiamo come il fatto che è falso che in ogni caso premendo il pulsante di avvio del forno di sicuro questo prima o poi si scalda. 3. Ogni volta che il forno è correttamente avviato esso prima o poi si scalda: AG ((Start Error) AF Heat). 49
Svolgimento: Abbiamo già stabilito in quali stati è valida AF Heat, è quindi facile ricavare i fatti riportati nella seguente tabella Start N Y Y N Y Y N Error N Y Y N N N N Error Y N N Y Y Y Y Start Error N N N N Y Y N AF Heat N N N N Y Y Y (Start Error) AF Heat Y Y Y Y Y Y Y A questo punto dato che tutti gli stati soddisfano (Start Error) AF Heat, segue immediatamente che tutti gli stati soddisfano AG ((Start Error) AF Heat). 4. Ogni volta che avviene un errore, sarà sempre possibile cucinare: AG (Error EF Heat). Svolgimento: Abbiamo già stabilito in un punto precedente quali stati soddisfano Heat: Heat N N N N N Y Y Per il significato di EF, se uno stato α soddisfa H, allora soddisfa EF H. Inoltre, tutti gli stati che raggiungono α anch essi soddisfano EF H. Quindi gli stati che soddisfano H sono un sottoinsieme di quelli che soddisfano EF H. In base a quanto abbiamo stabilito nel punto precedente abbiamo che α 5 e α 6 sono due stati che soddisfano EF Heat e che costituiscono un sottoinsieme degli stati che soddisfano EF Heat. Altri stati che soddisfano EF Heat sono quelli che raggiungono almeno uno tra α 5 e α 6. Data quindi EF Heat N N N N N Y Y facciamo una iterazione sulla tabella per vedere se tra gli stati ve ne sia qualcuno che abbia α 5 o α 6 come successori. Lo stato α 4 ha questa caratteristica, quindi aggiorniamo la tabella come segue: EF Heat N N N N Y Y Y Facciamo una ulteriore iterazione che consiste nello stabilire se esiste qualche stato che abbia α 4 o α 5 o α 6 come successore immediato. Scopriamo che α 3 ha come sucecssore immediato α 4, quindi la tabella viene aggiornata come segue: EF Heat N N N Y Y Y Y 50
Facciamo una ulteriore iterazione a partire da α 0 e aggiorniamo la tabella come segue: EF Heat Y N Y Y Y Y Y perchè sia α 0 che α 2 hanno come successore α 3. Infine con una ulteriore iterazione otteniamo EF Heat Y Y Y Y Y Y Y perchè α 1 ha come successore α 2. A questo punto per il significato di e AG è immediato ottenere EF Heat Y Y Y Y Y Y Y Error EF Heat Y Y Y Y Y Y Y AG (Error EF Heat) Y Y Y Y Y Y Y 9.2 Contatore Modulo 4 Questo esempio è tratto da C. Baier J. Katoen. Principles of Model Checking. The MIT Press Cambridge. Un contatore modulo 4 è costruito in modo da emettere in output 1 ogni 4 cicli, 0 altrimenti. Il contatore è costruito usando due registri binari r 1 e r 0 ed il valore assunto dal contatore è dato da i =2r 1 + r 0. Il valore di i è incrementato di 1 mod 4 ad ogni ciclo. Il contatore emette in output il valore 1 quando i vale 0. Esprimere in LTL le seguenti specifiche, dove le variabili proposizionali r i esprimono le proposizioni il registro r i contiene 1 e y la proposizione il valore in output è 1: 1. Il contatore emette 1 infinitamente spesso. Svolgimento: GFy. 2. Ogni volta che il contatore emette 1, i vale 0 e viceversa. Svolgimento: G (y r 1 r 0 ). 3. Ogni volta che il contatore emette 1, nei successivi tre stati esso emette 0. Svolgimento: G (y (X y XX y XXX y). 4. Vale sempre che entro 4 cicli il contatore emette 1. Svolgimento: G (y X y XXy XXXy). Nota che le ultime due formule messe assieme indicano che esattamente ogni 4 cicli viene emesso un 1. 5. Ogni volta che i vale 0, nel successivo stato i vale 1. Svolgimento: G (y X ( r 1 r 0 )); 51
9.3 Semaforo stradale Consideriamo di voler specificare il comportamento di un semaforo semplificato, il quale ha tre luci di colore verde, giallo e rosso. In ogni momento del funzionamento del semaforo solamente una delle tre luci è accesa. Il semaforo le accende ciclicamente in sequenza. Introduciamo tre variabili proposizionali verde, giallo e rosso una per ciascuna luce che può essere accesa o spenta. Esprimere in LTL le seguenti specifiche: 1. La luce verde si accende infinitamente spesso. Svolgimento: GFverde; 2. ogni volta che la luce è gialla, nello stato immediatamente successivo la luce è rossa. Svolgimento: G (gialla X rossa); 3. ogni volta che la luce è gialla, nel futuro prima o poi diventa rossa e nel frattempo è rimasta gialla: G (gialla X (gialla U rossa)); 4. Accensione in sequenza delle luci: Svolgimento: G ((gialla X rossa) (rossa X verde) (verde X gialla)). Un semaforo che rispetti questa specifica cambia colore delle luci per ogni transizione, cioè nel sistema di transizione non possono esistere due stati consecutivi con la medesima luce accesa. Una specifica più permissiva: 5. Accensione in sequenza delle luci (versione con durata finita ma arbitraria): G ((gialla X (gialla U rossa)) (rossa X (rossa U verde)) (verde X (verde U gialla))) 52