Vérification partielle de programmes de contrôle-commande

Transcription

Vérification partielle de programmes de contrôle-commande
R ECHERCHE
Vérification partielle de programmes
de contrôle-commande par interprétation
abstraite
Olivier Bouissou
CEA, LIST, Boîte courrier 94
F-91191 Gif-sur-Yvette cedex
[email protected]
L’analyse statique par interprétation abstraite cherche à sur-approximer l’ensemble
des comportements possibles des programmes pour s’assurer de l’absence de certains types de
bogues. Dans le cas des programmes de contrôle-commande, le comportement du programme
dépend de l’environnement extérieur avec lequel il interagit. Prendre en compte cet environnement, souvent largement sur-approximé dans les analyseurs, permet de prouver de nouvelles
propriétés concernant le programme de contrôle-commande. Dans cet article, nous nous intéressons à une classe de programme de contrôle-commande pour laquelle une description
de l’environnement physique existe sous forme d’équations différentielles. Nous décrivons de
nouvelles méthodes d’analyse de ces systèmes qui sur-approximent l’ensemble des trajectoires
possibles pour l’environnement continu, permettant ainsi de prouver, dans certains cas, des propriétés de sûreté sur l’algorithme de contrôle-commande.
RÉSUMÉ.
ABSTRACT. In
the field of static analysis, abstract interpretation based techniques compute over
approximations of the set of possible behaviors of programs. These over-approximations give
properties on the program that can be used to prove the abscence of some bugs. In the case
of control command programs, the behavior of the program depends on the physical environment with which it interacts. This environment is often largely over-approximated in classical
analyzers, taking it into account can lead to proving new properties conerning the controlcommand program. In this article, we consider a class of control-command programs for which
a description of the physical environment is given as a set of differential equations. We present
new analysis methods that over-approximate the set of possible trajectories for the continuous
environment. This allows to prove, in some cases, safety properties on the control-command
algorithm.
MOTS-CLÉS : analyse
KEYWORDS: static
statique, interprétation abstraite, systèmes hybrides, contrôle commande.
analysis, abstract interpretation, hybrid systems, control-command.
c 2012 Lavoisier
DOI:10.3166/TSI.31.337-373 Technique et science informatiques – no 3/2012, 337-373
338
TSI. Volume 31 – no 3/2012
1. Introduction
Les progrès de miniaturisation et d’encapsulation des composants électroniques
ont permis le déploiement à grande échelle de l’informatique dans les systèmes embarqués industriels, que ce soit dans le domaine de l’aéronautique, de l’automobile,
du ferroviaire ou encore du nucléaire. Si ce déploiement a permis d’augmenter fortement la sécurité de ces systèmes, il a induit de nouveaux risques liés aux défaillances
potentielles de ces programmes. En effet, les décisions critiques sont désormais souvent prises par un programme, et une erreur dans son fonctionnement peut avoir des
conséquences dramatiques. Pour vérifier l’absence de défaillances (ou bogues) d’un
programme, la théorie de l’analyse statique par interprétation abstraite (Cousot, Cousot, 1977 ; 1992a) utilise une notion de sur-approximation : on calcule pour chaque
variable du programme un ensemble contenant au moins toutes les valeurs qu’elle
peut prendre lors de l’exécution du programme. Ainsi, on pourra prouver l’absence
de certains types d’erreurs : si aucune de ces valeurs ne crée de division par zéro (par
exemple), cela signifiera qu’aucune exécution du programme ne pourra se terminer
par une division par zéro. Nous donnons en section 2.1 une introduction plus formelle
à l’interprétation abstraite. Remarquons cependant dès maintenant une des caractéristiques principales de cette technique : elle est par nature incomplète. En effet, prouver l’absence de bogues pour n’importe quel programme est indécidable. L’analyse
statique par interprétation abstraite ne pourra donc apporter la preuve de l’absence
d’un bogue que pour certains programmes. Dans les autres cas, il y aura une fausse
alarme, c’est-à-dire que l’analyse conclura à la présence potentielle d’un bogue alors
qu’il n’existe pas. Un des enjeux majeurs de l’interprétation abstraite est de réduire le
nombre de ces fausses alarmes. Les techniques que nous présentons dans cet article
souffrent du même problème, nous essayons de montrer tout au long de l’article où et
pourquoi ces fausses alarmes apparaissent.
Dans le cas de programmes de contrôle-commande embarqués, le calcul de la surapproximation des valeurs des variables est rendu plus complexe par les interactions
entre le programme et son environnement continu. En effet, ces programmes reçoivent
des données depuis un système physique via des capteurs et modifient la dynamique
de ce système via des actionneurs. Par exemple, pour un contrôleur automatique de
vitesse, les entrées sont fournies par un capteur indiquant la vitesse instantanée du véhicule, et le programme doit calculer la puissance moteur nécessaire pour atteindre et
maintenir la vitesse désirée. Ce type de programmes est donc très particulier : son comportement dépend fortement de l’environnement extérieur avec lequel il interagit, et il
n’est pas seulement nécessaire de s’assurer que le programme ne crée pas de bogues
(division par zéro par exemple) : il est également nécessaire de vérifier que l’environnement physique se comporte comme attendu. Par exemple, nous voulons prouver
que la vitesse du véhicule se stabilise à la vitesse désirée. Bien sûr, nous ne pouvons
pas vérifier cela sur l’environnement physique exact du système (pour un avion, cet
environnement serait l’atmosphère terrestre), nous choisissons donc un modèle de cet
environnement sous forme d’équations différentielles et nous vérifions que ce modèle
se comporte comme voulu. Nous n’étudions pas ici la pertinence du modèle par rap-
Vérification de programmes de contrôle-commande
339
port au milieu physique, il existe clairement des différences mais leur étude dépasse
le cadre de cet article. Dans la suite, nous identifions donc l’environnement physique
d’un programme de contrôle-commande avec son modèle donné sous forme d’équations différentielles, et nous essaierons de vérifier le bon comportement de ce modèle.
Nous détaillons ces idées en section 2.2.
Lorsqu’on s’intéresse aux programmes de contrôle-commande embarqués, on voit
donc qu’il est nécessaire de considérer l’ensemble des interactions possibles entre
le programme et son environnement. Ceci pose un problème majeur : le programme
a une évolution discrète alors que l’environnement est régi par des lois physiques
continues. Nous devons donc traiter des systèmes dits hybrides qui mélangent évolution discrète et évolution continue. C’est cette réflexion qui a motivé mon travail de
thèse (Bouissou, 2008) dans laquelle nous étendons les analyses statiques classiques
pour prendre en compte l’environnement physique avec lequel un programme embarqué interagit. Cet article présente certains des résultats issus de cette thèse. Ces
résultats permettent à la fois de prouver de nouvelles propriétés sur les programmes
de contrôle-commande et d’améliorer la précision (i.e. réduire le nombre de fausses
alarmes) des analyses classiques. Comme souvent, la méthode que nous proposons
n’est pas complète, c’est-à-dire qu’elle ne permet de prouver des propriétés de sûreté
que pour une classe restreinte de programmes. Nous détaillons maintenant les caractéristiques principales des programmes que nous pouvons prendre en compte :
– le contrôle est binaire, c’est-à-dire que le programme ne peut modifier l’environnement continu que via des actions discrètes : ouvrir ou fermer une vanne par exemple.
Les algorithmes de contrôle dits « bang-bang control » rentrent dans cette catégorie ;
– les capteurs et les actionneurs sont parfaits, c’est-à-dire que nous faisons l’hypothèse qu’il n’y a pas de délais d’écriture sur les actionneurs et pas de bruit de lecture
sur les capteurs. Cette hypothèse nous permet d’avoir un modèle relativement simple
des interactions entre un programme et son environnement physique, et nous permet
donc de garder une complexité raisonnable pour le calcul des trajectoires de l’environnement continu ;
– nous ne considérons pas le contrôle stochastique. Les programmes que nous
prenons en compte sont purement déterministes, l’extension de ces techniques à des
modèles mixant probabilisme (induit par le programme) et non-déterminisme (induit
par l’analyse) est en cours via le projet ANR CPP (Bouissou, Goubault et al., 2012).
Nous faisons à la section 4 une autre hypothèse sur les programmes de contrôlecommande que nous considérons, à savoir que leur comportement suit une boucle
« Lire-Calculer-Écrire » (voir section 2.2). Nous discuterons de cette hypothèse et des
restrictions qu’elle impose sur les programmes en début de section 4.
Pour illustrer nos propos, nous utilisons dans cet article un exemple de système de
contrôle-commande bien connu de la communauté des systèmes hybrides : le système
des deux réservoirs (Henzinger et al., 2000). Nous donnons à la figure 1(a) une vision
schématique de ce système, nous en donnons en section 3 une version plus formelle.
Ce système est composé de deux réservoirs (R1 et R2 ) reliés par une canalisation
340
TSI. Volume 31 – no 3/2012
C1
V1 , V2 ouvertes
√
h˙1 = i − k1 h1
h1
R1
V2 fermée
C12
√
h˙1 = i − k1 h1
V1
√
h˙2 = k1 h1
V1 fermée
h˙1 = i
h2
C2
R2
[tb]
√
√
h˙2 = k1 h1 − k2 h2
V2
(a) Un schéma du système
√
h˙2 = −k2 h2
V1 , V2 fermées
h˙1 = i
h˙2 = 0
(b) Les équations correspondantes
Figure 1. Le système des deux réservoirs
(C12 ) horizontale située à la base du réservoir R1 . De l’eau entre dans le système
par une arrivée (C1 ) constante dans le réservoir R1 et l’eau peut quitter le système
par une canalisation (C2 ) située à la base du réservoir R2 . Les canalisations C12 et
C2 sont munies de vannes (V1 et V2 , respectivement) permettant de laisser passer, ou
non, l’eau dans les canalisations. L’évolution temporelle des hauteurs d’eau h1 et h2
dans les réservoirs R1 et R2 , respectivement, est donnée (en fonction de l’état des
vannes V1 et V2 ) par les équations différentielles de la figure 1(b) ; dans ces équations,
i est le débit d’arrivée d’eau dans la canalisation C1 , k1 et k2 sont des coefficients
représentant la section des canalisations C12 et C2 , respectivement.
Cet article est organisé comme suit. La section 2 formalise la théorie de l’interprétation abstraite et la notion de logiciel de contrôle-commande. Dans la section 3, nous
décrivons notre modèle pour décrire les programmes de contrôle-commande et donnons, brièvement, un aperçu de leur sémantique. Puis, dans les sections 4 et 5 nous décrivons une technique d’analyse permettant de calculer des bornes sur les trajectoires
continues pour ce type de programme. Les sections 6 et 7 présentent, respectivement,
les travaux connexes et les conclusions.
Remarquons que pour plus de clarté, nous ne donnons pas dans cet article les
preuves des résultats, elles sont présentes dans la thèse (Bouissou, 2008).
2. Contexte
2.1. Vérification de programmes par interprétation abstraite
L’interprétation abstraite est une technique automatique permettant de prouver
l’absence d’un certain type d’erreurs d’un programme P portant sur un ensemble
Vérification de programmes de contrôle-commande
341
fini de variable V = {x1 , . . . , xn }. Nous commençons par définir la sémantique
concrète (Winskel, 1993) de P : nous considérons un programme comme une fonction
JP K : RV → RV , où σ ∈ RV est un état associant à chaque variable sa valeur réelle.
Cette fonction lie les valeurs des variables du programme avant et après son exécution. Ainsi, étant donné un état initial du programme σ0 ∈ RV , le calcul de JP K(σ0 )
décrit l’évolution des variables du programme au cours de son exécution à partir de
σ0 . Grâce à JP K(σ0 ), on peut donc vérifier l’absence d’erreurs lors de cette exécution. Dans le cas où les valeurs des variables d’entrée ne sont pas connues exactement
mais uniquement
déterminées par leur appartenance à un ensemble d’états possible
Σ0 ∈ P RV , il faut calculer la fonction JP K sur chaque état σ0 ∈ Σ0 . Pour cela,
nous définissons la fonction de sémantique collectrice JP Kc : P RV → P RV qui
calcule l’ensemble des valeurs possibles prises par les variables de P lors de toutes
les exécutions possibles. On peut donc prouver l’absence d’erreurs sur un ensemble
de valeurs initiales en calculant JP Kc (Σ0 ) et en vérifiant qu’aucune des exécutions ne
comporte de bogues. Pour des programmes de taille industrielle, ce calcul est clairement impossible pour plusieurs raisons. Premièrement, l’ensemble Σ0 contient un
nombre important d’états, donc la représentation en mémoire de Σ0 et JP Kc (Σ0 ) est
problématique. Enfin, le calcul de JP Kc (Σ0 ) nécessite le calcul d’un point fixe d’une
fonction monotone (voir (Winskel, 1993) pour plus de détails). Ce point fixe se calcule
par une itération de Kleene, qui peut ne terminer qu’après un nombre infini d’étapes.
Pour résoudre ces problèmes, la théorie de l’interprétation abstraite revient à calculer, à la place de JP Kc (Σ0 ), une propriété abstraite sur cet ensemble. Cette propriété
est encodée par un domaine abstrait, et est calculée par la fonction de sémantique
abstraite, notée JP Ka . Cette sémantique abstraite doit vérifier un critère de sûreté qui
peut s’exprimer ainsi : si l’état initial Σ0 vérifie la propriété s0 , ce que nous notons
Σ0 ⊆ γ(s0 ), alors JP Kc (Σ
0 ) doit vérifier la propriété JP Ka (s0 ), ce que nous notons
JP Kc (Σ0 ) ⊆ γ JP Ka (s0 ) . La notion de propriété est liée à la notion de domaine abstrait : un domaine abstrait définit un type de propriétés que nous pouvons prouver sur
un programme. Nous détaillons ce concept dans le paragraphe suivant. Pour propager
les propriétés, la fonction JP Ka doit aussi calculer un point fixe : il est donc nécessaire
de rendre ce calcul fini en utilisant une technique d’accélération appelée widening,
que nous détaillons ensuite.
Domaine abstrait. Un domaine abstrait Da est un treillis (Birkhoff, 1940), c’est-àdire un ensemble ordonné muni du calcul du supremum t et de l’infimum u de deux
éléments 1 . Un élément du treillis encode une propriété sur les états du programme. Par
exemple, si on considère le treillis des signes Ds = {⊥, +, −, >} et que le programme
n’a qu’une variable x, alors l’élément + représentel’ensemble des états tels que x ≥
0. On définit donc une fonction γ : Da → P RV , dite fonction de concrétisation,
qui associe à chaque propriété l’ensemble des états qui la satisfont ; cette fonction γ
1. Nous imposons une structure de treillis pour avoir ces opérateurs de supremum et infimum binaires, car
ils apparaissent dans les équations des sémantiques concrètes et abstraites dès que le programme contient
des tests ou des boucles.
342
TSI. Volume 31 – no 3/2012
doit être monotone. Ainsi, pour le domaine des signes et toujours pour un programme
à une variable x, on aura :
γ(⊥) = ∅;
γ(−) = {σ | σ(x) ≤ 0};
γ(+) = {σ | σ(x) ≥ 0};
γ(>) = RV .
L’ordre sur le domaine abstrait (ici, par exemple, + v >) doit être compatible
avec cette notion d’information : une propriété « plus grande » est vérifiée par un
ensemble plus grand d’états, ce qui justifie la monotonie imposée à γ. Les propriétés
encodées par un domaine abstrait ne sont généralement pas des propriétés de sûreté.
Par exemple, un domaine abstrait n’encode pas la propriété « il n’y a pas de division
par zéro », mais encode des propriétés sur les états du programme (toutes les variables
sont strictement positives) qui permettent ensuite de prouver l’absence de bogues. Si
l’analyse n’est pas assez précise, la propriété numérique trouvée ne permet pas de
conclure sur l’absence de bogues, on parle alors de fausses alarmes.
De nombreux domaines abstraits existent, notamment pour les propriétés numériques sur les variables du programme. Le domaine des intervalles (Cousot, Cousot,
1977) calcule des bornes inférieures et supérieures sur les valeurs prises par chaque
variable du programme. D’autres domaines, dits relationnels, calculent des propriétés
plus complexes faisant intervenir plusieurs variables du programme. Ainsi, le domaine
des polyèdres (Cousot, Halbwachs, 1978) permet de trouver des
Pninégalités linéaires
entre les variables du programme, i.e. des relations du type i=1 αi xi ≤ c, avec
αi ∈ R, c ∈ R et V = {x1 , . . . , xn }. Pour une description complète des différents
domaines numériques existants, nous invitons le lecteur à lire (Miné, 2004).
Calcul de la sémantique abstraite : widening. Une fois le domaine abstrait choisi, il
faut donc définir la fonction de sémantique
abstraite JP
Ka de telle sorte que, pour un
élément abstrait s, on ait JP Kc γ(s) ⊆ γ JP Ka (s) . Autrement dit, si les entrées
du programme vérifient une propriété s avant l’exécution, alors toutes les sorties du
programme doivent vérifier la propriété JP Ka (s). Notons que ceci ne signifie pas que
JP Ka (s) est la plus petite propriété vérifiée par les variables du programme : on s’autorise à sur-approximer le comportement exact du programme. Ainsi, si les propriétés
calculées JP Ka (s) suffisent à prouver que le programme est sans bogue, on pourra
conclure que les exécutions du programme P ne créent pas de ce type de bogues (par
exemple, on a prouvé que toutes les variables du programme sont supérieures à 1, il
n’y aura donc pas de division par zéro).
Pour calculer JP Ka , il faudra, comme pour JP Kc , calculer le point fixe d’une fonction monotone (opérant cette fois sur des valeurs abstraites). Le calcul de ce point
fixe par itération de Kleene peut ne pas terminer, si le domaine abstrait choisi permet
d’avoir des chaînes croissantes infinies. Pour éviter ce phénomène, l’interprétation
abstraite introduit la notion de widening (Cousot, Cousot, 1992b ; Monniaux, 2009) :
le widening transforme une chaîne croissante infinie s0 v s1 v s2 v . . . en une
chaîne croissante finie s0 = t0 v t1 v t2 v · · · v tn = tn+1 . Par exemple, dans le
domaine des intervalles, le widening détecte si la borne supérieure d’une variable x
augmente dans la suite (sn ) et dans ce cas change la borne supérieure en +∞. Ainsi,
on force bien la terminaison du calcul : à l’étape suivante, la borne supérieure de x sera
Vérification de programmes de contrôle-commande
343
égale à +∞ également. Malheureusement, cette technique ne garantit plus l’obtention
de la propriété minimale, c’est-à-dire du plus petit point fixe de JP Ka : la valeur calculée tn est un post point fixe de JP Ka et est plus grande que le plus petit point fixe.
Le widening est souvent la source principale de fausses alarmes dans l’analyse statique de programmes, car la sur-approximation introduite pour garantir la terminaison
du calcul est très forte. Des travaux récents visent à limiter ce problème en proposant
de nouvelles méthodes d’accélération du calcul de point fixe (Gonnord, Halbwachs,
2006 ; Schrammel, Jeannet, 2010 ; Bouissou, Seladji, Chapoutot, 2012).
2.2. Cas des logiciels de contrôle-commande
L’analyse des logiciels de contrôle-commande par interprétation abstraite est particulièrement intéressante car ce sont souvent des logiciels critiques, c’est-à-dire dont
une défaillance serait dangereuse. Il n’existe pas de définition formelle d’un logiciel de
contrôle-commande, nous donnons ici une caractérisation du type de logiciel auquel
nous nous intéressons. Un logiciel de contrôle-commande est un programme connecté
à un environnement extérieur via des capteurs et des actionneurs et qui fonctionne
selon la boucle « Lire-Calculer-Écrire » que l’on peut schématiquement représenter
ainsi :
Initialise ;
tant que vrai faire
Lire entrées ;
Calculer état suivant ;
Écrire sorties ;
L’instruction « Lire » récupère des nouvelles valeurs provenant des capteurs (par
exemple la hauteur d’eau dans les réservoirs), l’étape « Calculer » décide de l’action
à effectuer (par exemple, ouvrir la vanne de R1 ) et l’étape « Écrire » utilise les actionneurs pour effectuer cette action (la vanne est donc effectivement ouverte). Nous
détaillons en section 3 la sémantique précise de ces programmes et les liens existant
entre ce modèle et les modèles classiques de représentation de systèmes hybrides (notamment les automates hybrides (Henzinger, 1996 ; Lygeros et al., 2003)).
Pour effectuer une analyse par interprétation abstraite d’un tel programme, il convient de sur-approximer les instructions « Lire » et « Écrire », l’étape « Calculer » pouvant être analysée comme décrit précédemment. Classiquement, un analyseur statique
va « oublier » l’étape Écrire qui ne modifie pas les valeurs des variables du programme,
et va sur-approximer l’instruction « Lire » en utilisant l’intervalle de valeurs que peut
fournir le capteur (généralement donné par la spécification du capteur). Ainsi, on calcule bien une sur-approximation de l’ensemble des valeurs prises par les variables
du programme. Cependant, on ne prend alors pas en compte la dynamique des grandeurs physiques mesurées par le capteur. Or cette dynamique est souvent prise en
compte par le programmeur de l’algorithme de contrôle et le programme est conçu
pour se comporter « normalement » si les entrées suivent cette dynamique. Pour obtenir des résultats précis, c’est-à-dire une sur-approximation la plus petite possible
344
TSI. Volume 31 – no 3/2012
L1
l1
Évolution de h1 au cours du temps
L2
l2
Évolution de h2 au cours du temps
Figure 2. Simulation du système des deux réservoirs en Simulink
de l’ensemble des comportements du programme, il est donc nécessaire de prendre
en compte la dynamique de l’environnement continu et les interactions entre le programme et l’environnement. Par exemple, pour le système des deux réservoirs, une
simulation réalisée en Simulink donne l’évolution de la figure 2 pour les hauteurs
d’eau dans chaque réservoir. Une analyse statique de ce système en ne regardant que
le programme (et donc en oubliant les étapes Lire et Écrire) serait incapable de démontrer que les hauteurs d’eau restent bornées : il faut savoir que si le programme
décide de fermer la vanne entre les deux réservoirs, la hauteur d’eau dans le réservoir 1 remonte. L’objectif dans (Bouissou, 2008) était d’étendre les analyses statiques
classiques pour prendre en compte les interactions entre le programme et son environnement continu. En particulier, on cherche à donner des garanties sur l’évolution
temporelle des valeurs physiques : pour tout temps t, on donne des bornes possibles
pour ces valeurs. Autrement dit, nous cherchons à calculer l’ensemble atteignable par
les grandeurs d’un système physique contrôlées par un programme discret.
Dans la section 6, nous donnons les travaux fondateurs de la théorie des systèmes
hybrides, dans laquelle s’inscrit ce travail. Cependant, il nous semble important de
mentionner maintenant la différence entre notre approche, dédiée aux logiciels embarqués de contrôle-commande, et la théorie des automates hybrides. Nous l’avons
dit, nous considérons qu’un programme de contrôle-commande fonctionne selon une
boucle Lire-Calculer-Écrire. Nous faisons de plus l’hypothèse que le programme est
synchrone, c’est-à-dire que cette boucle s’exécute à une fréquence connue et que donc
les actions Lire et Écrire ne s’exécutent qu’à des instants connus. Au contraire, l’exécution d’un automate hybride suit une boucle du type :
Initialise ;
tant que vrai faire
Attendre l’évènement E ;
Exécute la transition ;
Vérification de programmes de contrôle-commande
345
L’exécution d’un système hybride est donc dirigée par les évènements alors qu’un
programme de contrôle-commande est dirigé par le temps. C’est pour cela que nous
avons décidé de développer un nouveau modèle et des techniques d’analyse ad hoc.
3. Un modèle pour les programmes de contrôle-commande
Dans cette section, nous présentons le langage de programmation H-SIMPLE
qui est une extension hybride d’un langage impératif de base. Ce langage a été pensé
pour pouvoir encoder facilement un algorithme reposant sur la boucle « Lire-CalculerÉcrire » présentée en section 1. Il est cependant assez générique et les programmes
H-SIMPLE peuvent avoir une forme différente. Lors de l’analyse cependant (voir les
sections 4 et 5), nous supposons que les programmes suivent la boucle « Lire-CalculerÉcrire ». Nous commençons par présenter la syntaxe du langage puis donnons sa sémantique. Une sémantique dénotationnelle a été définie dans l’article (Bouissou, Martel, 2008), nous en donnons ici une version opérationnelle, plus simple.
3.1. Le modèle
Nous avons développé H-SIMPLE avec trois objectifs. Premièrement, nous voulions séparer clairement les variables discrètes et les variables continues, et faire apparaître distinctement les capteurs et les actionneurs. Deuxièmement, nous voulions modéliser indépendemment le programme de contrôle et l’environnement continu. Enfin,
nous souhaitions minimiser les modifications à apporter à un programme de contrôlecommande existant. Ces trois objectifs sont nécessaires pour que ce modèle soit utilisé
pour la vérification de programmes de contrôle-commande industriels.
Notre modèle fait donc la différence entre les variables discrètes (appelées DVar)
qui sont traditionnellement encodées en utilisant des nombres à virgule flottante, et
les variables continues (appelées CVar) qui sont des nombres réels. Les variables discrètes sont manipulées par le programme, alors que l’évolution des variables continues
est régie par l’environnement continu. La communication entre ces deux types de variables se fait par l’intermédiaire de capteurs qui transforment une variable continue
en une variable discrète (avec donc une conversion vers les nombres flottants) et d’actionneurs qui modifient la dynamique des variables continues. Un actionneur ne peut
pas modifier la valeur d’une variable continue : celle-ci représente en effet une grandeur physique, son évolution doit toujours être continue. Nous n’autorisons donc que
des changements dans la dynamique de l’environnement, pas dans sa valeur. Pour effectuer ces changements, nous introduisons des variables discrètes spéciales, appelées
variables d’actions et notées AVar, qui représentent les actionneurs du système. Ces
variables sont partagées par le programme et l’environnement continu (ce sont des
paramètres de la dynamique) ; activer un actionneur revient donc à modifier la valeur
d’une de ces variables.
Il existe généralement deux types de contrôle : le contrôle binaire (ou contrôle
bang-bang) où le programme choisit de façon binaire entre deux états possibles pour
346
TSI. Volume 31 – no 3/2012
un actionneur, et le contrôle numérique où le programme modifie une grandeur numérique. Par exemple, les actionneurs qui servent à ouvrir et fermer les vannes du système des deux réservoirs (figure 1) effectuent du contrôle binaire : la vanne peut être
fermée ou ouverte. En revanche, un contrôleur de vitesse dans une voiture va effectuer un contrôle numérique en modifiant l’intensité de l’accélération à chaque instant.
Dans cet article, nous ne considérons que le cas du contrôle binaire, nous avons donné
dans l’article (Bouissou et al., 2009) quelques pistes pour gérer le contrôle numérique.
Dans le cas du contrôle binaire, les variables d’action seront donc encodées par une
valeur booléenne.
3.1.1. Partie discrète
Syntaxe du langage. La partie discrète de notre modèle est un programme dont la
syntaxe est donnée à la figure 3. Ce langage contient des instructions discrètes – les
affectations, les tests ainsi qu’une boucle while – plus trois instructions hybrides
(HStmt dans la figure 3) :
– sens.y?X où y ∈ CVar et X ∈ DVar. On modélise ici un capteur qui donne à
X la valeur de y à l’instant où l’instruction est exécutée ;
– act.b!c où c ∈ {0, 1} et b ∈ AVar. Cette instruction représente un actionneur :
la dynamique continue sera changée en fonction de la valeur (0 ou 1) passée à b ;
– wait u où u ∈ R+ . Cette instruction modélise la durée des autres instructions
discrètes : on suppose en effet que chaque instruction est instantanée et on ajoute
explicitement des instructions wait pour compenser le fait qu’elles ne l’étaient pas.
Modèle de la partie discrète. Un modèle de la partie discrète d’un système hybride
(voir définition 1) est un programme écrit en H-SIMPLE , plus un ensemble de variables continues représentant les valeurs physiques mesurables et un ensemble de
variables d’action représentant les actionneurs disponibles.
D ÉFINITION 1 (Modèle de la partie discrète). — Un modèle ∆ pour la partie discrète
est un triplé (CV, BV, P ) tel que :
1. CV ⊆ CVar est un ensemble de variables continues ;
2. BV ⊆ AVar est un ensemble de variables booléennes ;
3. P est un programme suivant la syntaxe H-SIMPLE n’utilisant que des variables continues de CV pour les actions sens et que des variables de BV pour les
actions act.
E XEMPLE 2 (Problème des deux réservoirs.). — La partie discrète du problème des
deux réservoirs (c’est-à-dire le contrôleur) s’encode très simplement en H-SIMPLE
(figure 4). Le contrôleur dispose de deux capteurs qui mesurent les hauteurs d’eau h1
et h2 et les transforment en variables discrètes X1 et X2 (lignes 10 et 11). Puis, si
les niveaux critiques ont été franchis, il actionne les vannes et déclenche une alarme
indiquant un problème critique dans le système. On a rajouté dans le programme de
la figure 4 deux fonctions d’anticipation (anticipate_h1 et anticipate_h2,
lignes 20 et 21) qui permettent de prédire la hauteur d’eau dans chacun des deux
Vérification de programmes de contrôle-commande
f ∈F
347
X ∈ DVar
::= f | X | a + a | a − a | a × a | a/a
AExp :
a
BExp :
b ::= true | f alse | a = a | a ≤ a
Stmt :
s ::= X := a | s; s |
if b then s else s | while b do s |
hs
u ∈ R+
X ∈ DVar y ∈ CVar b ∈ AVar c ∈ {0, 1}
HStmt :
hs ::= sens.y?X | act.b!c | wait u
Figure 3. Syntaxe du langage H-SIMPLE
réservoirs deux secondes dans le futur. On ne précise pas l’implémentation de cette
fonction d’anticipation, on peut utiliser par exemple une extrapolation linéaire. En
utilisant les valeurs calculées, on peut alors contrôler plus finement les niveaux d’eau
en anticipant sur le temps de fermeture des vannes. On va donc ouvrir (ou fermer)
les vannes si la valeur prédite dépasse les seuils critiques (lignes 22 à 29). En fin de
boucle, l’instruction wait permet de simuler la durée d’exécution des instructions
précédentes (ici, 0,01 secondes). Le modèle discret pour ce système est donc ∆r =
(CV, BV, P ) avec CV = {h1 , h2 }, BV = {b1 , b2 } et P est le programme de la
figure 4.
Un des avantages du langage H-SIMPLE est qu’il réduit l’apparition d’effets Zénon dus aux actions du processus discret. L’effet Zénon est un problème bien connu de
la communauté hybride (Heymann et al., 2005 ; Zhang et al., 2001) : dans certaines
situations, un système hybride peut effectuer une infinité d’actions discrètes en un
temps fini. Ceci est impossible dans une exécution réelle, et dans une certaine mesure
impossible dans notre modèle. En effet, l’instruction wait impose que le délai soit
une valeur constante u ∈ R+ . Comme les programmes sont de tailles finies, il existe
un temps minimum τ > 0 tel que toutes les instructions wait augmentent le temps
d’au moins τ secondes. La seule possibilité d’avoir une exécution infinie est donc que
cette exécution dure 0 seconde, et il est facile via une analyse de vivacité (en utilisant
par exemple des outils comme Terminator (Cook et al., 2006b ; 2007)) de montrer que
348
TSI. Volume 31 – no 3/2012
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/ / Deux v a r i a b l e s c o n t i n u e s : h1 e t h2
/ / Deux v a r i a b l e s d ’ a c t i o n s : b1 e t b2
/ / V a r i a b l e s d i s c r e t e s : X1 , X2 ,
//
h1_min , h1_max ,
//
h2_min , h2_max ,
//
X1_in_2_secs ,
//
X2_in_2_secs
i n t main ( ) {
while ( t r u e ) {
s e n s . h1 ?X1 ;
s e n s . h2 ?X2 ;
i f ( X1>h1_max )
a c t . b1 ! 0 ; t h r o w ( a l a r m ) ;
i f ( X2>h2_max )
a c t . b2 ! 0 ; t h r o w ( a l a r m ) ;
i f ( X1<h1_min )
a c t . b1 ! 1 ; t h r o w ( a l a r m ) ;
i f ( X2<h2_min )
a c t . b2 ! 1 ; t h r o w ( a l a r m ) ;
X 1 _ i n _ 2 _ s e c s = a n t i c i p a t e _ h 1 ( X1 , X2 ) ;
X 2 _ i n _ 2 _ s e c s = a n t i c i p a t e _ h 2 ( X1 , X2 ) ;
i f ( X 1 _ i n _ 2 _ s e c s >h1_max )
a c t . b1 ! 0 ;
i f ( X 2 _ i n _ 2 _ s e c s >h2_max )
a c t . b2 ! 0 ;
i f ( X 1 _ i n _ 2 _ s e c s <h1_min )
a c t . b1 ! 1 ;
i f ( X 2 _ i n _ 2 _ s e c s <h2_min )
a c t . b2 ! 1 ;
wait ( 0 . 0 1 ) ;
// delai
}
}
Figure 4. Encodage du système des deux réservoirs en H-SIMPLE
toute exécution infinie contient un nombre infini d’instructions wait : dans ce cas, il
ne pourra pas y avoir d’effet Zénon.
3.1.2. Partie continue
La partie continue des systèmes hybrides que nous considérons est formée de variables évoluant continûment dans le temps et qui représentent les grandeurs physiques avec lesquelles le programme interagit. L’évolution de ces grandeurs physiques
est donnée par une équation différentielle ordinaire (EDO), c’est-à-dire une relation
Vérification de programmes de contrôle-commande
349
entre une fonction y : D → Rn définie sur un ouvert D et sa dérivée temporelle
ẏ : D → Rn , donnée par :
ẏ(t) = F (y(t), t) .
(1)
Par convention, nous notons souvent l’EDO ẏ = F (y, t) et ẏ = F (y) dans le cas
dune EDO autonome.
Supposons qu’un programme dispose de m variables d’actions b1 , . . . , bm ∈ AVar.
Nous noterons ~b ∈ Bm le vecteur de booléens tel que ∀i ∈ [1, m], ~bi = bi . Alors ~b
peut prendre 2m valeurs différentes et chacune de ces valeurs représente une configuration du système. Par exemple, pour le système des deux réservoirs, on a m = 2 et il
y a 4 configurations possibles : V1 , V2 ouvertes, V1 ouverte et V2 fermée, V2 ouverte
et V1 fermée, et enfin V1 , V2 fermées. Le modèle de l’environnement continu associera donc à chaque valeur de ~b une équation différentielle représentant l’évolution
des variables continues dans cette configuration.
D ÉFINITION 3 (Modèle du milieu continu). — Un modèle κ pour le milieu continu
est un quadruplé κ = CV, BV, {Fk }k∈Bm tel que :
1. CV ⊆ CVar est un ensemble de variables continues ;
2. BV = b1 , . . . , bm ⊆ AVar est un ensemble de variables d’actions ;
3. ∀k ∈ Bm , Fk : R|CV | → R|CV | est continue et Lipschitz par morceaux.
Nous imposons que les fonctions définissant les équations différentielles soient continues et Lipschitz par morceaux pour s’assurer de l’existence et unicité de leur solution.
E XEMPLE 4 (Problème des deux réservoirs). — Le problème des deux réservoirs possède quatre modes continus correspondant aux cas où les vannes 1 et 2
sont ouvertes et/ou fermées. Un modèle continu
pour ce système sera donc κr =
{h1 , h2 }, {b1 , b2 }, {F0,0 , F1,0 , F0,1 , F1,1 } où F0,0 représente le cas où les deux
vannes sont ouvertes, F1,0 le cas où la vanne 1 est fermée, F0,1 le cas où la vanne
2 est fermée et F1,1 le cas où les deux vannes sont fermées.
3.1.3. Modèle hybride
Dans notre formalisme, un système hybride sera donc un couple (∆, κ) tel que ∆
est un modèle de la partie discrète et κ un modèle de la partie continue et tel que ∆ et
κ partagent les mêmes variables continues et les mêmes actionneurs.
D ÉFINITION 5 (Modèle du système hybride). — Un modèle Ω pour le système hybride est un couple Ω = (∆, κ) tel que :
– ∆ = CV1 , BV1 , P est un modèle de la partie discrète ;
– κ = CV2 , BV2 , {Fk }k∈B|BV2 | est un modèle de la partie continue ;
– CV1 ⊆ CV2 et BV1 ⊆ BV2 .
La dernière condition permet de s’assurer que le programme et le milieu continu sont
compatibles, c’est-à-dire que les variables sur lesquelles le programme peut agir (via
une instruction sens ou act) sont bien des variables contrôlées par le milieu continu.
350
TSI. Volume 31 – no 3/2012
Dans ce modèle, le programme et son environnement sont deux processus s’exécutant en parallèle et communiquant via des capteurs et des actionneurs qui servent de
canaux de communication. Ces canaux sont fixes et connus : cette communication est
donc proche du modèle proposé par les Communicating Sequential Processes (Hoare,
1985), c’est pourquoi nous utilisons la même syntaxe que les instructions CSP : le
« ? » modélise la réception de valeur, le « ! » l’envoi de message.
Remarquons que ce modèle est conforme aux une modélisation de la partie discrète
ne demande que quelques objectifs que nous nous étions fixés. En effet, ajouts aux
programmes existants, les actions des capteurs et des actionneurs sont explicites, la
communication entre les parties discrètes et continues se fait par envoi de messages et
enfin les sous-systèmes discrets et continus peuvent être modélisés séparément, dans
des formalismes différents. La figure 5 donne une vision schématique des interactions
entre le milieu continu et le programme discret dans notre modèle. La partie discrète
est un programme écrit en H-SIMPLE qui calcule, en fonction de son état interne et
des entrées provenant des capteurs, un résultat envoyé aux actionneurs. Ce résultat,
noté cmd sur la figure 5, équivaut à choisir, parmi tous les modes disponibles, celui
correspondant à l’actionneur à activer. Le milieu continu peut être vu comme une EDO
à commutateur représentée par le bloc en haut du schéma. L’entrée de ce bloc est une
commande venant des actionneurs, et la sortie est la valeur courante y de la solution
de l’EDO. Cette valeur est transmise au capteur qui la transforme en le nombre flottant
le plus proche, c’est-à-dire y.
3.2. Sémantique opérationnelle du modèle
L’exécution d’un système hybride (∆, κ) est une succession de transitions discrètes, instantanées, modifiant les variables discrètes du programme, et des transitions
continues, modifiant la valeur des variables de l’environnement continu. L’état d’un
système hybride (voir définition 6) est donc caractérisé par la valeur de chaque variable discrète, de chaque variable continu, des variables d’action ainsi que du temps.
Nous définissons un état discret comme une fonction associant à une variable discrète un nombre à virgule flottante, et notons Σd l’ensemble des états discrets : Σd =
DVar → F. De même, un état continu associe à chaque variable continue une valeur
réelle et Σc = CVar → R est l’ensemble des états continus. Enfin, la configuration des
actionneurs est donnée par une fonction associant à chaque variable d’action une valeur booléenne. Nous notons Σb = AVar → B l’ensemble de ces configurations. Pour
chaque état σ et variable v, nous notons σ(v) la valeur de v dans l’état σ et σ[v 7→ r]
l’état σ 0 tel que σ 0 (v) = r et pour toute autre variable v 0 , σ 0 (v 0 ) = σ(v 0 ). Étant donné
un état continu σc ∈ Σc , nous notons σc (~y ) ∈ R|CVar| le vecteur contenant toutes les
valeurs associées aux variables continues.
D ÉFINITION 6 (État d’un système hybride). — Soit Ω = (∆, κ) un système hybride.
L’état du système est un quadruplé σ = (σd , σc , σb , t) tel que σd ∈ Σd , σc ∈ Σc ,
σb ∈ Σb et t ∈ R+ représente le temps.
Vérification de programmes de contrôle-commande
351
y
F1
ẏ
y
1
s
F2
···
Fn
Modèle continu
cmd
Capteurs
Actionneurs
y
État
interne
Programme discret
Figure 5. Fonctionnement d’un programme embarqué
Les états discrets ainsi que les configurations des actionneurs seront modifiées par
le programme via un système de transition classique, que nous définissons dans la
suite. Par contre, l’état continu est modifié par les équations différentielles qui définissent la dynamique du milieu continu. Soit une EDO de dimension n, ẏ = F (y),
où la fonction F : R|CVar| → R|CVar| est continue et Lipschitz par morceaux, et soit
σc ∈ Σc un état continu donnant la valeur des variables ~y . La fonction d’avancement
du temps (souvent appelée time elapse dans la littérature de systèmes hybrides) est la
fonction %F : Σc × R+ → Σc définie par :
∀σc ∈ Σc , ∀t ∈ R+ , %F (σc , t) = y∞ (t)
où y∞ est l’unique solution du problème de Cauchy ẏ = F (y), y(0) = σc (~y ) 2 .
Nous définissons maintenant la sémantique opérationnelle de ces systèmes hybrides comme un système de transition κ ` hstmt, σi → hstmt0 , σ 0 i, qui signifie
que sous l’effet de l’environnement κ, l’instruction stmt est exécutée dans l’état σ
et se transforme en l’instruction stmt0 dans l’état σ 0 . La figure 6 donne les règles
de la sémantique opérationnelle. Nous ne donnons pas les règles pour les instructions discrètes (Stmt à la figure 3) car ce sont les mêmes que pour n’importe quel
2. Nous utilisons ici implicitement l’isomorphisme entre Σc = CVar → R et R|CVar| et considérons
y∞ (t) ∈ R|CVar| comme un élément de Σc .
352
TSI. Volume 31 – no 3/2012
σ 0 = σd [X 7→↑◦ σc (y) ]
C APTEUR
κ ` hsens.y?X; stmt, (σd , σc , σb , t)i → hstmt, (σ 0 , σc , σb , t)i
σb0 = σb [bi 7→ b]
ACTIONNEUR
κ ` hact.bi !b; stmt, (σd , σc , σb , t)i → hstmt, (σd , σc , σb0 , t)i
κ = V, B, {Fk } , (y0 , k0 )
~b = (σb (b1 ), . . . , σb (bn ))
σc0 =%F~b (σc , u)
u
κ ` hwait u; stmt, (σd , σc , σb , t)i −
→ hstmt, (σd , σc0 , σb , t + u)i
D ÉLAI
hstmt, σd i →d hstmt0 , σd0 i
D ISCRET
κ ` hstmt, (σd , σc , σb , t)i → hstmt0 , (σd0 , σc , σb , r)i
Figure 6. Règles d’inférence de la sémantique opérationnelle de H-SIMPLE
langage impératif. Nous supposons disposer d’une règle de transition hstmt, σd i →d
hstmt0 , σd0 i qui modifie un état discret par une instruction discrète (voir par exemple
le livre (Winskel, 1993) pour une définition de la transition →d ). Nous ajoutons trois
règles qui correspondent aux trois instructions hybrides. Les règles C APTEUR et AC TIONNEUR sont très simples : elles mettent à jour l’état discret et la configuration
des actionneurs, respectivement. Dans la règle C APTEUR, la valeur réelle σc (y) est
transformée en une valeur flottante par la fonction de conversion ↑◦ : cette fonction
est fournie par la norme IEEE-754 de l’arithmétique flottante. La règle D ÉLAI correspondant à l’instruction wait u est plus compliquée : elle fait avancer le temps tout en
modifiant l’état continu pour que celui-ci contienne à tout instant la solution de l’équation différentielle choisie par l’état des actionneurs. Il faut donc d’abord sélectionner
l’équation différentielle représentant une configuration des actionneurs : on construit
le vecteur de booléens ~b = (σb (b1 ), . . . , σb (bm )), les variables continues évoluent
donc selon l’équation différentielle F~b . On applique alors la fonction d’avancement
dans le temps pour calculer le nouvel état continu.
Les règles de la figure 6 permettent de définir une sémantique opérationnelle à
petit pas de H-SIMPLE, notons que nous distinguons la transition induite par la règle
u
D ÉLAI des autres transitions en la notant −
→. C’est la seule transition qui n’est pas
instantanée (elle modifie le temps dans l’état du système hybride) et sera importante
ultérieurement. Dans la suite, le modèle continu utilisé sera implicite : nous notons
hstmt, σi → hstmt0 , σ 0 i pour κ ` hstmt, σi → hstmt0 , σ 0 i .
Notons ⇒ la clôture de la transition →: pour tout σ, σ 0 ∈ Σ, on a hstmt, σi ⇒
hstmt0 , σ 0 i si et seulement si il existe une suite d’états σ1 , . . . , σn et d’instructions
stmt1 , . . . , stmtn telle que :
hstmt, σi → hstmt1 , σ1 i → hstmt2 , σ2 i · · · → hstmtn , σn i → hstmt0 , σ 0 i
Vérification de programmes de contrôle-commande
353
Une exécution d’un programme P dans un environnement continu κ est une suite de
u
transitions « à grand pas » ⇒ et de transitions continues −
→. Formellement, l’exécution
de P à partir d’un état initial σ0 est une suite d’états et d’instructions telle que :
u
u
1
2
hP, σ0 i ⇒ hstmt00 , σ00 i −→
hstmt1 , σ1 i ⇒ hstmt01 , σ10 i −→
hstmt2 , σ2 i ⇒ . . .
Notons qu’il existe une différence majeure entre la transition ⇒ qui ne modifie ni
u
le temps ni les variables continues et la transition −
→ qui ne modifie pas les variables
discrètes. Ceci est formalisé dans la proposition 7.
u
u
2
1
σ2 ⇒ . . . d’un
σ1 ⇒ σ10 −→
P ROPOSITION 7. — Soit une exécution σ0 ⇒ σ00 −→
programme P . Alors, pour tout i ∈ N, on a :
– σi (t) = σi0 (t) et σi (~y ) = σi0 (~y )
– ∀v ∈ DVar ∪ AVar, σi0 (v) = σi+1 (v).
4. Génération d’invariants pour une classe de programmes
de contrôle-commande
Nous essayons maintenant de définir une méthode d’analyse des systèmes hybrides
présentés en section 3. Notre but n’est pas de prouver l’absence d’erreurs à l’exécution
sur le programme mais de prouver des propriétés concernant l’évolution temporelle de
l’environnement continu interagissant avec le programme : une propriété intéressante,
par exemple, est de montrer qu’une région de l’espace n’est pas atteignable. Pour prouver ce type de propriétés, il faut vérifier que dans toutes les exécutions possibles du
système hybride, l’état continu ne rentre jamais dans la région interdite. En raison d’incertitudes portant sur l’état initial du programme, l’ensemble de toutes les exécutions
n’est pas calculable : nous calculerons donc une sur-approximation des trajectoires
continues. Notre analyse cherche ainsi à calculer des invariants sur les trajectoires de
l’environnement continu d’un système hybride. Dans la section 4.2, nous définissons
formellement la notion d’invariants pour la trajectoire temporelle, puis définissons en
section 4.4 un algorithme permettant d’abstraire le programme en un ensemble de
graphes, appelé k-tree 3 , permettant de calculer ces invariants. L’algorithme de calcul des invariants à proprement parler est décrit dans la section 5. La méthode que
nous présentons ici est conçue pour fonctionner sur une certaine classe de systèmes
de contrôle-commande. Nous commençons par définir cette classe en section 4.1 et
discutons de sa généralité.
Notations. Dans cette section, nous notons IR le treillis des intervalles fermées sur R.
Un état continu abstrait sera donc une fonction des variables continues CVar vers IR ,
et nous noterons Σc l’ensemble des états continus abstraits. Pour tout σc ∈ Σc , nous
noterons σc (~y ) ∈ IR n l’hyper-rectangle contenant les valeurs abstraites de chaque
variable. Pour tout état concret σc ∈ Σc , nous noterons σc ∈ σc si pour toute variable
3. Le terme k-tree est une généralisation des quadtree (Finkel, Bentley, 1974), structure de données très
employée pour la représentation d’images.
354
TSI. Volume 31 – no 3/2012
continue v ∈ CVar, σc (v) ∈ σc (v). De même, B⊥ représentera le treillis complet des
valeurs booléennes, B⊥ = {⊥, 0, 1, >} est muni de l’ordre v défini par :
⊥ v 0, ⊥ v 1, 0 v >, 1 v > .
L’élément 0 représente la valeur « faux », 1 représente la valeur « vrai ». Nous définissons alors les configurations abstraites pour les actionneurs par les fonctions des
variables d’action AVar dans B⊥ : Σb = AVar → B⊥ . Par abus de notation, nous noterons σb ∈ σb pour signaler qu’une configuration σb ∈ Σb est dans la concrétisation
de la configuration abstraite σb ∈ Σb .
4.1. Hypothèses simplificatrices
Nous supposons disposer de programmes de contrôle-commande qui suivent la
boucle « Lire-Calculer-Écrire » décrite dans la section 2.2. Autrement dit, les systèmes
hybrides que nous considérons sont donnés par (∆, κ) tels que ∆ = (P, CV, AV ), et
P est un programme écrit en H-SIMPLE et qui vérifie les hypothèses suivantes 4 .
H1 : Capteurs et actionneurs parfaits. Nous supposons que les capteurs et les actionneurs fonctionnent tous à la même fréquence, et qu’il n’y a pas de bruit de lecture
sur les capteurs ni d’écriture sur les actionneurs.
H2 : Structure du programme. Nous supposons que P peut s’écrire comme P =
while 1 do{Pl ; Pc ; Pe ; wait h}, où Pl est une succession d’instructions sens, Pe
est une succession de tests if et d’instructions act , et Pc ne contient pas d’instructions hybrides. Nous faisons donc l’hypothèse que tous les capteurs mesurent simultanément une valeur et que tous les actionneurs écrivent simultanément leur contenu.
Ces actions sont instantanées, et l’instruction wait en fin de boucle permet de faire
avancer le temps : nous faisons donc l’hypothèse d’un fonctionnement synchrone du
programme. Notons que nous pourrions relâcher un peu cette hypothèse en supposant
que P s’écrit P = while 1 do{ Pl ; wait u1 ; Pc ; wait u2 ; Pe ; wait u3 }. Cela ne
modifierait pas fondamentalement notre méthode, il faudrait juste modifier la définition de la fonction φ dans la section 4.4.
Étant donné ces deux hypothèses, l’exécution du programme P est alors une suite
h
h
d’états σ0 ⇒ σ00 −
→ σ1 ⇒ σ10 −
→ . . . où la transition ⇒ représente l’exécution de
h
Pl , Pc et Pe et −
→ est l’exécution de l’instruction wait. Notons JP K : Σ → Σ la
fonction telle que pour tout état σ ∈ Σ, σ ⇒ JP K(σ). Cette fonction ne modifie pas
l’état continu du système car il n’y a pas d’instructions wait dans Pl , Pc et Pe , on a
donc, si σ = (σd , σc , σb , t), JP K(σ) = (σd0 , σc , σb0 , t) avec σd0 ∈ Σd et σb0 ∈ Σb . La
dernière hypothèse que nous faisons porte sur cette fonction JP K.
H3 : Programmes invariants dans le temps. Nous supposerons que l’algorithme
de contrôle-commande ne dépend que des dernières valeurs lues par les capteurs : la
4. Nous n’imposons pas d’hypothèses sur l’environnement continu κ autre que celle donnée en section 3.1.2, à savoir que les équations différentielles sont continues et Lipschitz par morceaux.
Vérification de programmes de contrôle-commande
355
fonction JP K ne doit pas dépendre d’une mémoire interne. Ainsi, pour tout σd1 , σd2 ∈
Σd et t1 , t2 ∈ R, on a : ∀σc ∈ Σc , σb ∈ Σb ,
0
0
si JP K(σd1 , σc , σb , t1 ) = (σd1 , σc , σb0 , t1 ), alors JP K(σd2 , σc , σb , t2 ) = (σd2 , σc , σb0 , t2 ).
Autrement dit, si le programme lit deux fois les mêmes valeurs continues sur ses
capteurs, alors il activera les mêmes actionneurs à chaque fois, quelles que soient les
valeurs des variables discrètes avant la lecture par les capteurs. Nous dirons d’un tel
programme qu’il est invariant dans le temps.
Ces hypothèses sont relativement restrictives mais permettent une analyse efficace
et précise des programmes les vérifiant. L’hypothèse H1 est très souvent faite pour
l’analyse de systèmes hybrides, le bruit de mesure ou les erreurs d’écriture sur les actionneurs étant la plupart du temps négligés. Nous pensons pouvoir ajouter à l’analyse
actuelle de l’information quant à ce bruit : les techniques présentées ici parlent du
comportement idéal du système, les déviations à ce comportement peuvent être introduites grâce à des techniques proches de celles utilisées pour l’analyse de la précision
des calculs en nombres à virgule flottante (Putot et al., 2003 ; Goubault, Putot, 2006).
L’hypothèse H2 est elle souvent vérifiée par les programmes de contrôle-commande
embarqués critiques, qui sont généralement générés à partir d’un modèle synchrone
(développé en SCADE par exemple) et qui suivent donc la boucle « Lire-CalculerÉcrire ». Enfin, l’hypothèse H3 est la plus restrictive car elle interdit des programmes
qui commencent par filtrer les données lues sur les capteurs avant de les traiter. Ces
filtres utilisent souvent les n dernières valeurs lues pour lisser le signal. Nous pensons
que notre technique peut être étendue pour traiter le cas où l’activation d’un actionneur dépend des n dernières valeurs lues, avec n fini. Nous discutons cela dans la
conclusion.
E XEMPLE 8. — Le programme
P ::= while 1 do(sens.y?X; if y > 1 then act.b0 !0; else act.b0 !1; )
est invariant dans le temps. En revanche, le programme
P 0 ::= while 1 do(sens.y?X; z = z + y; if z > 1 then act.0!0; else act.0!1; )
ne l’est pas car l’exécution d’un actionneur dépend de toutes les valeurs reçues depuis
le début du programme.
4.2. Trajectoire continue, invariants de trajectoire
Soit Ω un système hybride vérifiant les hypothèses H1, H2 et H3, et soit h le délai
h
imposé par l’instruction wait entre deux tours de la boucle. Soit σ0 ⇒ σ00 −
→ σ1 ⇒
h
→ . . . les états du système lors d’une exécution (tels que définis à la section 3).
σ10 −
D’après les hypothèses H1 et H2, nous avons ∀i ∈ N, σi0 (t) = σi (t) ∧ σi+1 (t) =
σi0 (t) + h. On a donc notamment σi (t) = i · h.
356
TSI. Volume 31 – no 3/2012
D ÉFINITION 9 (Trajectoire continue.). — La trajectoire continue de Ω le long de cette
exécution est la suite (σci , σbi ) telle que σci ∈ Σc et σbi ∈ Σb , et σi = (σdi , σci , σbi , i · h).
Autrement dit, une trajectoire continue est la projection sur Σc × Σb d’une exécution
du système hybride.
Du point de vue de l’environnement continu, la seule action que prend le programme est de changer la configuration σb des actionneurs en fonction des valeurs des
variables continues (via la lecture par les capteurs). Nous définissons donc la fonction
LP M : Σc × Σb → Σb qui, étant donné une valeur pour les variables continues calcule
la nouvelle configuration des actionneurs après exécution de la transition ⇒. D’après
l’hypothèse H3, la fonction LP M peut être définie comme
LP M(σc , σb ) = σb0 ⇔ JP K(σd0 , σc , σb , 0) = (σd0 , σc , σb0 , 0),
où σd0 associe à chaque variable discrète la valeur 0. En effet, l’hypothèse H3 stipule
que le résultat de JP K(σd , σc , σb , t) est le même quel que soit σd ∈ Σd et t ∈ R. Nous
choisissons donc t = 0 et σd = σ0 pour calculer JP K(σd , σc , σb , t).
La définition d’une trajectoire continue est simplifiée grâce à la fonction LP M. On
a en effet :

