Vérification de la validité d’un prédicat à l’aide de la liste exhaustive des valeurs de ses variables libres
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 :
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 :
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.