390 likes | 508 Views
BiCoq : Plonger B en Coq. Eric Jaeger, UPMC/LIP6 & SGDN/DCSSI Journée PPF Logiciels Sûrs du 7 juin 2007. Plan. Rapide présentation du B Rapide présentation de Coq Plongements BiCoq. La Méthode B. La Méthode B. Développée par J-R. Abrial dans le B-Book
E N D
BiCoq :Plonger B en Coq Eric Jaeger, UPMC/LIP6 & SGDN/DCSSI Journée PPF Logiciels Sûrs du 7 juin 2007
Plan • Rapide présentation du B • Rapide présentation de Coq • Plongements • BiCoq
La Méthode B • Développée par J-R. Abrial dans le B-Book • Permet d’aller de la spécification formelle à l’implémentation (un programme séquentiel) par raffinements successifs • Basée sur un calcul des prédicats enrichi avec des notions ensemblistes et un langage de substitutions généralisées • Les propriétés d’un programme sont des prédicats • Les opérations d’un programme sont décrites comme des substitutions (transformateurs de prédicats) • Largement utilisée par l’industrie et le monde académique
Spécification en B • Puissance du non-déterminisme : le tri de liste outsort(liste)≙ PRE liste∈seq(ℕ) THEN ANY prm WHERE prm∈perm(dom(liste)) ⋀ (prm;liste||prm;liste)[geq]⊆geq THEN out:=prm;liste END END • La spécification explique le quoi, pas le comment… • A noter les nombreuses notions natives en B
VARIABLES S INVARIANT S⊆ℕ INITIALISATION S:=∅ OPERATIONS ajout(n)≙PRE n∈ℕ THEN S:=S∪{n} END; outliremax≙PRE S≠∅ THEN out:=max(S) END Perte d’information Il y a bien raffinement VARIABLES m INVARIANT m∈ℕ INITIALISATION m:=0 OPERATIONS ajout(n)≙PRE n∈ℕ1 THEN IF m<n THEN m:=n END END; outliremax≙BEGIN out:=m END Mais il n’est pas possible,en faisant uniquement appel aux opérations, de distinguer les deux machines Notion de raffinement en B
Coq • Formalisme et outil développés par G. Huet, T. Coquand, C. Paulin, B. Werner, G. Dowek, etc. • Outil de vérification de preuves (Curry-Howard et typage) • Permet d’écrire des preuves mais aussi des fonctions, extraction sous forme de programmes fonctionnels (CAML) • Basé sur le calcul des constructions inductives • Primitif (pas d’égalité…) mais ouvert et puissant (ordre supérieur) • Nous considérons ici Coq comme un langage de description d’ensembles de termes
Inductive ℕ : Set ≔ 0 : ℕ | S : ℕ→ℕ • P 0 ⇒(∀ (n:ℕ), P n ⇒P (S n)) ⇒∀ (n:ℕ), P n Les naturels en Coq • Définition inductive • Surjectivité : tout terme de ℕ est de l’une de ces deux formes • Injectivité : 0≠S n et x≠y ⇒ S x≠S y • Bonne fondation : tout terme de typeℕest bâti par un nombre fini (arbitrairement grand) d’applications de S à 0 • Justifie le principe d’induction associé
Inductive ℕ : Set ≔ 0 : ℕ | S : ℕ→ℕ S S S S S S Convention de notation 0 1 2 Les naturels en Coq 0 S0 SS0
Inductive ≤ : ℕ→ℕ→Prop ≔ le0 :∀ n:ℕ, 0≤n | leS : ∀ (n1,n2:ℕ), n1≤n2→S n1≤S n2 Plus petit ou égal en Coq • Encore une définition inductive • ℕ définit un type, ≤ définit une famille de types • 0≤1 est un type, ainsi que 2≤4 • 3≤1 est également un type • Les termes habitant ces types sont des preuves • (le0 1) est un terme de type 0≤1 • (leS 1 3 (leS 0 2 (le0 2))) est un terme de type 2≤4 • Il n’y a pas de terme de type 3≤1
Inductive ≤ : ℕ→ℕ→Prop ≔ le0 :∀ n:ℕ, 0≤n | leS : ∀ (n1,n2:ℕ), n1≤n2→S n1≤S n2 S S S ℕ 0 1 2 le0 le0 le0 Pour les typeslogiques, ons’intéresse àl’existence d’unterme, mais pasà sa valeur leS leS leS Plus petit ou égal en Coq 0≤0 0≤1 0≤2 1≤1 1≤2 1≤3
Inductive even : ℕ→Prop ≔ ev0 : even 0 | evS : ∀ (n:ℕ), even n →even S(S n) S S S S S S S ev0 5 0 1 2 3 6 4 evS evS evS Etre pair en Coq e4 e0 e2 e6 Un prédicat sur les termes peut être vu comme un règle de coloration
Notion de plongement • Le plongement consiste à représenter (la sémantique d’)un langage dans un autre • Plongement superficiel (shallow embedding) • On transforme un programme du langage plongé en un programme du langage de plongement (compilation) • Permet d’analyser les programmes plongés • Plongement profond (deep embedding) • On représente de manière fine le langage plongé dans le langage de plongement (développer une VM puis l’utiliser) • Permet d’analyser le langage plongé
Plongement d’une logique • On considère une logique propositionnelle très simplifiée • La syntaxe décrit les termes que l’on peut écrire • Proposition : P := cst | P ∧ P • Contextes : Γ := ∅ | P ; Γ • Séquents : S := Γ ⊢ P • Les règles d’inférence décrivent la sémantique, les principes de raisonnement sur ces termes Γ⊢ P Γ⊢ P ∧ Q Γ⊢ P ∧ Q Γ⊢ P et Γ⊢ Q P ⊢ P Q ; Γ⊢ P Γ⊢ P Γ⊢ Q Γ⊢ P ∧ Q
Plongement superficiel • Définition de l’import des termes de la logique dans Coq • 〚P1 ∧ P2〛→〚 P1〛∧〚P2〛 • 〚∅ ⊢ P〛→ True ⇒〚P〛 • 〚P1 ; Γ ⊢ P2〛→〚P1〛⇒〚Γ ⊢ P2〛 • On ajoute aussi quelques axiomes à Coq, si nécessaire • Règles d’import et axiomes sont justifiés par la sémantique • Il y a potentiellement une interprétation • On peut perdre en correction ou complétude • Ici, par exemple, la logique a été enrichie (contextes ordonnés)
Plongement profond • La syntaxe se traduit de manière naturelle par des définitions inductives (construction des termes de la logique) • On ne suppose rien quant à la signification de ces termes • Le ∧, par exemple, est juste le constructeur de terme pand • P⊢Q∧R s’écrit spr (cins (pcst P) cnil) (pand (pcst Q) (pcst R)) • Dans la suite, on utilisera la représentation symbolique Inductive prp : Set ≔ pcst: ident → prp | pand : prp→ prp → prp Inductive ctx : Set := cnil : ctx | cins : prp→ ctx→ ctx Inductive sqt : Set := spr : ctx → prp→ sqt
Plongement profond • Les règles d’inférence décrivent une relation entre les contextes et les prédicats… ou plus simplement un prédicat sur les séquents • Ce prédicat nous permet de colorier parmi l’ensemble de tous les séquents, ceux qui sont prouvables… donc « vrais » • Aucune interprétation n’est nécessaire dans la logique de Coq Inductive proof : sqt→Prop ≔ | axm: ∀ (p:prp), proofp⊢p | weak : ∀ (p,q:prp)(c:ctx), proofc⊢p → proof(q;c)⊢p | andE : ∀ (p,q:prp)(c:ctx), proofc⊢p → proofc⊢q → proofc⊢(p∧q) | andL : ∀ (p,q:prp)(c:ctx), proofc⊢(p∧q)→proofc⊢p | andR : ∀ (p,q:prp)(c:ctx), proofc⊢(p∧q)→ proofc⊢q
Confiance et vérification • B est utilisé pour des développement de sûreté ou de sécurité • Haut niveau de confiance obtenu par l’utilisation d’une méthode formelle, implémentée dans un outil (AtelierB, BToolkit, B4Free) • Mais qui vérifie le vérificateur ? La théorie du B, ou son implémentation, peuvent contenir des erreurs • Le B-Book c’est 600 pages de définitions et de preuves • Les outils sont complexes (cf. par exemple les problèmes de capture des noms de variables) • On peut utiliser Coq pour vérifier le B, et pour implémenter des outils
BiCoq • BiCoq est un plongement profond de la logique de B en Coq • Pourquoi un plongement profond ? • Pas d’interprétation : on représente le B et non une adaptation de B exprimable en utilisant des constructions de Coq • Permet de vérifier le B • Comment représenter un Coq une « fonction » de B, i.e. une relation potentiellement partielle et non décidable ? • Portage possible des développements déjà réalisés • Les deux logique (B et Coq) sont clairement distinguées, la logique de Coq est préservée (donc sa cohérence), et on peut faire une méta-analyse de la logique de B • Compatible d’une extraction d’outils indépendants de Coq
La logique de B en Coq • Les termes du B sont définis comme suit : • Prédicats :P := P∧P | P⇒P | ¬P | ∀v.P | E=E | E∈E | [V:=E]P • Expressions :E := V | S | E↦E | ↓S | [V:=E]E • Ensembles :S := BIG | ↑S | S*S | {V|P} • Variables :V := cst | V,V • Le codage en Coq est légèrement adapté • Prédicats :P := P∧P | P⇒P | ¬P | ∀P | E=E | E∈E | π(J) • Expressions : E := χ(I) | E↦E | ↓E | Ω| ↑S | S*S | {E,P} | ω(K) • Différences : Constructeurs explicites, fusion des expressions et des ensembles, utilisation de De Bruijn (et variables simples), typage des ensembles en compréhension, axiomatisation de BIG et enrichissement à des fins techniques
La logique de B en Coq • La syntaxe est étendue avec deux nouveaux types • Les contextes, une liste de prédicats • Les séquents, associant un contexte et un prédicat • Les règles d’inférence sont ensuite traduites sous la forme d’une relation inductive Bproofentre contextes et prédicats • On peut aussi voirBproofcomme un prédicat sur les séquents (uncurryfication), coloriant les séquents prouvables • Syntaxe légèrement enrichie, mais pas les règles d’inférence, l’ensemble des séquents prouvables est (presque) identique • Visualisation du tableau…
La logique de B en Coq • La logique de B est représentée par l’ensemble des séquents bien formés et le sous-ensemble des séquents prouvables • Les séquents bien formés sont définis par l a syntaxe • Les séquents prouvablesΓ⊦P sont ceux pour lesquels le prédicat inductif Bproof(Γ⊦P) n’est pas vide • Tout élément de Bproof(Γ⊦P) décrit en fait une preuve de Γ⊦Pdans la logique de B (une trajectoire de coloriage) • 1 ou plusieurs éléments : Γ⊦P est prouvable • Aucun élément : Γ⊦P n’est pas prouvable… ce qui ne signifie pas forcément que Γ⊦¬P est prouvable (alors que Γ⊦P∨¬P l’est) • Une preuve de Γ⊦P en Coq est structurée comme une preuve en B
Les théorèmes B en Coq • Prouver un théorèmeΓ⊦Pde B, c’est exhiber une construction de type Bproof(Γ⊦P)(dans le plongement) en Coq • Donc exhiber une preuve dans la logique de B… preuve qui n’a rien à voir avec la logique de Coq • Par exemple, on peut exhiber une preuve du tiers exclus… • … en suivant la structure de la preuve proposée dans le B-Book • … et sans enrichir la logique de Coq (plongement profond) Theorem B_em : ∀ (Γ:Bctx)(P:Bprd), Bproof(Γ⊦ P ∨ ¬P)
Quelques surprises • Le B-Book ne respecte pas la syntaxe qu’il définit • Certaines preuves du B-Book sont fausses • L’ensemble des règles d’inférence est insuffisant à prouver les résultats attendus • Ce ne sont pas des erreurs du plongement, mais des problèmes dans le B-Book (difficilement détectables) • Pourtant, ces résultats sont prouvables avec les outils B… (E1=F1↦E2=F2)⇒E1=E2mais pasBproof(⊢(E1=F1↦E2=F2)⇒E1=E2) S1⊆S2∧T1⊆T2⇒S1*T1⊆S2*T2mais pasBproof(⊢S1⊆S2∧T1⊆T2⇒S1*T1⊆S2*T2)
Croiser les logiques • Quelles sont les relations entre un opérateur logique B et un opérateur logique Coq ? • Exercice de style • Met en évidence les différences entre les logiques (cf. le ∨) • Permet de prouver des théorèmes en B plus efficacement (pour le développeur) en utilisant des tactiques de Coq Bproof(Γ⊦ P1) ∧Bproof(Γ⊦ P2) ⇔ Bproof(Γ⊦ P1 ∧ P2) Bproof(Γ⊦ P1) ∨Bproof(Γ⊦ P2) ⇒ Bproof(Γ⊦ P1 ∨ P2) Bproof(Γ⊦ P1 ⇒ P2) ⇒ ( Bproof(Γ⊦ P1) ⇒ Bproof(Γ⊦ P1) )
Nouveaux résultats pour le B • De facto, ce plongement consiste à utiliser Coq comme méta-logique pour le B • Question philosophique : est-ce justifiable ? • L’induction sur les termes est utilisée dans le B-Book, c’est justement ce qui est fait (le plus souvent) dans BiCoq • Quid de l’induction sur les preuves ? • On dérive bien les résultats attendus • Réciproquement, on peut dériver de nouveaux résultats • Exemple : substitution de prédicats équivalents, ⇔ est une congruence en B, comme =
Un prouveur prouvé pour le B • En complément, BiCoq propose des fonctions ML représentant l’application d’une tactique de preuve • Les fonctions agissent directement sur les séquents (niveau syntaxique) en émulant l’application des règles d’inférence et des théorèmes • Développement direct de fonctions ML qui sont prouvées correctes et peuvent être extraites • On obtient un prouveur prouvé indépendant de Coq • Il possible à partir d’une trace de preuve de générer un terme de preuve B (Bproof) vérifiable dans Coq
Un prouveur prouvé pour le B • Type des tactiques de preuve • Sémantique d’une liste de séquents LS • Correction d’une tactique TB • Quelques exemples simples Btac : Bseq→ list Bseq Trans(LS:list Bseq) := ∀ (S:Bseq), S ∊ LS ⇒ Bproof(S) Theorem TBCorrect : ∀ (S:Bseq), Trans(TB(S)) ⇒ Bproof(S) Definition TAXM(S:Bseq) := let (Γ⊢P:=S) in if P ∊ Γ then [ ] else [S] Definition T∧i(S:Bseq) := let (Γ⊢P:=S) in match P with P1∧P2 → [Γ⊢P1,Γ⊢P2] | _ → [S] end
Résultats actuels • Toute la logique B a été plongée dans Coq • Certaines notions, telles que l’union, restent difficiles à représenter et sont améliorables • Quelques problèmes de B mis en évidence • Une grande partie des théorèmes a été vérifiée • Terminé pour calcul propositionnel et calcul des prédicats • De nouveaux résultats ont été démontrés • Code ML extractible formellement vérifié et complet • Termes, propriétés, méta-propriétés, tactiques de preuve • 550 définitions, 750 théorèmes, 10000 lignes (6 h.mois)
Travaux à mener • Améliorer la représentation des variables • Produire des termes de preuve pour Coq • Plonger la théorie des points fixes • Notamment, définir des entiers naturels à la B • Croiser points fixes de B et induction de Coq • Tactiques de preuves inductives pour le B • Plonger le langage de substitution • Plongement profond ou superficiel ? • Poursuivre les analyses méta-théoriques
Quelques remarques • Plongement profond coûteux mais instructif et puissant • Il n’y a que le premier pas qui coûte • Validation de la théorie de la Méthode B pas inutile • Développement d’outils formellement validés pour le B • Même non optimaux, ils peuvent vérifier ce qui est produit par d’autres outils • Indépendance vis-à-vis de Coq : choix à faire • Coq est expressif et puissant, mais très technique • Intérêt de la définition de notations • Analyse de différentes approches de l’induction
Des questions ? Merci pour votre attention…
∀ x ∈ x {} y ∧ ∈ = y S y x Indices de De Bruijn ∀x.x∈{y|y∈S∧y=x} ≡α∀y.y∈{z|z∈S∧z=y}
∀ ∀x ∀ x ∈ ∈ ∈ x {} x {y} 0 {} y ∧ ∧ ∧ ∈ = ∈ = ∈ = y S y x y S y x 0 S 0 1 Indices de De Bruijn
Indices de De Bruijn • La notation n’est pas naturelle • L’indice pour une variable n’est pas constant dans un terme • Mais la représentation de De Bruijn offre de nombreux avantages pour un programme sur les termes • L’égalité ≡α se ramène à l’égalité structurelle en De Bruijn • Les conditions sur les noms sont remplacées par des calculs • Permet de distinguer substitution et instanciation, etc. • Quelques problèmes avec l’induction sur les termes • Il est facile de définir des fonctions pour utiliser la notation naturelle tout en travaillant en De Bruijn
Quantifications standards Bind∀(x,x∈Bind{}(y,y∈S∧y=x)) Quantifications fonctionnelles Quantifications De Bruijn Indices de De Bruijn ∀x.x∈{y|y∈S∧y=x} ∀(1∈{S|1=2})