4.30 ModelChecking

Vérification de la validité dun prédicat à laide de la liste exhaustive des valeurs de ses variables libres

Syntaxe

  mc
  mc(l)
avec l une liste d’au plus quatre éléments séparée par des | et tous distincts (leur ordre dans la liste n’ayant pas d’incidence sur le comportement de la commande). Ces éléments appartiennent à des catégories fonctionnelles différentes et permettent de spécifier le mode d’utilisation de la commande mc :

Utilisation

Cette commande permet d’effectuer des démonstrations par cas du but courant : elle divise la preuve pour chaque valeur des variables de résolution de la liste L (les domaines des variables, devant être bornés, étant, si possibles, inférés à partir des hypothèses).
Si la preuve initiale est : H     G
La preuve transformée par mc(x1,x2,...,xn) est :


 
  x1 = a1 & x2 = b1 & ... & xn = v1  
  =>  
  ([x1, x2, ...,  xn := a1, b1, ..., v1]H  
    =>  
   [x1, x2, ...,  xn := a1, b1, ..., v1]G)  
  &  
   ...  
  &  
  x1 = ai & x2 = bj & ... & xn = vk  
  =>  
  ([x1, x2, ...,  xn  := ai, bj, ..., vk]H  
    =>  
   [x1, x2, ...,  xn  := ai, bj, ..., vk]G)  
  &  
   ...  
  &  
  x1 = ap & x2 = bq & ... & xn = vr  
  =>  
  ([x1, x2, ...,  xn := ap, bq, ..., vr]H  
    =>  
   [x1, x2, ...,  xn  := ap, bq, ..., vr]G)  
 
 


Avec (ai,bj,...,vk) parcourant le produit cartésien des domaines de variation des variables x1, x2, ..., xn qui sont respectivement {a1, ..., ap}, {b1, ..., bq}, ..., {v1, ..., vr}.

Les domaines des variables ont été inférés à partir des hypothèses disponibles sur les variables de résolution et représentés par des ensembles en extension. Il est à noter ici que l’inféreur de domaine n’effectue pas de résolution de contraintes entre variables et est limité par la taille du domaine des variables : par exemple, ModelChecking échouera si on l’utilise sur une variable du type INT et sans aucune autre hypothèse suceptible de contraindre davantage le domaine de la variable.

Les hypothèses utilisées par l’inféreur de domaine sont typiquement les prédicats d’appartenance à un ensemble énuméré prédéfini tel que BOOL ou un ensemble énuméré défini dans la clause SETS, d’appartenance à un intervalle, d’appartenance à un ensemble d’entiers en extension, d’égalité et d’inégalité entre variables et valeurs, etc.

Deux options sont possibles :

Exemples

Soit l’obligation de preuve : bool(xx = 1) = yy, avec xx : {0,2} et yy = FALSE parmi les hypothèses.

La commande mc(_Step|xx,yy) provoque la transformation du but courant en :


 
    Hypothesis  
      ...  
      xx: {0,2}  
      yy = FALSE  
    Goal  
      xx = 2 & yy = FALSE  
       =>  
      bool(2=1) = FALSE  
 
 


L’utilisateur le démontre en utilisant pr et le prouveur génére le second cas :


 
    Hypothesis  
      ...  
      xx: {0,2}  
      yy = FALSE  
    Goal  
      xx = 0 & yy = FALSE  
       =>  
      bool(0=1) = FALSE  
 
 


La commande mc(_Auto) effectue les démonstrations des deux cas de manière totalement automatique :


 
Starting Model Checking in Automatic mode  
Case xx=2 & yy=FALSE proved  
Case xx=0 & yy=FALSE proved  
Proved by Model Checking  
 
 


Enfin, la commande mc(xx|_Step|Tac(None)|3) aurait généré en premier lieu le but suivant :


 
    Hypothesis  
      ...  
      xx: {0,2}  
      yy = FALSE  
    Goal  
      xx = 2  
       =>  
      bool(2=1) = yy  
 
 


Et ensuite, après utilisation de la commande pr :


 
    Hypothesis  
      ...  
      xx: {0,2}  
      yy = FALSE  
    Goal  
      xx = 0  
       =>  
      bool(0=1) = yy  
 
 


Il se peut enfin que l’utilisateur souhaite utiliser la commande ModelChecking sur une variable dont le domaine est trop grand. Soit donc le but suivant :


 
    Hypothesis  
      ...  
      xx: -15..25  
    Goal  
  toto(xx) = MTP  
 
 


L’utilisation de mc(_Step | 22 | xx), où l’on a spécifié un nombre maximum de valeurs de variables à 22, provoque l’affichage du message suivant :


 
Failure in Model Checking  
 
 


En effet le domaine de définition de la variable contient plus de 22 éléments.