Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Modéliser et vérifier avec Alloy

Après cette leçon: Je peux lire un contre-exemple d’Alloy, dessiné comme des personnes et leurs liens.

Leçon de 55 min5 commandesLab de méthodes formelles : Z3, SPIN, TLA+ et Alloy dans une VM

À quoi sert Alloy ?

Alloy est un langage pour décrire un système avec des ensembles et des relations. Son outil cherche un exemple ou un contre-exemple de petite taille. Quand une propriété est fausse, il montre la situation qui la contredit.

Dans une entreprise, chaque personne a au plus un chef. On affirme que personne n’est son propre chef, même de loin. Alloy cherche un groupe où ce n’est pas vrai.

À la fin de cette leçon

Remarque

Je peux lire un contre-exemple d’Alloy, dessiné comme des personnes et leurs liens.

Mots-clés

MotCe que ça veut direExemple
Ensemble (sig)un genre de choses du modèlePersonne
Relationdes liens entre les éléments de deux ensembleschef
Fait (fact)une règle que tout exemple doit respecter
Assertionune propriété qu’on veut vérifier
Instanceun exemple concret : des éléments et leurs liens
Portéele nombre maximal d’éléments que l’outil essaiefor 4

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un modèle est fait d’ensembles et de relations

Le modèle a un ensemble, Personne, et une relation, chef. Le mot lone veut dire « zéro ou un » : une personne a au plus un chef.

Un fait écarte les exemples qu’on refuse. Ici, personne n’est directement son propre chef. Les deux Runs écrivent le modèle dans essais.

Le modèle des personnes et de leur chef

Code: c
sig Personne { chef: lone Personne }

fact pas_son_propre_chef { no p: Personne | p.chef = p }

assert pas_de_boucle { no p: Personne | p in p.^chef }
check pas_de_boucle for 4

run exemple { some chef } for 3

Créer un dossier pour vos essais

Commande
mkdir -p essais

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Écrire le modèle dans un fichier

Commande
printf '%s\n' 'sig Personne { chef: lone Personne }' 'fact pas_son_propre_chef { no p: Personne | p.chef = p }' 'assert pas_de_boucle { no p: Personne | p in p.^chef }' 'check pas_de_boucle for 4' 'run exemple { some chef } for 3' > essais/chefs.als

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Une vérification cherche un contre-exemple

L’assertion dit que personne n’est son propre chef, même par plusieurs chefs de suite : p.^chef est tous les chefs de p, directs ou lointains. check demande à Alloy de chercher un contre-exemple avec au plus 4 personnes.

Pour un check, SAT veut dire qu’un contre-exemple existe, et UNSAT qu’il n’y en a pas. run cherche un simple exemple.

Lancer Alloy sur le modèle

Commande
alloy essais/chefs.als

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Exemple travaillé : le contre-exemple d’Alloy

PersonneA pour chefQue se passe-t-il ?
Personne$0Personne$2Le fait est respecté : personne n’est son propre chef direct
Personne$1Personne$0Le chef de Personne$1 est Personne$0
Personne$2Personne$1La boucle est fermée : Personne$0 est son propre chef de loin

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un fait plus fort écarte le contre-exemple

Le fait était trop faible. Il faut interdire les boucles de toute longueur : une personne ne doit pas se trouver parmi ses propres chefs, p in p.^chef.

Le Run remplace la règle du fait avec sed. Alors Alloy répond UNSAT pour le check : plus de contre-exemple. Le run répond toujours SAT.

Renforcer le fait

Commande
sed -i 's/p.chef = p/p in p.^chef/' essais/chefs.als

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Relancer Alloy et lire les deux résultats

Commande
alloy essais/chefs.als | head -n 2

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Erreur fréquente

Attention

Beaucoup de gens pensent que UNSAT prouve la propriété pour toute taille de groupe. Alloy ne cherche que jusqu’à la portée donnée, ici 4 personnes. UNSAT dit qu’il n’y a pas de contre-exemple de 4 personnes ou moins. Il reste vrai qu’un fait qui répète l’assertion rend la vérification inutile.

Pour aller plus loin

Faites une copie du modèle de départ, avec le fait p.chef = p, et changez check pas_de_boucle for 4 en check pas_de_boucle for 1. Lancez alloy sur la copie.

Dites ce que répond Alloy pour le check, puis pourquoi cette réponse ne prouve pas que la propriété est vraie.

À propos de ce labo et de sa source: Lab de méthodes formelles : Z3, SPIN, TLA+ et Alloy dans une VM

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.