# Vérification de modèles

En informatique, la vérification de modèles, ou model checking en anglais, est le problème suivant : vérifier si le modèle d'un système (souvent informatique ou électronique) satisfait une propriété. Par exemple, on souhaite vérifier qu'un programme ne se bloque pas, qu'une variable n'est jamais nulle, etc. Généralement, la propriété est écrite dans un langage, souvent en logique temporelle. La vérification est généralement faite de manière automatique. Sur le plan pratique, la vérification de modèles est devenue, au niveau industriel, la méthode de vérification de code et de systèmes matériels la plus populaire et la plus utilisée aujourd'hui.

## Histoire

La vérification de modèles s'appuie sur la logique temporelle dont l'un des pionniers est Amir Pnueli, qui reçut le prix Turing en 1996 pour « […] seminal work introducing temporal logic into computing science » (« […] travaux fondateurs qui introduisent la logique temporelle en informatique »). Le model checking commence avec les travaux d'Edmund M. Clarke, E. Allen Emerson$^,$$^,$, Jean-Pierre Queille et Joseph Sifakis au tout début des années 1980. Clarke, Emerson et Sifakis se sont vu attribuer le prix Turing 2007 pour leurs travaux sur le model checking$^,$.

## Description

Dans cette section, on précise ce que l'on entend par modèle et propriété puis par le problème de model checking.

### Modèle

Le système est modélisé par un système de transition d'états. Il s'agit d'un graphe orienté : un sommet représente un état du système et chaque arc représente une transition, c'est-à-dire une évolution possible du système d'un état donné vers un autre état. Chaque état du graphe orienté est étiqueté par l'ensemble des propositions atomiques vraies à ce point d'exécution (par exemple, i=2, le processeur 3 est en attente, etc.). Un tel graphe est aussi appelé une structure de Kripke.

#### Exemple du distributeur de boissons

On donne ici l'exemple d'un distributeur de boissons qui peut être dans 4 états : attente d'une pièce de monnaie, sélection d'une boisson, distribution d'une bouteille d'eau minérale et distribution d'une bouteille de jus d'orange.

#### Exemple de l'ascenseur

L'état du système est décrit par le niveau courant de l'ascenseur entre 0 et 3, l'état des appels (4 boutons, un par étage) et si l'ascenseur bouge et s'il patrouille vers le haut ou vers le bas (il y a donc 4 × 2⁴ × 2 × 2 = 256 états).

### Propriété

La propriété à vérifier est écrite par une formule de logique temporelle. Par exemple, si l'on souhaite vérifier que x = 0 une infinité de fois, on peut écrire la formule GF(x = 0) qui se lit « toujours, dans le futur, x = 0 ». On distingue :
* les propriétés de sécurité (safety en anglais), comme « l'ascenseur bouge toujours avec les portes fermées » ;
* les propriétés de vivacité (liveneness en anglais), comme « si l'ascenseur est appelé à un certain étage, alors il ira à cet étage ».
Dwyer et al. ont identifié 55 types de spécification en logique temporelle linéaire qui apparaissent dans des applications industrielles.

#### Exemple du distributeur de boissons

Par exemple, (GFa → (G(s → F(e ou j))) (si la machine attend une infinité de fois une pièce, alors toujours, dès que l'on sélectionne une boisson, dans le futur, une boisson (eau minérale ou jus d'orange) est délivrée) est une propriété vraie pour le distributeur de boissons.

### Problème du model checking

L'entrée du problème du model checking est un modèle (typiquement un système de transition d'états) et une propriété (typiquement écrite dans une logique temporelle). En sortie, on souhaite savoir si la propriété est vérifiée et, le cas échéant, un contre-exemple d'une exécution du système qui falsifie la propriété.

## Algorithmes
### Méthodes explicites

Pour des propriétés de sûreté (toujours, p est fausse), on peut faire un parcours en profondeur du graphe et vérifier que chaque état vérifie p. Des algorithmes d'étiquetage existent pour la logique temporelle arborescente (en) (CTL). D'autres méthodes sont fondées sur les automates. On transforme la négation de la formule à vérifier en un automate puis on fait le produit cartésien synchrone de l'automate et du modèle. On se ramène alors à tester si le langage de l'automate produit est vide ou non.

### Méthodes symboliques

Parcourir (ou énumérer) explicitement tous les mondes de la structure de Kripke peut être coûteux, c'est pourquoi des méthodes symboliques, introduites par Ken McMillan et Ed Clarke,sont plus pertinentes. Une approche, répandue pour la vérification de propriétés exprimées dans la logique temporelle arborescente, est fondée sur la représentation symbolique du modèle. De nombreuses méthodes de représentation d'ensembles d'états ont vu le jour. La plus connue utilise les diagrammes de décision binaire (BDD).

## Discussions
### Model checking borné