∀i ∈ N,
σ i+1 = LP M(σci , σbi )
b
σci+1 =%F i+1 (σci , h)
σ
b
Malheureusement, la fonction LP M n’est souvent pas calculable, donc la trajectoire
continue d’un système hybride n’est pas calculable. En suivant la méthodologie de
l’interprétation abstraite, nous allons calculer une trajectoire abstraite, que nous appellerons invariant de trajectoire.
D ÉFINITION 10 (Invariant de trajectoire). — Soit Ω un système hybride. Nous dirons
N
qu’une suite d’états abstraits (σc n , σb n ) ∈ Σc × Σd est un invariant de trajectoire de Ω si et seulement si, pour toute trajectoire continue (σcn , σbn ) de Ω on a :
∀i ∈ N, σci ∈ σc i et σbi ∈ σb i .
Clairement, un invariant étant une suite infinie d’états continus abstraits, nous chercherons en priorité à calculer des invariants sous la forme de suite périodique pour en
avoir une représentation finie.
Le calcul d’une trajectoire abstraite suit le calcul des trajectoires concrètes : nous
allons définir des fonctions LP Ma et %]F qui seront des abstractions (au sens de l’interprétation abstraite, voir section 2.1) des fonction LP M et %F . On aura alors :
(
∀i ∈ N,
σb i+1 = LP Ma (σc i , σb i )
σc i+1 =%]F i+1 (σc i , h)
σb
Dans la suite de cette section, nous expliquons comment définir la fonction LP Ma ,
puis à la section 5 nous décrivons comment définir %]F et comment calculer (σc i , σb i )
pour tout i ∈ N. Intuitivement, la fonction LP M va modifier la configuration d’un actionneur en fonction des valeurs lues par les capteurs : à chaque instant, l’actionneur bi
Vérification de programmes de contrôle-commande
357
sera modifié si une instruction act.bi !c est exécutée par le programme. Nous pouvons
donc voir LP M comme une fonction booléenne qui décide, pour chaque instruction de
type act, si elle va être exécutée. La construction de la fonction abstraite LP Ma vient
de cette constatation.
4.3. Abstraction des fonctions booléennes
Dans cette section, nous définissons un algorithme d’abstraction des fonctions
réelles à valeur dans B = {0, 1} par une représentation sous forme de k-tree. Soit
donc φ : D → B une fonction booléenne 5 définie sur un hyper-rectangle D ∈ IR n .
Nous définissons d’abord notre notion d’abstraction de φ sous forme d’un k-tree puis
nous donnons l’algorithme permettant de calculer ce k-tree.
4.3.1. Représentation d’une fonction booléenne
Nous allons abstraire une fonction booléenne par sa représentation spatiale, c’està-dire un recouvrement de son domaine de définition en un ensemble de rectangles tel
que la fonction est constante sur chaque rectangle. Rappelons
qu’un recouvrement
d’un hyper-rectangle b ∈ IR n est un ensemble I(b) = b1 , . . . , bm d’éléments
de IR n tels que b = ∪m
i=1 bi . Nous représenterons les recouvrements sous la forme
d’arbres réguliers appelés k-tree.
D ÉFINITION 11 (k-trees). — Un k-tree de dimension n est un graphe dirigé, acyclique, ayant une racine unique et deux types de nœuds :
– les nœuds non terminaux de la forme N (b), avec b ∈ IR n ;
– les nœud terminaux de la forme V (v) avec v ∈ {0, 1, >};
et tel que pour tout b ∈ IR n , le nœud N (b) a soit un nœud fils de la forme V (v) soit m
nœuds fils non terminaux N1 (b1 ), N2 (b2 ), . . . , Nm (bm ) tels que {bi : i ∈ [1, m]}
est un recouvrement de b. La racine d’un k-tree T doit être un nœud non terminal, et
on dira que T est de domaine b, noté dom(T ) = b, si son nœud racine est N (b).
E XEMPLE 12. — La figure 7 montre un k-tree de dimension 2 et de profondeur 3. Les
nœuds N (resp. V ) sont représentés par des rectangles (resp. cercles).
Intuitivement, un k-tree T est la représentation de toutes les fonctions booléennes
f telles que, si T possède un nœud N (b) avec un seul nœud fils V (v), alors f vérifie
f (x) v v pour tout x ∈ b. L’ordre v est ici l’ordre sur le treillis abstrait B⊥ : si
v ∈ {0, 1}, on devra alors avoir f (x) = v, et si v = top, alors la valeur de f (x)
est inconnue. Pour tout k-tree T de domaine D ∈ IR n , et pour tout x ∈ D, on
note V (x) = v | ∃N (b0 ) ∈ T, x ∈ b0 et N (b0 ) a un seul fils V (v) l’ensemble des
5. Notons que nous n’imposons aucune hypothèse de régularité à φ pour que cette abstraction existe. Dans
la suite, φ sera la sémantique d’un programme qui est clairement non continue en présence de tests par
exemple.
358
TSI. Volume 31 – no 3/2012
[0, 10] × [0, 10]
[0, 5] × [0, 5]
[0, 5] × [5, 10]
1
0
[5, 10] × [0, 5]
[5, 10] × [5, 10]
0
[5, 7.5] × [0, 2.5]
[5, 7.5] × [2.5, 5] [7.5, 10] × [0, 2.5]
�
0
1
[7.5, 10] × [2.5, 5]
�
Figure 7. Exemple d’un k-tree de dimension 2 et de profondeur 3
F
feuilles de T dont le domaine contient x. On note aussi T (x) = v∈V (x) v la valeur
associée à x dans le k-tree T .
Ainsi, si T est le k-tree de la figure 7, on a : T (3, 1.5) = 1 et T (6, 1.2) = >.
D ÉFINITION 13 (Représentation d’une fonction booléenne). — Soit D ∈ IR n et
f : D → B une fonction booléenne. On dira qu’un k-tree T de dimension n est une
représentation de f si et seulement si ∀x ∈ D, f (x) v T (x).
Clairement, il n’existe pas une unique représentation pour un fonction booléenne
n
f . En particulier, si
on note dom(f ) ⊆ R le domaine de définition de f , alors le
k-tree N dom(f ) − V (>), i.e. le k-tree avec un nœud racine et un nœud terminal
valant >, est toujours une représentation de f . Pour distinguer deux représentations
différentes d’une même fonction f , nous introduisons une relation de pré-ordre sur
l’ensemble des k-trees qui est compatible avec la notion naturelle de précision de
la représentation : on dira qu’une représentation est plus précise qu’une autre si elle
renvoie moins souvent la valeur >.
D ÉFINITION 14 (Précision de la représentation : préordre sur les graphes). — Soit T
et T 0 deux k-trees avec dom(T ) = dom(T 0 ) = D. On dira que T 0 est plus précis que
T si et seulement si ∀x ∈ D, T (x0 ) v T (x). On notera alors T 0 T . La relation est un pré-ordre sur l’ensemble des k-trees de même domaine.
E XEMPLE 15. — Le k-tree de la figure 7 est plus précis que le k-tree suivant :
[0, 10] × [0, 10]
[0, 5] × [0, 5]
[0, 5] × [5, 10]
[5, 10] × [0, 5]
[5, 10] × [5, 10]
1
�
�
0
R EMARQUE 16. — Le pré-ordre n’est pas un ordre partiel car nous n’avons pas
défini de forme normale sur les k-trees. Cette forme normale est facile à définir :
Vérification de programmes de contrôle-commande
359
entre deux k-trees T et T 0 vérifiant T T 0 et T 0 T , il suffit par exemple de
prendre celui de profondeur minimale. Le pré-ordre devient alors un ordre partiel.
Nous ne détaillons pas le mécanisme de normalisation des k-tree, mais dans notre
implémentation, nous calculons toujours les formes normales.
4.3.2. Algorithme d’abstraction d’une fonction booléenne
Nous montrons maintenant comment on peut construire un k-tree qui soit une
représentation d’une fonction booléenne φ : D → B, avec D ∈ IR n . Pour cela,
nous utiliserons la fonction d’inclusion, ou fonction abstraite, pour φ, c’est-à-dire une
fonction [φ] : IR n → B⊥ telle que :
∀b ∈ IR n , α {φ(x) : x ∈ b} v [φ](b)
(2)
où α : P(B) :→ B⊥ est l’abstraction classique des ensembles de valeurs booléennes
vers le treillis abstrait B⊥ et v est l’ordre partiel sur B⊥ .
E XEMPLE 17. — Soit φ : R2 → B la fonction définie par : ∀x, y ∈ R2 , φ(x, y) = 1
si x = y, φ(x, y) = 0 sinon. La fonction [φ] : IR 2 → B⊥ définie par [φ]([x] , [y]) = 0
si [x] ∩ [y] = ∅ et φ([x] , [y]) = > sinon, est une fonction d’inclusion pour φ.
Nous n’expliquons pas comment obtenir cette fonction d’inclusion pour toute fonction
φ : Rn → B. Intuitivement, les calculs numériques effectués dans φ seront traduits en
leurs équivalents sur le domaine des intervalles, et les tests seront sur-approximés. À
l’aide d’une fonction d’inclusion [φ] pour une fonction φ : D → B avec D ⊆ Rn , on
peut construire un k-tree représentant φ.
D ÉFINITION 18 (Calcul de la représentation d’une fonction booléenne). — Soit
n ∈ N et D ∈ IR n un domaine borné. Soit une fonction φ : D → B et soit
[φ] : IR n → B⊥ une fonction d’inclusion pour φ. Soit Nmax ∈ N une profondeur
maximale. On définit alors Tφ le k-tree de profondeur maximale Nmax représentant
φ par : Tφ = ConstruireKtree([φ], D, 0, Nmax ), où ConstruireKtree est
la fonction donnée par l’algorithme 1.
Remarquons que la fonction ConstruireKtree est décroissante en Nmax : plus
Nmax est élevé, plus le k-tree construit est précis.
P ROPOSITION 19. — Soit D ⊆ Rn et φ : D → B une fonction booléenne. Si [φ] est une fonction d’inclusion pour φ, alors pour tout Nmax ∈ N,
T =ConstruireKtree([φ],D,1,Nmax ) est une représentation de φ, c’est-àdire que pour tout x ∈ D, on a φ(x) v T (x).
4.4. Application à l’abstraction des transitions discrètes
Nous expliquons maintenant comment on peut utiliser l’algorithme de la section
4.3.2 pour obtenir une abstraction de la fonction LP M, étape préliminaire au calcul d’invariant sur les trajectoires. Intuitivement, pour chaque instruction du type act.bi !b,
nous allons générer un k-tree qui sera une représentation de la fonction renvoyant 1 si
360
TSI. Volume 31 – no 3/2012
Algorithme 1: ConstruireKtree
Entrées : [φ] : IR n → B⊥ ;
Fonction à abstraire
Entrées : D ⊆ IR n ;
Domaine de définition
Entrées : N ∈ N;
Précision actuelle
Entrées : Nmax ∈ N;
Précision maximale
Sorties : T de domaine D et de hauteur maximale Nmax − N telle que
∀x ∈ D, φ(x) v T (x)
début
x = [φ](D);
si x = > ∧ N < Nmax alors
Construite un recouvrement list de D;
res = N (D);
pour tous les élément l ∈ list faire
aux = ConstruireKtree([φ], l, N + 1, Nmax );
res = N (D) :: aux;
sinon
res = N (D) :: V (x);
retourner res
l’instruction est exécutée et 0 sinon. On pourra alors facilement construire l’abstraction de LP M : étant donné un état continu, on teste pour chaque instruction act.bi !b
si elle sera exécutée (grâce au k-tree correspondant), puis on met à jour la configuration des actionneurs en fonction de chacun de ces résultats. Le point important de
cette méthode est donc la construction d’une fonction d’inclusion booléenne qui teste
l’accessibilité d’une instruction en fonction des entrées continues du programme.
La fonction de test d’accessibilité est définie ainsi : étant donné un programme P
et une instruction à atteindre, on construit dans un premier temps le graphe de flot
de contrôle du programme puis on effectue une analyse statique par interprétation
abstraite en avant des états accessibles. Les instructions arithmétiques sont évaluées
en utilisant l’arithmétique d’intervalle, et les tests sont sur-approximés. Nous ne détaillons pas d’avantage le principe de l’analyse d’accessibilité, pour plus de détails sur
ce sujet très classique, on pourra lire (Cousot, Cousot, 1977 ; 1994).
D ÉFINITION 20 (Abstraction de la fonction LP M). — Soit Ω un système hybride
dont le programme est P . Pour tout instructions act.bi !b de P , on note Ti,b le k-tree
construit tel que décrit précédemment et qui décide de l’atteignabilité de l’instruction
act.bi !b. Alors, la fonction LP Ma : Σc × Σb → Σb définie par :
(
LP Ma (σc , σb ) = λbi .
est l’abstraction de LP M.
σb (bi )
Ti,b (σc (y))
si Ti,b (σc (y)) = 0
sinon
Vérification de programmes de contrôle-commande
361
Figure 8. k-tree obtenu pour la ligne 17 du programme de la figure 4
P ROPOSITION 21. — La fonction LP Ma est une abstraction correcte de la fonction
LP M :
∀σc ∈ Σc , σb ∈ Σb , ∀σc ∈ σc , σb ∈ σb , LP M(σc , σb ) ∈ LP Ma (σc , σb ) .
Dans cette section, nous avons donc construit à partir d’un programme H-SIMPLE
une fonction LP Ma qui est une abstraction correcte de l’effet du programme sur les actionneurs. Cette fonction peut être vue comme une reconstruction, à partir de P , de la
structure de contrôle de l’algorithme de contrôle-commande : elle décide quelle action
doit être effectuée en fonction de la position spatiale de l’environnement continu. La
technique de génération des k-trees a été implémentée dans un analyseur statique qui
utilise Newspeak (Hymans, Levillain, 2008). Nous montrons dans (Bouissou, 2008)
plusieurs exemples de k-trees obtenus pour différents programmes de contrôle. La
figure 8 montre le k-tree obtenu pour l’instruction de la ligne 17 du programme de
contrôle du système des deux réservoirs donné à la figure 4. La zone grise représente
la zone telle que le k-tree renvoie 1 (l’instruction est atteinte), la zone noire celle où le
k-tree renvoie > (l’instruction peut-être atteinte) et la zone blanche celle où le k-tree
renvoie 0 (l’instruction n’est pas atteinte).
Remarquons que l’analyse d’accessibilité d’instructions de programmes impératifs
est un sujet classique, que l’on peut traiter via les travaux portant sur la terminaison de
programmes et les preuves de propriétés de sûreté (Cook et al., 2006a ; 2007 ; Cousot, 2005), ou encore l’analyse de code mort (Chen et al., 1997), souvent très utilisée
TSI. Volume 31 – no 3/2012
362
en compilation. Cependant, toutes ces analyses fournissent une sur-approximation de
l’ensemble des instructions exécutées. Pour que l’abstraction de l’évolution continue
soit précise, il faut que nous obtenions également une sous-approximation des instructions accessibles, c’est-à-dire l’ensemble des instructions qui seront exécutées pour
toutes les entrées du domaine. Dans l’idéal, la différence entre la sur-approximation
et la sous-approximation doit être la plus faible possible. Nous avons donc préféré
développer un nouvel outil permettant de calculer à la fois la sur-approximation et la
sous-approximation de telle sorte que l’écart entre les deux soit un des paramètres de
l’analyse.
5. Génération de trajectoire abstraite
Dans cette section, nous expliquons comment, à partir des k-tree produits par l’algorithme de la section 4, nous construisons des invariants de trajectoire pour un système hybride. Nous avons vu (définition 20) que ces k-trees servent à définir une
abstraction de la fonction LP M. Nous expliquons dans un premier temps (section 5.1)
comment la théorie de l’intégration garantie fournit des abstractions de la fonction
%F . Puis (section 5.2), nous montrons comment calculer les invariants de trajectoire,
en recherchant des motifs périodiques dans ces trajectoires.
5.1. Abstraction de la fonction d’avancement du temps
Rappelons la définition de la fonction d’avancement du temps %F :
%F :
Σc × R+
(σc , h)
→
7→
Σc
.
y∞ (h) où y∞ est la solution de l’EDO ẏ = F (y), y(0) = σc (~
y)
Une abstraction de %F doit donc être une fonction [F ] : Σc × R+ → Σc telle que :
∀σc ∈ Σc , ∀σc ∈ σc , y∞ (h) ∈ [F ](σc , h) .
(3)
Autrement dit, [F ](σ, h) doit contenir toutes les solutions en h de l’EDO ẏ =
F (y) avec une valeur initiale σc (~y ) ∈ σc (~y ). La théorie de l’intégration garantie
d’équations différentielles (Nedialkov et al., 1999) nous montre qu’il est possible de
calculer automatiquement ces sur-approximations des solutions d’EDO. En particulier, la librairie GRKLib (Bouissou, Martel, 2007) fournit un moyen automatique de
calculer une fonction [F ] monotone vérifiant les conditions de l’équation (3). Remarquons que cette construction ne suppose pas que la fonction F soit linéaire ou linéaire
par morceaux : il suffit que F soit continue et suffisamment dérivable. Nous ne détaillons pas plus la théorie de l’intégration garantie, il nous suffit dans cet article de
savoir que la construction de la fonction [F ] est possible. Pour plus de détails, nous
conseillons la lecture des articles (Nedialkov et al., 1999) et (Nedialkov, 2006).
Vérification de programmes de contrôle-commande
363
5.2. Calcul d’invariants : à la recherche de boucle
Munis des fonctions abstraites JP Ka et [F ], abstractions respectives de JP K et %F ,
nous pouvons désormais facilement calculer un invariant de trajectoire pour un système hybride. Rappelons qu’un invariant de trajectoire est une suite d’éléments absN
traits (σc n , σb n ) ∈ Σc × Σb vérifiant, pour toute trajectoire continue (σcn , σbn ),
∀i ∈ N, σci ∈ σc i et σbi ∈ σb i .
Clairement, si σc 0 et σb 0 sont des abstractions de l’ensemble des états initiaux du
système, alors la suite (σc n , σb n ) définie par :
σb i+1
σc i+1
=
=
i
i
LP
S Ma (σc , σbi )
[Fσb ](σc , h) | σb ∈ (σc i+1 )
est un invariant de trajectoire. En effet, pour calculer la nouvelle configuration des actionneurs σb i+1 , on applique l’abstraction LP Ma de LP M, puis pour calculer σc i+1 , on
suit toutes les dynamiques possibles, c’est-à-dire toutes les dynamiques caractérisées
par une configuration σb ∈ σb i+1 . Enfin, on fait l’union de toutes ces dynamiques
pour obtenir σc i+1 . D’après les propriétés du sûreté des fonctions LP Ma et [F ], on
a bien, pour toute trajectoire continue (σci , σbi ) du système : ∀i ∈ N, σbi ∈ σb i et
σci ∈ σc i . On peut donc se servir de la suite (σc i ) pour tester (par exemple) si une
région interdite est atteinte. Cependant, cette suite n’est pas suffisante pour montrer
qu’une région interdite n’est jamais atteinte : comme l’élément σc i donne la position
de l’environnement continu à l’instant i × h, il faudrait calculer l’ensemble (infini) des
éléments de la suite pour prouver que la région n’est jamais atteinte. Les techniques
classiques d’analyse de systèmes hybrides se contentent de calculer les régions atteignables à temps borné, et peuvent donc montrer que la région n’est jamais atteinte sur
l’intervalle [0, τ ], pour τ fixé. Dans le reste de cet article, nous allons montrer qu’il
est possible de calculer en temps fini un invariant donnant une sur-approximation des
trajectoires concrètes pour un temps non borné.
Notons désormais Fh la fonction Fh : Σc × Σb → Σc × Σb telle que
∀n ∈ N, σc n+1 , σb n+1 = Fh σc n , σb n . Nous cherchons donc à calculer la
suite des itérées de Fh : Fh n (σc 0 , σb 0 ). Pour obtenir des invariants à temps non
borné, nous allons chercher des motifs périodiques dans cette suite. En particulier,
nous détecterons le cas où la suite est ultimement périodique, c’est-à-dire telle qu’il
existe N ∈ N (le rang) et K ∈ N (la période) tels que ∀n ∈ N, n ≥ N ⇒
Fh (n+K) (σc 0 , σb 0 ) = Fh (n) (σc 0 , σb 0 ). Si la suite n’est pas périodique, nous allons calculer une sur-approximation périodique de cette suite. Pour cela, nous allons
d’abord détecter le cycle, c’est-à-dire calculer les valeurs de N et K (en section 5.2.1),
puis nous calculerons les valeurs de σc n et σb n (en section 5.2.2).
5.2.1. Détection d’un cycle
Pour détecter le cycle, c’est-à-dire trouver la période de la suite Fh n , nous utilisons l’algorithme 2. À partir de l’état initial (σc 0 , σb 0 ), l’algorithme construit itérativement la suite (σc n , σb n ) : en partant d’une suite constante égale à (σc 0 , σb 0 ), on
calcule à chaque étape le prochain élément s = (σc , σb ) = Fh (σc i , σb i ), puis on
364
TSI. Volume 31 – no 3/2012
teste si un cycle existe. Si on trouve k ≤ i tel que σc v σc i et σb v σb i , alors il
existe un cycle de rang k et de période n−k + 1 : on peut donc arrêter le calcul. Sinon,
on cherche un élément de la suite qui soit proche de (σc , σb ), c’est-à-dire un élément
dont la distance 6 à s est inférieure à α. Si cet élément existe, cela signifie que l’on a
déjà calculé l’évolution du système depuis un état proche de s, on peut donc « forcer »
le cycle en modifiant la valeur de la suite : σc k = σc k t σc et σb k = σb k t σb . On
dit alors qu’on a détecté un « cycle approché » et on termine le calcul. Si aucun cycle
n’est détecté, on modifie la valeur suivante de la suite : σc i+1 = σc et σb i+1 = σb ,
puis on continue le calcul en partant du rang i + 1.
N
Le résultat de cet algorithme est donc une suite (σc n , σb n ) ∈ Σc × Σb ainsi
qu’un rang N ∈ N et une période K ∈ N . La suite n’est pas encore un invariant
pour les trajectoires du système hybride, mais le théorème 22 montre que c’est une
abstraction correcte des trajectoires jusqu’au temps t = (N − 1) × h.
T HÉORÈME 22. — Soit (σc n , σb n , K, N ) les valeurs calculées par l’algorithme
DetectionCycle. Alors, pour toute trajectoire continue (σcn , σbn ), on a :
∀k ∈ [0, N − 1], σck ∈ σc k .
Remarquons que l’algorithme ne fournit que des sur-approximations des trajectoires jusqu’au temps (N · h) car, lors de la détection d’un cycle approché, la valeur
de σc N peut avoir changé, il faut donc propager ce changement pour les autres éléments de la suite. C’est ce que nous faisons à la section 5.2.2.
Dans l’algorithme 2, le paramètre α est une heuristique permettant de contrôler
l’efficacité et la précision de l’algorithme. Plus α est grand, plus vite l’algorithme
termine (un cycle approché est détecté rapidement), mais l’approximation sera également plus grande. Un choix trop grand pour α est donc une source potentielle de
fausses alarmes : l’algorithme unifie deux états continus éloignés et introduit ainsi des
comportements nouveaux. Une autre heuristique nécessaire pour cet algorithme est
la stratégie de widening. En effet, la terminaison de l’algorithme 2 n’est pas garantie car il est possible qu’un cycle approché avec un paramètre α donné n’existe pas.
Pour contrer ce problème, nous utiliserons donc une technique proche du widening :
toutes les p itérations (p étant un paramètre fixé par l’utilisateur), α est augmenté jusqu’à atteindre α = +∞. Ainsi, on garantit la terminaison de l’algorithme, mais en
introduisant deux nouvelles heuristiques : le choix de p et la vitesse d’augmentation
de α. De ces heuristiques dépendent la vitesse de convergence de l’algorithme mais
également sa précision : en augmentant trop vite α, on peut introduire de faux comportements dans le système.
6. La distance que nous utilisons ici ne joue pas un rôle fondamental
dans la correction de l’algorithme.
Nous supposons donc avoir une fonction dS : Σc × Σb × Σc × Σb → R+ donnant la distance
entre deux états. En pratique, nous utiliserons la distance de Hausdorff, facile à calculer sur le domaine des
intervalles (voir (Bouissou, 2009) pour une définition exacte de la distance dS ).
Vérification de programmes de contrôle-commande
365
Algorithme 2: DetectionCycle : détection et création d’un cycle dans la
trajectoire abstraite
Entrées : σc0 , σb0 , α ;
État initial et seuil
Entrées : Fh ;
Fonction de transfert abstraite
Sorties : Suites σc n , σb n , rang N et période K
début
σc n = σc0 ; σb n = σb0 ;
i = 0; K = 0;
tant que K = 0 faire
s = (σc , σb ) = Fh (σc i , σb i );
si ∃k ≤ i : s v (σc k , σn k ) alors
N = k; K = i − k + 1;
sinon
d = min{dS s, (σc k , σb k ) : k ≤ i};
si d > α alors
(σc i+1 , σb i+1 ) = s;
i = i + 1;
sinon
Choisit k ≤ i tel que dS (s, φ̃(k)) < α;
(σc k , σb k ) = σc k , σb k t s;
N = k; K = i − k + 1;
retourner φ, N, K
5.2.2. Calcul des valeurs
Après avoir détecté un cycle (ou un cycle approché) dans la trajectoire abstraite, il
faut calculer les valeurs des états abstraits pour tout instant k × h, k ∈ N. Pour cela,
on définit un opérateur FS : (Σc × Σb )N → (Σc × Σb )N sur les suites à valeurs dans
Σc × Σb qui propage la fonction de transfert abstraite Fh d’un élément de la suite à
l’autre. Cet opérateur dépend du rang N et de la période K calculés par l’algorithme 2,
et est défini par, pour tout φ ∈ (Σc × Σb )N , FS (φ) = φ0 avec :


φ(n)
∀n ∈ N, φ0 (n) = Fh (φ(N )) t Fh (φ(N + K))


Fh (φ0 (n − 1))
si n < N
si n = N
sinon
mod K .
P ROPOSITION 23. — La fonction FS est monotone sur le treillis complet des suites
(Σc × Σb )N muni de l’ordre point-à-point φ1 v φ2 ⇔ ∀n ∈ N, φ1 (n) v φ2 (n).
La proposition 23 nous permet de conclure que la fonction Fs a un plus petit
point fixe plus grand que (σcn , σbn ), la suite calculée par l’algorithme 2. En utilisant
l’itération de Kleene, on peut calculer ce point fixe. Le théorème 24 montre que ce
point fixe est un invariant des trajectoires d’un système hybride.
366
TSI. Volume 31 – no 3/2012
T HÉORÈME 24. — Soit Ω un système hybride et soit φ = (σc n , σb n ) la suite fournie
n
n
par l’algorithme 2. Soit (σc0 , σb0 ) la suite d’états abstraits, plus petit point fixe de
la fonction Fs supérieur à φ. Alors, pour toute trajectoire continue (σcn , σbn ) de Ω, on
n
n
a ∀n ∈ N, σcn ∈ σc0 et σbn ∈ σb0 .
n
n
Remarquons que la suite (σc0 , σb0 ) dans le théorème 24 est ultimement périodique, on peut donc la représenter de manière finie. Elle fournit donc un invariant fini
des trajectoires continues pour des temps non bornés.
Clairement, il est possible ici aussi d’utiliser le widening pour accélérer le calcul
du point fixe de Fs : nous utilisons le widening classique sur Σc , et l’appliquons
sur l’élément σc N de la suite, c’est-à-dire sur le premier élément de la trajectoire
périodique. Ceci introduit une autre source de sur-approximation pour les trajectoires
abstraites, mais garantit le calcul en un temps fini.
Dans cette section, nous avons donc montré comment calculer des invariants des
trajectoires continues pour des temps non borné. En partant d’une abstraction du programme sous forme d’un ensemble de k-trees (encodés dans la fonction LP Ma ), notre
algorithme essaie de détecter des cycles dans l’évolution des variables continues, en
modifiant les trajectoires abstraites pour créer de tels cycles si ils n’existent pas. Cette
technique a également été implémentée, nous obtenons pour des exemples classiques
de systèmes hybrides des résultats satisfaisants (voir (Bouissou, 2009) pour des résultats). La figure 9 montre l’invariant généré pour le problème des deux réservoirs avec
anticipation donné à la figure 4.
6. Travaux connexes
Ce travail étant à cheval entre plusieurs disciplines (sémantique et analyse des
langages de programmation, intégration garantie d’équations différentielles, modélisation et analyse de systèmes hybrides), il existe de nombreux travaux traitant d’au
moins une partie de ces sujets. Nous essayons ici de présenter quelques travaux importants sur ces différents thèmes.
Modélisation et analyse de systèmes hybrides. Les travaux fondateurs sur les automates hybrides (Alur et al., 1992 ; 1995) définissent un système hybride comme un
automate hybride, c’est-à-dire une extension des automates temporisés dans lesquels
les variables peuvent évoluer selon une équation différentielle ordinaire. Comme nous
l’avons déjà évoqué, la grande différence avec le modèle H-SIMPLE proposé dans
cet article est que l’exécution d’un automate hybride est dirigée par les évènements,
c’est-à-dire qu’un changement d’état discret a lieu dès lors qu’une garde est validée.
Au contraire, dans notre modèle, les changements ont lieu à des instants prédéfinis
et donnés par les instructions wait du système. Il semble possible d’encoder les
programmes H-SIMPLE en des automates hybrides en ajoutant des gardes portant
sur le temps à chacune des transitions possibles, cet encodage serait cependant
probablement peu efficace car le nombre d’états discrets risque d’être très important
dans le cadre d’un programme de grande taille. Les outils d’analyse de système
Vérification de programmes de contrôle-commande
367
9
8
σc0
7
6
5
3
4
5
6
7
8
9
Figure 9. Trajectoire abstraite obtenue pour le programme de la figure 4. Chaque
carré représente un état continu abstrait (i.e. un couple d’intervalles pour h1 et h2 .
Les différents styles de traits représentent les différentes dynamiques (en fonction de
l’ouverture des vannes V1 et V2 )
hybride, des premiers travaux d’Henzinger (Henzinger et al., 1998) aux outils les
plus récents (Frehse, 2005 ; Frehse et al., 2011), cherchent à calculer les régions
atteignables par un automate hybride à temps borné uniquement. Tous ces outils
supposent que les dynamiques ainsi que les gardes du système hybride sont linéaires,
ce qui est une limitation forte de leur utilisation pour des programmes industriels.
Notons que les travaux les plus récents (Guernic, Girard, 2008 ; Girard, 2005) utilisent
le domaine des zonotopes pour encoder les ensembles de valeurs, domaine également
utilisé pour l’analyse statique de programmes numériques (Goubault, Putot, 2011).
Intégration garantie d’équations différentielles. Outre GRKLib (Bouissou, Martel,
2007), il existe plusieurs outils permettant de calculer des solutions garanties d’équations différentielles. Citons notamment les travaux fondateurs de Nedialkov sur le
logiciel VNODE (Nedialkov et al., 1999), qui calcule les bornes sur les solutions en
utilisant un développement de Taylor de l’équation différentielle, la série de Taylor
étant calculée par différentiation automatique. Ces idées ont été reprises et améliorées
dans les outils VSPODE (Lin, Stadtherr, 2007), qui utilisent des modèles de Taylor
pour gérer au mieux les dépendances de la solution à des paramètres inconnus, et
VALENCIA-IVP (Rauh et al., 2006). Notons que la plupart de ces outils utilisent
encore l’arithmétique d’intervalle pour calculer ces solutions garanties, et que les
368
TSI. Volume 31 – no 3/2012
limitations portant sur le type de dynamique sont faibles : les outils gèrent aussi
bien les dynamiques linéaires que non linéaires. Des techniques récentes permettent
de gérer les dynamiques non linéaires avec les outils développés pour les systèmes
hybrides : on parle alors d’hybridisation des dynamiques non linéaires (Asarin et al.,
2007 ; Dang et al., 2010).
Lien entre langages synchrones et modèles hybrides. La théorie des systèmes hybrides
est depuis le début développée essentiellement par des spécialistes de l’automatique,
il existe peu de liens entre la sémantique des langages de programmation et la théorie
des systèmes hybrides. Ma thèse a été un des premiers travaux dans cette direction,
plusieurs autres aspects ont depuis été développés. L’action INRIA Synchronics 7
vise à étudier le lien entre les langages synchrones (Lustre notamment) et les systèmes hybrides. Ainsi, des nouvelles sémantiques de modèles hybrides ont été proposées (Benveniste et al., 2011a ; 2011b) : ces travaux visent à apporter un cadre plus
proche des langages de programmation aux modèles classiques de systèmes hybrides.
De même, le lien entre Lustre et l’environnement physique a été étudié dans l’article (Briand, Jeannet, 2009) qui ont développé une méthode d’analyse ad hoc pour
le cas d’un automate hybride « synchrone ». Enfin, citons les travaux de (Chapoutot,
2008) qui vise à donner une sémantique formelle à Simulink, qui est probablement le
langage de modélisation de systèmes hybrides le plus utilisé mais également le moins
étudié.
7. Conclusion
Dans cet article, nous avons présenté un nouveau modèle pour représenter des systèmes hybrides, spécialement conçu pour décrire fidèlement le fonctionnement des
programmes de contrôle-commande. Pour cela, nous avons choisi de partir d’un langage de programmation simple, impératif, et avons ajouté trois primitives permettant
de gérer la communication entre le programme et son environnement physique. La
sémantique opérationnelle de ce langage est une extension simple de la sémantique
opérationnelle du langage initial, nous rajoutons essentiellement deux nouveaux types
de variables et une transition de délai qui modifie l’état de l’environnement physique
en faisant avancer le temps continu. Nous avons ensuite défini une méthode d’analyse permettant de calculer des sur-approximations des trajectoires de l’environnement
physique pour des temps non bornés. Pour cela, nous avons transformé le calcul de ces
trajectoires en le calcul d’un point fixe d’une fonction monotone opérant sur les suites
périodiques d’états abstraits. Cette fonction est construite à partir d’une abstraction
du programme sous forme d’un ensemble de k-trees et d’abstractions des dynamiques
continues calculées grâce à la théorie de l’intégration garantie.
7. http://synchronics.wiki.irisa.fr/tiki-index.php
Vérification de programmes de contrôle-commande
369
Ces techniques ont fait l’objet d’une implémentation et les résultats expérimentaux
(qui sont disponibles dans (Bouissou, 2008) et (Bouissou, 2009)) montrent l’intérêt de
ces techniques spécialisées pour des programmes de contrôle-commande.
Il existe évidemment de nombreux points à améliorer pour rendre ces techniques
plus performantes et plus efficaces pour l’analyse de systèmes de contrôle-commande
industriels. Nous souhaitons notamment prendre en compte des actionneurs numériques, ce qui nécessite de définir un calcul de point fixe mixte entre le programme
et l’environnement continu. Nous voulons également utiliser des domaines relationnels pour l’intégration garantie d’équation différentielle (en nous inspirant du travail
de (Combastel, 2005)) pour améliorer le logiciel HybridFluctuat (Bouissou et al.,
2009) qui a débuté les travaux en ce sens.
Le travail futur qui nous semble le plus important est la question d’un widening
temporel, c’est-à-dire un opérateur permettant, en fonction des n premières étapes
de calcul, de sur-approximer l’évolution continue jusqu’à t = +∞. Pour l’instant,
nous recherchons des cycles dans l’évolution des variables continues pour pouvoir
traiter le temps non borné, cela nous oblige cependant à effectuer de grosses surapproximations dans les cas où ces phénomènes périodiques ne sont pas présents.
Plusieurs pistes nous semblent intéressantes pour améliorer notre analyse.
Si aucun cycle n’apparaît, on peut essayer de détecter dans l’évolution continue
une progression selon une suite arithmético-géométrique. Nous nous inspirons pour
cela des techniques développées dans (Feret, 2005) pour l’analyse des codes critiques embarqués : le domaine des progressions arithmético-géométriques relie les
valeurs des variables à l’intérieur d’une boucle avec un compteur i qui décrit le
nombre d’itérations de la boucle. Dans notre cas, on essaiera de relier la valeur des
variables avec le temps d’exécution du programme. Le domaine des progressions
arithmético-géométriques ne permet cependant que de détecter des progressions relativement simples pour les variables continues. Si les équations différentielles sont
fortement non linéaires, les sur-approximations risquent d’être trop importantes et
la précision trop faible. Une autre solution est alors d’utiliser les chaînes de récurrences (Bachmann et al., 1994 ; Pop, 2006), qui sont une extension des progressions
arithmético-géométriques. Les chaînes de récurrences ont été utilisées en compilation
pour déterminer à l’avance le nombre d’itérations dans une boucle (Pop, 2006). Les
motifs de la chaîne de récurrence sont calculés dynamiquement en fonction des valeurs successives prises par le système en x0 , x0 + h, x0 + 2h, . . . Les évolutions que
l’on peut obtenir sont plus variées qu’avec le domaine des progressions arithmeticogéométriques et on pourrait, en utilisant ces chaînes de récurrence, prédire la position
des variables continues pour tout instant de la forme t0 + i ∗ h, où h est l’intervalle de
temps entre deux mesures et i l’indice de la mesure.
Enfin, nous avons commencé des travaux (Bouissou, Seladji, Chapoutot, 2012)
sur l’utilisation de techniques d’extrapolation numérique pour améliorer le calcul de
point fixe en interprétation abstraite. Il nous semble possible d’utiliser des techniques
similaires pour calculer automatiquement, et rapidement, les limites des solutions des
équations différentielles, et ainsi définir un widening continu.
370
TSI. Volume 31 – no 3/2012
Bibliographie
Alur R., Courcoubetis C., Halbwachs N., Henzinger T. A., Ho P. H., et al. (1995). The algorithmic analysis of hybrid systems. Theoretical Computer Science, vol. 138, no 1, p. 3–34.
Alur R., Courcoubetis C., Henzinger T. A., Ho P. H. (1992). Hybrid automata: An algorithmic approach to the specification and verification of hybrid systems. In Hybrid systems i,
vol. 736, p. 209-229. Springer.
Asarin E., Dang T., Girard A. (2007, January). Hybridization methods for the analysis of
nonlinear systems. Acta Inf., vol. 43, p. 451–476.
Bachmann O., Wang P., Zima E. (1994). Chains of recurrences—a method to expedite the
evaluation of closed-form functions. In International symposium on symbolic and algebraic
computation (issac’94), p. 242–249. New York, NY, USA, ACM.
Benveniste A., Bourke T., Caillaud B., Pouzet M. (2011a, April). Divide and recycle: types and
compilation for a hybrid synchronous language. In ACM SIGPLAN/SIGBED Conference
on Languages, Compilers, Tools and Theory for Embedded Systems (LCTES’11). Chicago,
USA.
Benveniste A., Bourke T., Caillaud B., Pouzet M. (2011b). Non-standard semantics of hybrid
systems modelers. Journal of Computer and System Sciences (JCSS), Special issue in honor
of Amir Pnueli, vol. 78, no 3.
Birkhoff G. (1940). Lattice theory (vol. 25). American Mathematical Society.
Bouissou O. (2008). Analyse statique par interpretation abstraite de systèmes hybrides. Thèse
de doctorat non publiée, Ecole Polytechnique.
Bouissou O. (2009). Proving the correctness of the implementation of a control-command
algorithm. In J. Palsberg, Z. Su (Eds.), SAS, vol. 5673, p. 102-119. Springer.
Bouissou O., Goubault E., Goubault-Larrecq J., Putot S. (2012). A generalization of p-boxes
to affine arithmetic. Computing, vol. 94, p. 189-201. http://dx.doi.org/10.1007/s00607-011
-0182-8 (10.1007/s00607-011-0182-8)
Bouissou O., Goubault E., Putot S., Tekkal K., Védrine F. (2009). HybridFluctuat: A static
analyzer of numerical programs within a continuous environment. In A. Bouajjani, O. Maler
(Eds.), Cav, vol. 5643, p. 620-626. Springer.
Bouissou O., Martel M. (2007). GRKLib: a guaranteed runge-kutta library. In Follow-up of
international symposium on scientific computing, computer arithmetic and validated numerics. IEEE Press.
Bouissou O., Martel M. (2008). A hybrid denotational semantics of hybrid systems. In Proceedings of the 17th european symposium on programming languages and systems (esop’08),
vol. 4960, p. 63-77. Springer.
Bouissou O., Seladji Y., Chapoutot A. (2012). Acceleration of the abstract fixpoint computation
in numerical program analysis (accepted). Journal of Symbolic Computation.
Briand X., Jeannet B. (2009). Combining control and data abstraction in the verification of
hybrid systems. In Formal methods and models for codesign, memocode’2009. IEEE.
Chapoutot A. (2008). Simulation abstraite : une analyse statique de mod‘eles simulink. Thèse
de doctorat non publiée, Ecole Polytechnique.
Vérification de programmes de contrôle-commande
371
Chen Y., Gansner E., Koutsofios E. (1997). A C++ data model supporting reachability analysis and dead code detection. In Proceedings of the 6th european software engineering
conference (ESEC/FSE 97), vol. 1301, p. 414–431. Springer. citeseer.ist.psu.edu/article/
chen98data.html
Combastel C. (2005). A state bounding observer for uncertain non-linear continuous-time
systems based on zonotopes. In 44 ieee conference on 44th ieee conference on decision and
control.
Cook B., Gotsman A., Podelski A., Rybalchenko A., Vardi M. (2007). Proving that programs
eventually do something good. SIGPLAN Notices, vol. 42, no 1, p. 265–276.
Cook B., Podelski A., Rybalchenko A. (2006a). Termination proofs for systems code. In
Proceedings of the 2006 acm sigplan conference on programming language design and
implementation (pldi’06), p. 415–426. ACM.
Cook B., Podelski A., Rybalchenko A. (2006b). Terminator: Beyond safety. In 18th international conference on computer aided verification (cav’06), vol. 4144, p. 415-418. Springer.
Cousot P. (2005). Proving program invariance and termination by parametric abstraction, lagrangian relaxation and semidefinite programming. In Proceedings of the sixth international conference on verification, model checking and abstract interpretation (vmcai’05), vol.
3385, p. 1–24. Springer. http://www.springerlink.com/content/qkufe4uekjgyja4f/
Cousot P., Cousot R. (1977). Abstract interpretation: a unified lattice model for static analysis
of programs by construction or approximation of fixpoints. In Conference record of the
fourth acm symposium on principles of programming languages (popl’77), p. 238–252.
ACM Press.
Cousot P., Cousot R. (1992a). Abstract interpretation frameworks. Journal of Logic and
Computation, vol. 2, no 4, p. 511–547.
Cousot P., Cousot R. (1992b). Comparing the Galois connection and widening/narrowing
approaches to abstract interpretation, invited paper. In Proceedings of the 4th international workshop programming language implementation and logic programming (plilp’92),
vol. 631, p. 269–295. Springer-Verlag.
Cousot P., Cousot R. (1994, 16–19 May). Higher-order abstract interpretation (and application
to comportment analysis generalizing strictness, termination, projection and PER analysis
of functional languages), invited paper. In Proceedings of the 1994 international conference
on computer languages, p. 95–112. Toulouse, France, IEEE Computer Society Press, Los
Alamitos, California.
Cousot P., Halbwachs N. (1978). Automatic discovery of linear restraints among variables of
a program. In Conference record of the fifth acm symposium on principles of programming
languages (popl’78), p. 84–97. ACM Press.
Dang T., Maler O., Testylier R. (2010). Accurate hybridization of nonlinear systems. In Proceedings of the 13th acm international conference on hybrid systems: computation and control,
p. 11–20. New York, NY, USA, ACM. http://doi.acm.org/10.1145/1755952.1755956
Feret J. (2005). The arithmetic-geometric progression abstract domain. In Proceedings of
the 6th international conference on verification, model checking and abstract interpretation
(vmcai’05), vol. 3385, p. 42–58. Springer.
Finkel R. A., Bentley J. L. (1974). Quad trees a data structure for retrieval on composite keys.
Acta Informatica, vol. 4, no 1, p. 1–9.
372
TSI. Volume 31 – no 3/2012
Frehse G. (2005). Phaver: Algorithmic verification of hybrid systems past hytech. In M. Morari,
L. Thiele (Eds.), Hybrid systems: Computation and control (HSCC 2005), vol. 3414, p. 258273. Springer.
Frehse G., Guernic C. L., Donzé A., Ray R., et al. (2011). Spaceex: Scalable verification of
hybrid systems. In Cav.
Girard A. (2005). Reachability of uncertain linear systems using zonotopes. In M. Morari,
L. Thiele (Eds.), Hybrid systems: Computation and control (HSCC 2005), vol. 3414, p. 291305.
Gonnord L., Halbwachs N. (2006). Combining Widening and Acceleration in Linear Relation
Analysis. In S. Verlag (Ed.), Static Analysis (SAS 2006), vol. 4134, p. 144-160.
Goubault E., Putot S. (2006). Static analysis of numerical algorithms. In Proceedings of the
13th international symposium on static analysis (sas’06), vol. 4134, p. 18-34. Springer.
Goubault E., Putot S. (2011). Static analysis of finite precision computations. In Proceedings of the 12th international conference on verification, model checking, and abstract interpretation, p. 232–247. Berlin, Heidelberg, Springer-Verlag. http://portal.acm.org/
citation.cfm?id=1946284.1946301
Guernic C. L., Girard A. (2008). Zonotope-hyperplane intersection for hybrid systems reachability analysis. In Proceedings of the international workshop on hybrid systems: Computation
and control (hscc’08), vol. 4981, p. 215–228. Springer.
Henzinger T. A. (1996). The theory of hybrid automata. In Symposium on logic in computer
science, p. 278–292. IEEE Computer Society Press.
Henzinger T. A., Ho P. H., Wong-Toi H. (1998). Algorithmic analysis of nonlinear hybrid
systems. IEEE Transactions on Automatic Control, vol. 43, p. 540–554.
Henzinger T. A., Horowitz B., Majumdar R., Wong-Toi H. (2000). Beyond HYTECH: Hybrid
systems analysis using interval numerical methods. In Third international workshop on
hybrid systems: Computation and control (hscc’00), vol. 1790, p. 130-144. Springer.
Heymann M., Lin F., Meyer G., Resmerita S. (2005). Analysis of zeno behaviors in hybrid
systems. IEEE Transactions on Automatic Control, vol. 50, no 3, p. 376-384.
Hoare C. A. R. (1985). Communicating sequential processes. Prentice-Hall.
Hymans C., Levillain O. (2008). Newspeak, Doubleplussimple Minilang for Goodthinkful Static
Analysis of C. Technical Note no 2008-IW-SE-00010-1. EADS IW/SE.
Lin Y., Stadtherr M. A. (2007). Validated solutions of initial value problems for parametric odes.
Applied Numerical Mathematics, vol. 57, no 10, p. 1145 - 1162. http://www.sciencedirect
.com/science/article/B6TYD-4MHPHBR-1/2/ea22e1b99246fda7914d438dbd090738
Lygeros J., Johansson K., Simic S., Zhang J., Sastry S. (2003). Dynamical properties of hybrid
automata. IEEE Transactions on Automatic Control, vol. 48, no 1, p. 2-17.
Miné A. (2004). Weakly relational numerical abstract domains. Thèse de doctorat non publiée,
École Normale Supérieur de Paris.
Monniaux D. (2009, June). A minimalistic look at widening operators. Higher Order Symbol.
Comput., vol. 22, p. 145–154. http://dx.doi.org/10.1007/s10990-009-9046-8
Nedialkov N. (2006). Interval tools for ODEs and DAEs. Rapport technique no CAS 06-09-NN.
Dept. of Computing and Software, McMaster University.
Vérification de programmes de contrôle-commande
373
Nedialkov N., Jackson K., Corliss G. (1999). Validated solutions of initial value problems
for ordinary differential equations. Applied Mathematics and Computation, vol. 105, no 1,
p. 21–68.
Pop S. (2006). The ssa representation framework: Semantics, analyses and gcc implementation.
Thèse de doctorat non publiée, Ecole des Mines de Paris.
Putot S., Goubault E., Martel M. (2003). Static analysis-based validation of floating-point computations. In Numerical software with result verification, vol. 2991, p. 306-313. Springer.
Rauh A., Auer E., Hofer E. (2006). ValEncIA-IVP: A case study of validated solvers for initial
value problems. In International symposium on scientific computing, computer arithmetic
and validated numerics. IEEE.
Schrammel P., Jeannet B. (2010). Extending abstract acceleration methods to data-flow programs with numerical inputs. Electronic Notes in Theoretical Computer Science, vol. 267,
no 1, p. 101 - 114. (Proceeding of the Second International Workshop on Numerical and
Symbolic Abstract Domains: NSAD 2010)
Winskel G. (1993). The formal semantics of programming languages: an introduction. Cambridge, MA, USA, MIT Press.
Zhang J., Johansson K., Lygeros J., Sastry S. (2001). Zeno hybrid systems. International
Journal of Robust and Nonlinear Control, vol. 11, p. 435-451.
Olivier Bouissou. est ingénieur-chercheur au sein du laboratoire LMeASI du CEA LIST. Ses
travaux portent sur l’analyse statique par interprétation abstraite de programmes critiques
embarqués, en particulier l’analyse des interactions entre le programme et son environnement
physique. Il s’intéresse notamment à la qualité des méthodes numériques utilisées pour la
simulation de cet environnement physique, et développe des techniques de simulation garantie.

Documents pareils