Notes de cours du Master ISIC
Transcription
Notes de cours du Master ISIC
Notes de cours du Master ISIC commentaires et corrections bienvenus Sarah Zennou CEA/Saclay, [email protected] 1 Introduction Ces notes de cours constituent une très brève introduction au domaine de la vérification par modèle des systèmes concurrents, également dits distribués ou réactifs. Pour une présentation plus approfondie, l’ouvrage collectif [SBB+ 99] constitue un point d’entrée très didactique. Cette technique de vérification a été mise au point dans les années 1980, fait l’objet de recherches actives durant les années 1990 et atteint une matûrité suffisante dans les années 2000 pour être utilisée industriellement dans la vérification de circuits, de protocoles réseau, etc. Le model-checking est une méthode formelle qui permet de répondre à la question : est-ce qu’un système satisfait une certaine propriété ? Répondre à cette question se fait en trois temps : Choisir un modèle La première étape consiste à décrire les aspects les plus significatifs du système par un modèle mathématique. Les principaux modèles sont les modèles asynchrones (adaptés aux systèmes concurrents), les modèles synchrones (adaptés aux circuits logiques), les modèles asynchrones avec contraintes temporelles (adaptés aux systèmes dits temps-réel), etc. Dans ce cours, nous ne parlerons que des modèles asynchrones dont le modèle est appelé de façon générique système de transitions. Spécifier la propriété sur le modèle Une fois le système modélisé, il s’agit de spécifier la propriété à vérifier par une formule de logique temporelle, c’est-à-dire une logique propositionnelle enrichie d’opérateurs modaux qui permettent de parler de suites d’exécutions du système. La logique qui nous intéresse ici est LTL (Linear Temporal Logic) qui permet d’exprimer des propriétés sur les différents états du système. D’autres logiques comme CTL (Branching Temporal Logic) par exemple permettent également d’exprimer des propriétés sur des ensembles de suites d’exécution du système. Décider si le modèle satisfait la propriété Ces deux modèles sont finalement donnés comme entrée d’un outil, le model-checker, qui va décider si oui ou non le modèle satisfait la formule. Evidemment, l’algorithme de décision sous-jacent n’existe pas pour tout modèle ni pour tout type de propriété. Il faut que le problème admette un modèle fini 1 (nombre de processus du système, nombre d’états représenté de chaque processus, domaine de valeur des variables, etc.) et il faut également se restreindre à certaines classes de propriétés. Pour une 1 certaines techniques de model-checking peuvent nénamoins être appliquées sur des sous-classes de modèles infinis représentation du système par système de transitions fini et une spécification de la propriété par une formule de LTL, un tel algorithme de décision existe (cf [VW86]). Dans le cas où le modèle ne satisfait pas la formule logique, le model-checker est également capable de fournir un contre-exemple. Le model-checker le plus répandu est SPIN [Hol03]. On peut citer également nuSMV [CCaR99] qui utilise une représentation plus symbolique que SPIN des états du système. Le reste de ces notes est dédié à la description de ces différentes phases. 2 Modèles Pour modéliser un système concurrent de n processus, il faut préalablement modéliser chaque processus par un système de transitions puis composer ces systèmes pour obtenir un produit synchronisé. 2.1 Systèmes de transitions étiquetées et produit synchonisé Le système de transitions d’un processus est un ensemble d’états qui représentent ceux du processus dont un certain état est dit initial et de transitions qui modélisent le passage d’un état à un autre sous l’effet d’une action. Definition 1 (Système de transitions étiquetées). Soit Σ un ensemble appelé alphabet d’actions. Un système de transitions étiquetées sur Σ est un triplet T = (S, s0 , →) tel que S est un ensemble d’états ; s0 ∈ S est l’état initial ; →⊆ S × Σ × S est la relation de transition a où (s, a, s0 ) ∈→ est en général noté s → s0 . En pratique, T est donné explicitement par une algèbre de processus où les transitions sont les réductions ; par un processus Promela (comme dans SPIN) où les états sont composés des points de contrôle des processus, des valeurs des variables et des états des canaux de communication ; par un réseau de Petri où un état est un marquage du réseau, etc. Une exécution du système est représentée par une suite de transitions successives depuis l’état initial2 : Definition 2 (Trace d’exécution et langage). Une trace d’exécution d’un système de transitions (S, s0 , →) est une suite σ = s0 s1 . . . où (si , ai , si+1 ) ∈→. L’ensemble des traces d’exécution est noté tr(T ) et l’ensemble des suites d’étiquettes a0 a1 . . . de traces d’exéuction est le langage de T , noté L(T ). La composition des systèmes de transitions est aussi un système de transition dit produit synchronisé : un état est un tuple composé d’un état de chaque système ; les transitions sont locales à un processus ou impliquent plusieurs participants. Elles font changer l’état de chaque participant de façon simultanée, laissant les autres inchangés. Definition 3 (Produit synchronisé de systèmes de transition). Soient n systèmes de transitions Ti = (Si , si0 , →i ) étiquetées sur Σi , i = 1, ..n. Le produit synchonisé T1 × . . . × Tn est le système de transitions T = (S, s0 , →) étiquetées sur Σ tel que (1) Σ = Σ1 ∪ . . . ∪ Σn ; (2) S = S1 × . . . × Sn avec s0 = (s10 , . . . , sn0 ) ; a (3) (s1 , . . . , sn ) → (s01 , . . . , s0n ) tel que si = s0i si a 6∈ Σi et (si , a, s0i ) ∈→i sinon. 2 il est parfois fait la distinction entre exécutions finies et infinies. Dans ce contexte, nous considèrerons uniquement des exécutions infinies. Les exécutions finies pouvant être prolongées par une suite infinie d’actions factices. Exemple de synchronisation par échanges de messages On veut modéliser un système de n processus qui interagissent par échanges de messages. Chaque processus n’est supposé lire que dans un seul canal. Soient N = {1, . . . , n} l’ensemble des noms des processus, V l’ensemble des valeurs transmissibles entre les processus. Σ l’alphabet des actions est formellement défini par Σ = {τ } ∪ {i!v | i ∈ N, v ∈ V } ∪ {?v | v ∈ V } Les actions modélisées par τ , i!v et ?v représentent respectivement un calcul interne, l’envoi d’une valeur v et la reception d’une valeur v. On note M sg = {i!v | i ∈ N, v ∈ V } l’ensemble des messages et M(M sg) le multi-ensemble sur M sg. A chaque processus de nom i est associé un système de transitions étiquetées (Si , s0i , →i ) où Si est un ensemble de couple (pi , Mi ) avec pi un état discret et Mi ∈ M(M sg) le multiensemble des messages que i a reçus entre l’état initial et l’état pi mais n’a pas encore lu. L’ensemble S = {< (p1, M1 ), . . . , (pn , Mn ) > | (pi , Mi ) ∈ Si }. A l’état initial, on suppose qu’aucun message n’a été envoyé, c’est-à-dire que l’état initial est < (p01 , ∅), . . . (p0n , ∅) >. La relation de transition dite aussi relation de réduction est définie comme suit (le cas (!) est symétrique pour j < i): τ (τ ) (pi ,Mi )→i (p0i ,Mi ) <(p1 ,M1 ),...,(pi ,Mi ),...,(pn ,Mn )>→<(p1 ,M1 ),...,(p0i ,Mi ),...,(pn ,Mn )> (!) (pi ,Mi )→i (p0i ,Mi ) <(p1 ,M1 ),...,(pi ,Mi ),...,(pj ,Mj ),...,(pn ,Mn )>→<(p1 ,M1 ),...,(p0i ,Mi ),...,(pj ,Mj ∪{v}),...(pn ,Mn )> (?) (pi ,Mi ∪{v})→i (p0i ,Mi ) <(p1 ,M1 ),...(pi ,Mi ∪{v}),...(pn ,Mn )>→<(p1 ,M1 )...(p0i ,Mi )...,(pn ,Mn )> j!v ?v Une exécution est une suite infinie d’états, c’est-à-dire que pour les états qui ne peuvent plus être réduits, on suppose boucler sur cet état. Ce modèle est asynchone puisque les envois et les réceptions de messages ne sont pas simultanés. La définition de la relation de réduction suppose que les canaux de communication entre les processus ont une taille non bornée et que les messages peuvent être réordonnés de n’importe quelle façon. Une variante de ce modèle consiste à considérer que les canaux ont une taille bornée et que les messages sont reçus dans l’ordre de leur émission. Lorsque les canaux ont une taille nulle, on parle de communication par rendez-vous. Pour modéliser des canaux bornés, considérons size : N → ω la fonction qui à un nom de processus associe la taille de son canal de lecture. Chaque état < (p1 , M1 ), . . . , (pn , Mn ) > est donc tel que chaque Mi est un mot de M sg ≤ω et satisfait la contrainte |Mi | ≤ size(i). L’état initial est le même que dans le cas non borné. La relation de réduction devient (τrdv admet une règle symétrique que nous omettons) : τ (τ ) (pi ,Mi )→i (p0i ,Mi ) <(p1 ,M1 ),...,(pi ,Mi ),...,(pn ,Mn )>→<(p1 ,M1 ),...,(p0i ,Mi ),...,(pn ,Mn )> (!) (pi ,Mi )→i (p0i ,Mi ) |Mj |≤size(j) <(p1 ,M1 ),...,(pi ,Mi ),...,(pj ,Mj ),...,(pn ,Mn )>→<(p1 ,M1 ),...,(p0i ,Mi ),...,(pj ,Mj .v),...,(pn ,Mn )> (?) (pi ,v.Mi )→i (p0i ,Mi ) <(p1 ,M1 ),...,(pi ,Mi ),...,(pn ,Mn )>→<(p1 ,M1 ),...,(p0i ,Mi ),...,(pn ,Mn )> (τrdv ) (pi ,Mi )→i (p0i ,Mi ) (pj ,Mj )→i (p0j ,Mj ) size(j)=0 i6=j <(p1 ,M1 ),...,(pi ,Mi ),...,(pn ,Mn )>→<(p1 ,M1 ),...,(pi ,Mi ),...,(pn ,Mn )> j!v ?v j!v ?v Dans un modèle synchrone (par exemple dans un circuit commandé par une horloge globale), les calculs se font par cycle. A chaque début de cycle, un processus envoie un certain nombre de messages et reçoit ensuite tous les messages qui lui sont envoyés au cours de ce cycle (pas d’action interne). Nous modifions le modèle asynchrone pour prendre en comptes ces contraintes. Les états des processus sont maintenant uniquement constitués d’un état discret pi et Σ = Σ1 ∪ ldots ∪ Σn un ensemble de couples (m, u) où m est un ensemble de messages envoyés (dans M({i!v | i ∈ N, v ∈ V })) et u l’ensemble des valeurs de reçues (u ∈ M(V )). La seule règle de réduction (on suppose les canaux non bornés) est donc (τsynch ) 3 (mi ,ui ) pi −→ p0 i ui ={v |i!v∈m1 ∪...∪mn } pour i=1,..,n (p1 ,...,pn )→(p1 ,...,pn ) Spécifier les propriétés avec LTL Une propriété est un sous-ensemble de suites infinies d’états du système de transitions. Ces propriétés peuvent se diviser en deux grandes catégories : les propriétés de sûreté et celles de vivacité. Elles s’expriment formellement via une formule logique, comme celles de la logique LTL, dont l’interprétation est l’ensemble des exécutions qui la satisfont. Nous rappelons préalablement quelques notations usuelles. Pour un ensemble A, A∗ désigne l’ensemble des suites finies d’éléments de A et Aω l’ensemble de ses suites infinies. L’ensemble A≤ω désigne A∗ ∪ Aω . Enfin, pour une suite finie ou infinie w, le ieme élément de w est w(i); w≤i est le préfixe w(1) ≤ w(i) et w≥i le suffixe w(i)w(i + 1)... 3.1 Propriétés de sûreté et de vivacité Informellement, une propriété de sûreté exprime qu’une “mauvaise situation” ne va jamais se produire dans l’exécution. Par exemple, deux processus ne peuvent être au même moment en section critique, le système n’a pas de deadlock, etc. Une propriété de vivacité, quant à elle, exprime qu’une “bonne situation” va se produire pendant l’exécution. Par exemple, que chaque processus va finir par pouvoir entrer en section critique. Dans ce qui suit, S est un ensemble d’états. Definition 4 (Propriété de sûreté). L’ensemble P ⊆ S ω est une propriété de sûreté si pour toute suite infinie d’états σ, σ ∈ P ou il existe un ordinal k tel que pour toute suite σ 0 ∈ S ω on a σ ≤k σ 0 6∈ P . Definition 5 (Assertion). Une assertion A est un prédicat unaire sur l’ensemble des états, i.e. A ⊆ S Definition 6 (Invariant). Soit A une assertion. L’opérateur unaire Always est défini par Always A = {σ ∈ S | ∀k σ(k) ∈ A} On dit que l’assertion A est un invariant du système de transitions T si tr(T ) ⊆ Always A. L’ensemble Always A est un exemple de propriété de sûreté. Pour prouver qu’une assertion A est un invariant du système, on prouve que l’état initial est dans A et on montre que si un état s est dans A alors pour toute transition s → s0 on a s0 ∈ A. Informellement, une propriété de vivacité caractérise le fait qu’il est toujours possible de poursuivre une exécution finie pour que la propriété soit satisfaite. Definition 7 (Propriété de vivacité). L’ensemble P ⊆ S ω est une propriété de vivacité si pour toute suite finie d’états σ il existe une suite infinie d’états σ 0 telle que σσ 0 ∈ P . Definition 8 (Accessibilité). Soit A une assertion. On définit l’opérateur unaire Eventually A = {σ | ∃k σ(k) ∈ A} On peut remarquer que si A 6= ∅ alors Eventually A est une propriété de vivacité. On dit qu’une assertion A va inéluctablement être satisfaite dans T si tr(T ) ⊆ Eventually A. Pour prouver cette inclusion, on doit trouver (W, <) un ensemble bien fondé et f : S → W une fonction telle que pour tout état s soit s ∈ A soit il existe une transition s → s0 telle que f (s0 ) < f (s). 3.2 Structure de Kripke et logique LTL La logique LTL s’evalue sur les états des exécutions du système de transitions. Pour cela, le système de transitions est enrichi d’une fonction L qui à chaque état associe la liste des propositions qu’il sastisfait. Ce modèle enrichi est appelé structure de Kripke. Definition 9 (Structure de Kripke étiquetée). Soit Σ un alphabet et P un ensemble de propositions. Une structure de Kripke étiquetée sur Σ est un quadruplet K = (S, s0 , →, L) où (S, s0 , →) est un système de transitions étiquetées sur Σ et L : S → 2P est la fonction qui à un état associe les propositions qui sont vraies à cet état. L’exécution d’une structure de Kripke est l’exécution du système de transitions sousjacent. Definition 10 (Syntaxe de LTL). Une formule p de LTL est définie par p ::= a | p ∧ p | ¬p | X p | p U p où a est une proposition de P , X p est lu next p et p U q est lu p until q. Definition 11 (Sémantique de LTL). A chaque formule p est associée une propriété JpK ⊆ S ω telle que JaK = {σ | a ∈ L(σ(0))} Jp1 ∧ p2 K = Jp1 K ∩ Jp2 K J¬pK = S ω \JpK JX pK = {σ | σ ≥1 ∈ JpK} Jp U qK = {σ | ∃j ∈ ω.σ ≥j ∈ Jq K et ∀k < j σ ≥k ∈ JpK} A partir de ces opérateurs, de nouveaux peuvent être définis : F p = true U p (finally/eventually p) Gp = ¬F ¬p (always/globally p) Leur sémantique: JF pK = {σ | ∃j ∈ ωσ ≥j ∈ JpK} JGpK = {σ | ∀j ∈ ωσ ≥j ∈ JpK} F permet d’exprimer des propriétés d’accessibilité et G des invariants, cf respectivement les définitions 8 et 6. 4 Le model-checking pour LTL Soit φ la formule LTL que l’on souhaite vérifier sur la structure de Kripke K. Vérifier si K satisfait φ se réduit au problème de savoir si tr(K) ⊆ JφK ou de façon équivalente si tr(K) ∩ J¬φK = ∅. Si la réponse est négative, toute trace de cette intersection est un contreexemple. Pour tester la vacuité de cette intersection, on construit un système de transitions A¬φ appelé automate de Büchi dont l’ensemble des exécutions tr(A¬φ ) est exactement J¬φK. Savoir si T satisfait φ est donc équivalent au problème de savoir si tr(K) ∩ tr(A¬φ ) = ∅, ce qui est équivalent au problème de savoir si ? tr(K × A¬φ ) = ∅ Deux questions se posent donc : comment traduire φ en un automate de Büchi et comment décider la vacuité de l’ensemble des traces d’un système de transitions. 4.1 Automates de Büchi Definition 12 (Automate de Büchi). Un automate M fini sur un alphabet Σ est un quadruplet (Q, q0 , ∆, F ) où (Q, q0 , ∆) est un système de transitions sur Σ avec Q fini et F ⊆ Q est l’ensemble des états d’acceptation. Une trace d’exécution σ du sytème de transitions est dite acceptée si elle admet un nombre infini d’états dans F : σ(i) ∈ F : ∃q ∈ F ]{i |σ(i) = q} = ω Un automate de Büchi est un automate fini M avec une condition d’acceptance comme décrite ci-dessus. L’automate de Büchi qui reconnaı̂t une formule LTL φ dont l’ensemble des propositions est noté P est tel que : – l’alphabet est l’ensemble des parties de P , c’est-à-dire que chaque transition est étiqueté par l’ensemble des propositions de P qui doivent être satisfaites pour qu’une transition se fasse – ses états sont des ensembles de sous-formules de φ. – sa taille de cet automate est exponentielle dans la taille de la formule, i.e. en O(2|φ| ). La construction exacte de cet automate suit un algorithme assez délicat que nous ne présenterons pas ici. Le lecteur intéressé pourra se référer à [Var96]. Nous donnons néanmoins quelques exemples de construction pour des formules simples où les états d’acceptation sont représentés par deux cercles concentriques. p: p q0 q1 Xp : q0 p q1 q2 p p Gp : q0 Fp : q0 p q1 pU q : q0 q q1 Le produit synchronisé entre la structure de Kripke et l’automate de Büchi est légèrement différent que celui donné à la définition 3. Dans ce cas, chaque transition s → s0 de la structure p1 ,...,pk doit être synchronisée avec chaque transition q → q 0 de l’automate mais n’est dans le produit synchronisé que si p1 , . . . pk ∈ L(s), pour modéliser l’hypothèse que le système est dans un état qui satisfait la contrainte de la transition de l’automate. Definition 13 (Automate produit). Soient P un ensemble de propositions ; K = (S, s0 , → , L) une structure de Kripke sur Σ et A = (Q, q0 , ∆, F ) un automate de Büchi sur l’alphabet P(P ). L’automate produit K × φ est l’automate de Büchi A = (Q0 , q00 , ∆0 , L0 , F 0 ) tel que Q0 = S × Q; q0 = (s0 , q0 ) ; F 0 = {(s, q) | q ∈ F }; ((s, q), (a, u), (s0 , q 0 )) ∈ ∆0 ssi (s, t, s0 ) ∈→ et (q1 , u, q2 ) ∈ ∆ et u ⊆ L(s). Pour illustrer cette définition, considérons l’exemple ci-dessous (extrait du livre [SBB+ 99]) de structure de Kripke (à gauche) et la formule que nous souhaitons vérifier (dont l’automate de Büchi de la négation est à droite) est G(p1 → X F p2 ). La formule φ énonce que tout occurrence de p sera suivie d’une occurrence de p2 . Sa négation signifie donc qu’il existe une occurrence de p1 après laquelle on ne rencontrera plus jamais p2 . ¬p1 ¬p2 t1 ¬p1 ¬p2 p1 , p2 p1 , ¬p2 u0 : ¬p , p 1 2 ¬p1 , ¬p2 t4 p1 p2 t5 q0 t3 t2 u2 : p1 , ¬p2 ¬p1 , ¬p2 q1 u1 : p1 , ¬p2 p1 , p2 A¬φ avec φ : G(p1 → X F p2 ) ¬p1 ¬p2 Le produit synchonisé est alors donné à la figure ci-dessous où seules les transitions possibles sont représentées : (t4 , u1 ) ¬p1 ¬p2 t1 ¬p1 ¬p2 t4 t3 t2 ¬p1 ¬p2 4.2 p1 p2 t5 ¬p1 ¬p2 (t1 , u2 ) (t3 , u2 ) ¬p1 ¬p2 p1 p2 (t3 , u2 ) (t2 , u2 ) ¬p1 ¬p2 Algorithmes de décision Rappelons que le problème de model-checking se réduit à la question de savoir si le produit synchonisé K × A¬φ admet ou non une trace acceptée. Une hypothèse importante est que K doit être fini en terme de nombre d’états et de transitions. Si on considère ce produit synchronisé comme un graphe dont les noeuds sont les états et les arcs sont ses transitions, cela revient à savoir s’il existe un cycle dans ce graphe qui soit accessible depuis l’état initial et qui contient un état acceptant. Deux algorithmes peuvent être utilisés : – uitliser l’algorithme de Tarjan [Edu01] pour calculer l’ensemble des composantes fortement connexes accessibles depuis l’état initial. On cherche ensuite parmi ces composantes fortement connexes si l’une d’elle contient un état acceptant. Cette méthode est peu utilisée car elle est incompatible avec certaines techniques d’optimisation ; – utiliser l’algorithme Nested DFS (inmplémenté dans SPIN par exemple [HPY]). Il s’agit d’un parcours en profondeur du graphe depuis l’état initial pour trouver dans un premier temps tous les etats accessible. Si aucun état acceptant n’est trouvé à cette étape, c’est que la propriété est satisfaite. Sinon, un parcours en profondeur du graphe depuis chaque état acceptant s accessible est fait de façon à détecter s’il sont accessible depuis eux-mêmes c’est-à-dire dans une boucle. Ces algorithmes terminent puisque par hypothèse le produit synchronisé est fini. 5 Le phénomène d’explosion combinatoire Par construction, la taille du produit synchronisé est exponentielle dans le nombre de ses composants, ce qui limite en pratique l’utilisation du model-checking comme technique de vérification : le produit à construire est souvent trop grand pour pouvoir être stocké. Pour pallier à cet inconvénient, des techniques de construction et d’exploration partielle du produit synchronisé ont été mises au point pour combattre ce phénomène d’explosion combinatoire : Le model-checking “à la volée” construit uniquement les parties utiles du système tandis que les techniques d’ordre partiel [GW92,Pel93,NHZL01] exploitent la nature concurrente des systèmes pour n’explorer que certaines exécutions. Parallellement, ont été développées des méthodes de model-checking symbolique pour représenter des ensembles d’états plutôt que chaque les états explicitement ; les transitions sont alors réexprimées sur ces états symboliques. Les diagrammes de décision binaire sont un exemple d’une telle technique. 5.1 les diagrammes de décision binaires Les BDD (Binary Decision Diagram) sont une structure de données qui permet de représenter de façon concise des fonctions booléennes. L’utilisation de cette structure pour représenter des automates est duûe à Bryant [Bry92]. Ce codage est particulièrement efficace pour des circuits logiques même de très grande taille (plus de 1020 états). L’efficacité du codage dépend beaucoup de la régularité de la fonction à coder. Les BDDs offrent plusieurs avantages : – des opérations de base efficaces et peu coûteuses (quadratiques dans le nombre de variables de la formule) ; – une implantation simple d’une structure de données pour les représenter ainsi que des algorithmes pour les manipuler ; – l’existence d’une forme canonique compacte pour les comparer aisément. Construction d’un BDD pour la fonction f (x1 , x2 , x3 ) = x1 =⇒ (x2 ∨ x3 ) Dans un premier temps, on se fixe un ordre x1 < x2 < x3 sur les variables et on construit l’arbre de choix qui a 2n+1 − 1 noeuds où n = 3 est le nombre de variables de la fonction à coder : x1 T F x2 x2 T F x3 T x3 F x3 x3 T F T F T F T F T T T F T T T T Puis, on réduit ensuite cet arbre pour obtenir le BDD par application jusquà saturation des règles suivantes : – regrouper les sous-arbres identiques (l’arbre devient un graphe acyclique dirigé) – supprimer les noeuds internes correspondant à des faux choix, ie les fils gauche et droit sont identiques Lorsque plus aucune réduction n’est possible, le BDD obtenu est appelé ROBDD (Reduced Ordered BDD) : x1 T F x2 F T x3 T F F T Proposition 14. Pour un ordre fixé des variables d’une fonction, le ROBDD est unique. L’ordre des variables a grande influence sur la taille du ROBDD. Des heuristiques ont été développées pour tenter d’optimiser ces choix. On peut par exemple priviliégier les variables qui n’apparaissent que sous une forme positive ou négative, etc. Opérations sur les BDD L’égalité de deux BDD se fait par comparaison deux à deux des noeuds depuis la racine jusqu’aux feuilles. Pour complémenter un BDD, il suffit d’echanger le rôle des feuilles T et F. L’intersection de deux BDD B1 et B2 est un BDD B = B1 × B2 où un noeud interne (n1 , n2 ) représentant n1 ∧ n2 est tel que n1 est un noeud de B1 et n2 est un noeud de B2 . La taille est bornée par |B1 × B2 | ≤ |B1 | × |B2 | L’union suit le même principe que l’intersection avec (n1 , n2 ) qui représente n1 ∨ n2 . Représentation d’un système de transitions fini par un BDD Soit (S, s0 , →) un système de transitions fini. Chaque état de S est codé par un vecteur de bits de taille log|S|. Chaque transition s → s0 est codée par la concaténation du codage de s et de celui de s0 . Ce codage est utilisé dans l’outil SMV qui utilise la logique CTL. 6 Compléments D’autres modèles et méthodes ont été développés : – des représentations prenant mieux en compte la nature distribuée d’un système pour éviter de costruire le produit synchronisé : les Message Sequence Charts – des modèles prenant en compte le temps ainsi que des logiques adequats: les automates temporisés [AD94] sont les modèles les plus répandus. C’est celui implanté dans le modelchecker UPPAAL [BDL04] par exemple – des techniques de model-checking pour des systèmes infinis : pushdown systems et regular model-checking – des modèles probabilistes – etc. References [AD94] R. Alur and D. Dill, A theory of timed automata, Theoretical Computer Science 126 (1994), no. 2, 183–235. [BDL04] G. Behrmann, A. David, and K. Larsen, A tutorial on uppaal, SFM-RT, Lecture Notes in Computer Science, no. 3185, Springer–Verlag, 2004, pp. 200–236. [Bry92] Randal E. Bryant, Symbolic Boolean manipulation with ordered binary-decision diagrams, ACM Computing Surveys 24 (1992), no. 3, 293–318. [CCaR99] A. Cimatti, E. Clarke, and F. Giunchiglia and. Roveri, Nusmv: a new symbolic model verifier, 1999, pp. 495–499. [Edu01] McGraw-Hill Higher Education (ed.), Introduction to algorithms, 2001. [GW92] P. Godefroid and P. Wolper, Using partial orders for the efficient verification of deadlock freedom and safety properties, CAV ’91: Proceedings of the 3rd International Workshop on Computer Aided Verification, Springer-Verlag, 1992, pp. 332–342. [Hol03] G. Holzmann, The spin model-checker, Addison-Wesley, 2003. [HPY] G. Holzmann, D. Peled, and M. Yannakakis, On nested depth first search, Second SPIN Workshop (American Mathematical Society, ed.), Lecture Notes Computer Science, pp. 23– 32. [NHZL01] P. Niebert, M. Huhn, S. Zennou, and D. Lugiez, Local first search - a new paradigm for partial order reductions, CONCUR ’01: Proceedings of the 12th International Conference on Concurrency Theory, Springer-Verlag, 2001, pp. 396–410. [Pel93] D. Peled, All from one, one for all: On model checking using representatives, Computer Aided Verification: Proc. of the 5th International Conference CAV’93, Springer, 1993, pp. 409–423. [SBB+ 99] P. Schnoebelen, B. Bérard, M. Bidoit, F. Laroussinie, and A. Petit, Vérification de logiciels : techniques et outils du model-checking, Vuibert, 1999. [Var96] M. Vardi, An automata-theoretic approach to linear temporal logic, Banff Higher Order Workshop, 1996, pp. 238–266. [VW86] M. Vardi and P. Wolper, An automata-theoretic approach to automatic program verification, 1986, pp. 332–344.