Au lieu de considérer l'ensemble des traces d'exécution du système, on peut se limiter à des traces finies, de longueur bornée : c'est le model checking borné. L'existence d'une trace vérifiant une certaine propriété est équivalente à la satisfiabilité d'une certaine formule booléenne. En effet, si un état du système est décrit par un k-uplet ${\vec {x}}$ de booléens, et que l'on s'intéresse aux traces de longueur bornée par un certain n, on se ramène au problème de la satisfiabilité d'une formule propositionnelle (problème SAT). Plus précisément, si une formule $I$ identifie les états initiaux du système, une formule $F$ les états dont on veut tester l'accessibilité, et une formule $T$ est une relation de transition, alors on considère la formule booléenne $I({\vec {x}}_{1})\wedge T({\vec {x}}_{1},{\vec {x}}_{2})\wedge \dots \wedge T({\vec {x}}_{n-1},{\vec {x}}_{n})\wedge F({\vec {x}}_{n})$ où ${\vec {x}}_{i}$ sont des propositions atomiques qui représentent l'état à l'étape i de l'exécution du système. Il existe divers logiciels, appelés solveurs SAT, qui peuvent décider « efficacement en pratique » le problème SAT. De plus, ces logiciels fournissent habituellement un exemple de valuation satisfaisant la formule en cas de succès. Certains peuvent produire des éléments d'une preuve de non-satisfiabilité en cas d'échec.
Une évolution récente est l'ajout, en sus de variables booléennes, de variables entières ou réelles. Les formules atomiques ne sont alors plus seulement les variables booléennes, mais des prédicats atomiques sur ces variables entières ou réelles, ou plus généralement des prédicats pris dans une théorie (par exemple $x<5$, etc.). On parle alors de satisfiabilité modulo une théorie (par exemple, on pourra considérer comme prédicats atomiques les égalités et inégalités linéaires).

### Autres modèles

Le modèle peut être plus riche que des automates finis. Il existe par exemple du model checking sur des automates temporisés. Aussi, le concept de model checking se généralise en logique mathématique. Par exemple, la vérification de structures avec une formule de la logique du premier ordre est PSPACE-complet ; de même pour une formule de la logique monadique du second ordre. La vérification de structures automatiques avec une formule du premier ordre est décidable.

### Abstraction

Des techniques comme CEGAR (Counterexample-Guided Abstraction Refinement, « raffinement de l'abstraction guidé par les contre-exemples ») permettent de transformer un programme (écrit en C par exemple) en un modèle abstrait puis de raffiner successivement le modèle s'il est trop grossier.

### Logiques temporelles

Il existe plusieurs logiques temporelles : LTL, CTL, CTL* ou le mu-calcul.

### Logique pour les systèmes multi-agents

Dans les systèmes multi-agents, on s'intéresse à des propriétés épistémiques comme « l'agent sait que x = 0 » d'où l'utilisation de logique épistémique et de logiques qui mélangent logique temporelle et épistémique. On s'intéresse à raisonner sur l'existence de stratégies dans un jeu : il existe des logiques pour écrire des propriétés sur les jeux comme « l'agent a une stratégie pour qu'un jour x = 0 » (alternating-time temporal logic (en)).

## Outils

* alloy ;
* ARC ;
* uPPAAL ;
* APMC ;
* cADP ;
* csml, Mcb ;
* cWB ;
* loTREC ;
* smv ;
* spin$^,$ ;
* spot ;
* nuSMV ;
* tina ;
* ROMEO.
* PAT
Depuis 2011, les outils qui le souhaitent participent au Model Checking Contest (MCC), compétition internationale scientifique permettant de comparer les performances des « model checkers » sur différents types de calculs.

## Complexité

Un aspect important de la recherche en model checking est de démontrer qu'une certaine classe de propriétés, ou une certaine logique, est décidable, ou que sa décision appartient à une certaine classe de complexité. La table suivante indique les complexités du model checking pour les trois logiques temporelles LTL, CTL et CTL*. La quantité |M| est la taille du modèle représenté explicitement. La quantité |φ| est la taille de la spécification en logique temporelle. La complexité de programme évalue la complexité du model checking lorsque la formule temporelle est fixée.
| Logique temporelle | Complexité temporelle d'un algorithme | Complexité du model checking | Complexité de programme du model checking |
| LTL | O(|M| ×2$^{|φ|}$) | PSPACE-complet | NLOGSPACE-complet |
| CTL | O(|M| ×|φ|) | P-complet | NLOGSPACE-complet |
| CTL* | O(|M| ×2$^{|φ|}$) | PSPACE-complet | NLOGSPACE-complet |
Orna Kupferman et Moshe Y. Vardi ont introduit le problème du model checking de systèmes ouverts, abrégé en module checking. En module checking, l'entrée du problème est un système de transition où certains états sont contrôlés par le système proprement dit, et d'autres sont contrôlés par l'environnement. Une propriété temporelle est vraie dans un tel système de transition si elle est vraie quels que soient les choix de l'environnement. Plus précisément, étant donné un système de transition M, on considère son dépliage V$_M$, qui est un arbre infini. Une propriété est vraie dans ce système si elle est vraie dans tout arbre obtenu en élaguant/supprimant de V$_M$ certains sous-arbres dont la racine est un successeur d'un état contrôlé par l'environnement. Pour le module checking, Orna Kupferman et Moshe Y. Vardi ont montré que les complexités atteignent celle du problème de satisfiabilité dans les logiques correspondantes :
| Logique temporelle | Complexité du module checking | Complexité de programme du module checking |
| LTL | PSPACE-complet | NLOGSPACE-complet |
| CTL | EXPTIME-complet | P-complet |
| CTL* | 2EXPTIME-complet | P-complet |
Allur et al. ont étudié le model checking avec une extension de CTL et CTL* pour raisonner sur des stratégies dans un système multi-agent. La table suivante donne les résultats de complexité pour le model checking sur ATL et ATL*.
| Logique temporelle | Complexité du model checking | Complexité de programme du module checking |
| ATL | P-complet | NLOGSPACE-complet |
| ATL* | 2EXPTIME-complet | P-complet |
Comme le signalent Allur et al., le problème de model checking d'ATL* est proche du problème de synthèse LTL qu'ont développé Pnueli et Rosner, lui 2EXPTIME-complet également.

## Algorithmes efficaces

Un autre aspect de la recherche en model checking est de rechercher des algorithmes efficaces sur des cas intéressants en pratique, de les implémenter, et de les appliquer à des problèmes réels.