Bon après-midi,Alliage - Traitement de quantificateurs universels illimités
J'ai rencontré un problème avec Alloy lorsque je traitais des quantificateurs universels non bornés. Comme expliqué dans le livre 'Software Abstractions' de Daniel Jackson (Section 5.3 'Unbounded Universal Quantifiers'), Alloy a une limitation subtile concernant les quantificateurs universels et la vérification des assertions. Alliage produit des contre-parasites dans certains cas, comme la suivante pour vérifier que les ensembles sont fermés par union (montré dans le livre mentionné ci-dessus):
sig Set {
elements: set Element
}
sig Element {}
assert Closed {
all s0, s1: Set | some s2: Set |
s2.elements = s0.elements + s1.elements
}
check Closed for 3
La production d'un contre-exemple:
Set = {(S0),(S1)}
Element = {(E0),(E1)}
s0 = {(S0)}
s1 = {(S1)}
elements = {(S0,E0), (S1,E1)}
où l'analyseur n'a pas peuplé Set avec suffisamment de valeurs (un atome Set absent, S2, contenant l'union de S0 et S1).
Deux solutions à ce problème général sont alors suggéré dans le livre:
1) Déclarer un axiome de générateur de force en alliage pour générer tous les cas possibles. Par exemple:
fact SetGenerator{
some s: Set | no s.elements
all s: Set, e: Element |
some s': Set | s'.elements = s.elements + e
}
Cette solution, cependant, produit une explosion de portée et peut également conduire à des incohérences.
2) Omettre l'axiome du générateur et utiliser la forme bornée universelle pour les contraintes. Autrement dit, l'expression englobante de la variable quantifiée ne mentionne pas les noms des signatures générées. Cependant, toutes les assertions ne peuvent pas être exprimées sous une telle forme.
Ma question est: existe-t-il une règle spécifique pour choisir l'une de ces solutions? Ce n'est pas clair pour moi du livre.
Merci.
Merci Daniel. L'exemple que j'ai en tête est un modèle comportemental, non défini explicitement comme un ensemble d'états, mais défini avec les règles qui conduisent à ces états. Ce que j'essaie de faire est de vérifier les assertions incluant les quantificateurs universels sur ces états (par exemple, le prédicat 'p' est toujours satisfait pour chaque état généré). –
Après quelques modifications, j'ai été capable de transformer les assertions en utilisant des quantificateurs universels en prédicats en utilisant des quantificateurs existentiels, et cela semble fonctionner correctement. Merci encore! –