V&V-Computational Tree Logic (CTL)
Computational Tree Logic (CTL)
Quando abbiamo voluto modellare proprietà temporali sulle computazioni infinite di un sistema, abbiamo introdotto LTL. LTL è una logica che descrive proprietà lungo una singola computazione (sequenza infinita di stati), utilizzando operatori temporali come Next XX), Until (U), Always (G), Eventually (F).
Tuttavia, LTL ha un limite: è in grado di modellare proprietà solo su un singolo percorso alla volta, e non permette di esprimere proprietà che coinvolgano tutti i possibili percorsi che partono da uno stato.
Per superare questo limite, è stata introdotta CTL, che permette di specificare proprietà che valgono su più rami di computazione. CTL estende LTL introducendo i quantificatori $A$ (tutti i percorsi) ed $E$ (esiste almeno un percorso), permettendo di esprimere proprietà globali sul comportamento del sistema.
Sintassi
Definiamo innanzitutto cosa sono:
- quantificatori di stato
- Until (U)
- neXt (X)
- quantificato di percorso
- All (A)
- Exist (E)
Da qui c’è una distinzione da fare sui tipi di formule:
-
Le formule di stato sono valutate in un singolo stato
- Una formula di stato dice se una proprietà è vera o falsa guardando solo lo stato attuale e le sue possibili evoluzioni future.
-
Esempio:
$p \to$ “la variabile p è vera in questo stato” $AFwin \to$ “Da questo stato, ogni possibile computazione porta a uno stato in cui win è vero”
-
Le formule di percorso sono valutate lungo un percorso
- Una formula di percorso specifica come una proprietà evolve lungo una singola computazione (o cammino) nel sistema.
-
Esempio:
$Fwin \to$”Lungo questo percorso, prima o poi si raggiunge uno stato in cui win è vero”
💡 Ma attenzione: Una formula di percorso non ha senso se non è associata a uno stato di partenza! Se dico solo $Fwin$, non sto specificando da quale stato parte questa computazione, quindi la formula non può essere valutata in modo chiaro in un modello CTL.
Perché aggiungere A o E trasforma una formula di percorso in una formula di stato?
Quando premettiamo A o E a una formula di percorso, stiamo specificando come quella proprietà si comporta a partire da un determinato stato, considerando tutti i possibili cammini o almeno uno di essi.
📌 Esempi concreti:
-
Formula di percorso (senza stato specificato):
-
$Gsafe \to$ “Sempre, lungo questo percorso, il sistema rimane sicuro.”
Il problema: Quale percorso? Da dove parte?
-
-
Formula di stato (con quantificatore di percorso):
-
$AGsafe \to$ “Da questo stato, ogni possibile computazione porterà sempre a stati sicuri.”
-
$EGsafe \to$ “Da questo stato, esiste almeno una computazione che rimane sempre in stati sicuri.”
Ora la formula ha senso in un modello!
-
📌 Differenza chiave:
$Gsafe \to$ Non è una formula valida in CTL, perché manca un riferimento a uno stato iniziale.
$AGsafe \to$ Formula di stato valida, perché possiamo verificarla partendo da uno stato specifico.
💡 Regola generale: Le formule di percorso descrivono proprietà lungo un singolo cammino. Le formule di stato descrivono proprietà valutabili in un singolo stato e includono un quantificatore di percorso per legare la proprietà all’intero sistema.
In generale bisogna ricordare che
- $P \in AP \Rightarrow P \text{ formula di stato}$
- $p,q \text{ formule di stato } \Rightarrow p\land q, p\lor q, \lnot p \text{ formule di stato}$
- $p \text{ formula di percorso}\Rightarrow Ap, Ep \text{ formule di stato}$
- $p,q \text{ formule di stato } \Rightarrow pUq, Xp \text{ formule di percorso}$
Strutture
Come in LTL anche in CTL abbiamo delle strutture. In questo caso abbiamo che $M = (S,R,L)$ dove:
- S è l’insieme degli stati
- $R \subseteq S\times S$
- L è la funzione di labeling
Semantica
Per le formule di stato la semantica è la seguente
- $M,s_0 \vDash P \iff P \in L(s_0)$
- $M,s_0 \vDash p\land q \iff M,s_0 \vDash p \land M,s_0 \vDash q$
- $M,s_0 \vDash p\lor q \iff M,s_0 \vDash p \lor M,s_0 \vDash q$
- $M,s_0 \vDash \lnot p \iff M,s_0 \nvDash p$
-
$M,s_0 \vDash Ep \iff \exists x = (s_0 , \dots) (M,x \vDash p)$
- $M,s_0 \vDash Ap \iff \forall x = (s_0, \dots) (M,x \vDash p)$
Mentre per le formule di percorso non ci accontentiamo di verificare il singolo stato, ma al contrario dobbiamo considereare tutta la computazione
- $M,x \vDash P \iff x=(s_0,\dots) \land M,s_0 \vDash p$
- $M,x \vDash p\land q \iff M,x \vDash p \land M,x\vDash q$
- $M,x \vDash p\lor q \iff M,x \vDash p \lor M,x \vDash q$
- $M,x \vDash \lnot p \iff M,x \nvDash p$
- $M,x \vDash pUq \Rightarrow \exists i(M,x(i)) \vDash q \land \forall j \lt i (M,x(j)\vDash p)$
- $M,x \vDash Xp \iff M,x(1) \vDash p$
Computational Tree Logic* (CTL*)
CTL* è una variante estesa di CTL che consente di utilizzare più di un simbolo di stato tra due di percorso.
CTL vs LTL
CTL e LTL sono due logiche temporali sostanzialmente differenti e con poteri espressivi diversi. In particolare
- CTL non è in grado di esprimere vincoli di fairness,
- LTL non è in grado di esprimere la vincoli di possibilità.