Sous-sections
Participants : Michaël Kerboeuf,
Sylvain Kerjean, Michel Le Borgne, Paul Le Guernic, Hervé
Marchand, Mirabelle Nebut, Sophie Pinchinat, Jean-Pierre
Talpin.
Mots clés : vérification, Sigali,
système dynamique polynomial, Signal, génération d'automate,
bisimulation, méthode symbolique, calcul d'horloges, système
logique, sémantique synchrone, Coq, co-induction, preuve de
théorème .
Résumé :
Dans le cadre de la vérification des programmes, nous
avons défini différents types d'équivalences
comportementales pour les systèmes dynamiques polynomiaux.
Des algorithmes symboliques pour le calcul de bisimulations
ont été proposés et implémentés dans Sigali. Nous avons
d'autre part réalisé une étude de cas mettant en oeuvre
conjointement un langage de programmation synchrone,
Signal, et un assistant de preuve de théorèmes, Coq, en
considérant le problème de la chaudière à vapeur (
steam boiler). Dans le cadre de la compilation des
programmes, nous visons à améliorer significativement la
synthèse du contrÔle des programmes Signal par la prise en
compte des relations numériques. Pour cela, une
exploitation de l'interprétation plus fine des définitions
d'horloges a été réalisée.
Sigali : plate-forme de vérification basée sur les
automates
Nous avons poursuivi le développement des méthodes de
vérification basées sur les automates. L'approche est basée
sur des modèles comportementaux intensionnels (encore
appelés symboliques ou implicites), obtenus par abstraction
booléenne à partir des spécifications en langage Signal. Nous
nous sommes particulièrement intéressés à la notion
d'abstraction d'automates [27] que ce soit abstraction par fusion
d'états ou abstraction par restriction. Ces
techniques d'abstraction ont été également utilisées dans le
cadre de la synthèse de contrÔleurs [25] (voir section 6.5). Actuellement,
nous cherchons à intégrer les différents algorithmes de
synthèse et de vérification dans la «plate-forme» Signal.
Cette «API» permettra à terme de diffuser plus
largement nos techniques de vérification et de synthèse de
contrÔleur dans une philosophie «open», c-à-d. ouverte à
d'autres langages de spécification. En particulier nous
visons la généralisation de nos algorithmes pour qu'ils
«acceptent» d'autres représentations internes que celle que
nous utilisons (les «Ternary Decision Diagrams»), et souvent
plus standards (e.g., des packages de «Binary
Decision Diagrams»), toujours dans l'optique d'une plus large
diffusion de nos méthodes.
Preuves co-inductives de systèmes réactifs
L'intérêt de l'utilisation combinée de Signal et de
l'assistant de preuve Coq pour la conception des systèmes
réactifs a pu être illustré sur un exemple concret et non
trivial : le problème du steam boiler [21]. Cette étude de cas a permis de révéler
certains avantages de l'approche formelle Signal-Coq. En
particulier, la spécification est indépendante de toute
considération de vérification. Le langage logique sur lequel
est fondé Coq (le calcul des constructions inductives) est
bien plus expressif que la logique booléenne de la plupart
des model-checkers. Ainsi, Coq permet de s'affranchir des
contraintes portant sur les propriétés paramétrées ou portant
sur des valeurs numériques non linéaires, auxquelles la
vérification par model-checking est confrontée. En outre,
l'utilisation de Coq permet d'acquérir une connaissance
profonde de la spécification Signal et permet, à l'instar des
contre-exemples fournis par un model-checker, de cibler
précisément l'erreur en cas d'échec de la vérification.
L'utilisation naturelle et intuitive de la co-induction
confirme la pertinence du choix de cet outil pour modéliser
les flots de données.
Calcul d'invariants de programmes flot de données
synchrones
Le calcul d'invariants de programmes utilisé dans la
compilation de programmes Signal repose principalement sur
une abstraction booléenne (statique) des programmes. Elle
s'appuie sur une représentation symbolique des expressions
booléennes d'horloges et conduit au calcul d'une hiérarchie
de laquelle on pourra, par exemple, générer du code. Les
techniques développées s'avèrent très efficaces, mais
l'abstraction utilisée montre ses limites en particulier
quand le contrÔle du programme dépend de conditions
numériques. Afin d'apporter une solution à cette limitation
on peut, en restant dans le cadre d'un système de résolution
unique, introduire des règles d'inférence issues de
propriétés de certains opérateurs (par exemple les propriétés
d'une relation d'ordre comme cela a été fait dans le
compilateur) ou élargir les domaines d'abstraction à des
domaines finis (nous expérimentons actuellement un calcul
d'intervalles). Une solution plus générale consiste à
permettre d'adjoindre au calcul d'horloges un système de
résolution sur des ensembles infinis et à gérer les
interactions en conservant les bénéfices du calcul d'horloges
(contrairement à l'approche de [BJT99], qui traite les valeurs en encodant
l'absence d'un signal par une valeur spéciale, mais ne tire
pas parti de l'efficacité de la structure hiérarchique).
Pour ce faire, nous avons proposé une extension non
triviale du langage des horloges qui permet de définir une
logique de spécification dont l'expressivité est celle d'un
programme Signal statique. Dans cette logique on peut énoncer
des formules de la forme R@h où R est une formule du premier ordre,
satisfaite sous la portée de l'horloge h, e.g.,
(y
0)@
signifie que «
quand le signal a est là
alors le signal y est (là
et) positif». La logique exprime plus généralement des
inclusions entre horloges.
L'étude de la logique est centrée autour de questions de
décidabilité : actuellement nous disposons d'un système de
déduction qui permet de montrer qu'une des horloges d'un
programme donné est vide. Nous sommes en train d'établir la
correction et la complétude de ce système. Une telle preuve
passe par la construction d'un modèle canonique
(hiérarchique) qui généralise le modèle utilisé pour la
compilation, et qui devrait permettre de décrire une
génération de code plus efficace que celle qui existe
aujourd'hui. Nos résultats devraient pouvoir être étendus à
une preuve de décidabilité d'un fragment important de la
logique, voire de toute la logique, lorsque le langage des
R est décidable.
L'intérêt de nos travaux est augmenté par leur caractère
très général : il nous semble tout à fait possible de traiter
n'importe quel type de formule R@h dès lors que les formules
R appartiennent à une
théorie décidable (e.g., l'arithmétique de Presburger) et que
les termes h sont des
éléments d'un treillis. Ainsi, nous pouvons voir nos
algorithmes comme des méta-algorithmes «instanciables» par
choix d'outils existants (e.g., l'outil OMEGA
pour Presburger). Ce travail théorique important devrait
déboucher sur un outil, sachant toutefois que les problèmes
d'efficacité n'ont pas encore été abordés.
Enfin, comme nous l'avons déjà indiqué, seules les
propriétés statiques sont traitées. Il faudra enrichir la
logique, par exemple en introduisant des modalités
temporelles, pour prendre en compte des aspects dynamiques
des programmes. Mais ce travail reste encore très prospectif,
surtout si on sait que le traitement de valeurs dans un
domaine infini (e.g., les entiers) conduit à des systèmes
d'états infinis.