La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Tutoriel Focal (première partie)

Présentations similaires


Présentation au sujet: "Tutoriel Focal (première partie)"— Transcription de la présentation:

1 Tutoriel Focal (première partie)
David Delahaye Équipe Focal

2 Introduction Méthodes formelles pour la certification de programmes:
Vérification (automates, RdPs, …) Preuve (logique, Mathématiques, …) Atelier Focal (anciennement Foc): Outil de spécification et d’aide à la preuve Orienté objets (héritage, paramétrisation, …) Orienté spécifications algébriques (support, implantation, …) Preuve automatisée (Zenon) et vérifiée (Coq)

3 L’équipe Focal Focal Cédric, CPR LIP6 INRIA C. Dubois V. Donzeau-Gouge
T. Hardin R. Rioboo M. Jaume INRIA D. Doligez P. Weis Cédric, CPR C. Dubois V. Donzeau-Gouge O. Pons D. Delahaye X. Urbain P. Courtieu J. Blond R. Bonichon C. Morisset I. Noyer S. Boulmé S. Fechter V. Prevosto J.-F. Étienne M. Carlier

4 Un peu d’histoire Groupe BiP (T. Hardin, V. Donzeau-Gouge, J. R. Abrial): Interactions entre les communautés Coq et B Projet Foc (T. Hardin, R. Rioboo, S. Boulmé): Bibliothèque certifiée de calcul formel (failles d’Axiom) Structures avec héritage, représentation et paramétrisation Conception d’un compilateur (D. Doligez, V. Prevosto): Codes Ocaml (exécution), Coq (certification) Code FocDoc (documentation)

5 Un peu d’histoire (suite)
Développement d’une bibliothèque de calcul formel (R. Rioboo): Polynômes distribués, clôture réelle, … Sémantique opérationnelle (T. Hardin, C. Dubois, S. Fechter): Meilleure compréhension du compilateur Prouveur automatique Zenon (D. Doligez, D. Delahaye): Premier ordre avec égalité (classique), méthode des tableaux Traduction en Coq des preuves générées

6 Spécifications Focal: espèces
Référencée par self Paramétrisation Représentation: rep; ou rep = type; Signatures: sig nom in type; Définitions: let nom (args) = corps; Propriétés: property nom : prop; Théorèmes: theorem nom : prop proof : preuve; Espèce species nom (pars) inherits esps (pars) = corps end Héritage

7 Spécifications Focal: collections
Tout doit être défini et démontré: rep;  rep = type; sig nom in type;  let nom (args) = corps; property nom : prop;  theorem nom : prop proof : preuve; Encapsulation Collection collection nom implements esps (pars) = corps end Implantation

8 Le compilateur de Focal
Spécification Focal FocDoc Ocaml Coq XML LaTeX Zenon

9 Un exemple: les ensembles finis
species setoid inherits basic_object = sig equal in self → self → bool; sig element in self; let different (x, y) = #not_b (!equal (x, y)); property equal_reflexive : …; property equal_symmetric : …; property equal_transitive : …; end (** fo_set.foc *) A library for finite sets @author D. Delahaye *) species set (typ is setoid) inherits setoid = (* Declarations *) sig empty in self; sig add in typ → self → self; sig rem in typ → self → self; sig union in self → self → self; sig inter in self → self → self; Racine de la hiérarchie: species basic_object = rep; let print (x in self) = ...; let parse (x in string) in self = ...; end

10 Ensembles (suite) (* Definitions *)
let is_empty (e) = !equal (e, !empty); let mem (e, a) = !different (a, !rem (e, a)); (* Set axioms *) property ext : all a b in self, (!mem (e, a) ↔ !mem (e, b)) ↔ !equal (a, b); letprop mem_union (e, a, b) = !mem (e, a) or !mem (e, b); property pair : all a b in self, all e in typ, !mem (e, !union (a, b)) ↔ !mem_union (e, a, b); (* We do not need axioms of reunion and powerset due to ... *) ...

11 Ensembles (fin) et compilation
property rem_empty : all e in typ, !equal (!rem (e, !empty), !empty); theorem mem_empty : all e in typ, not (!mem (e, !empty)) proof : by !rem_empty, !equal_symmetric def !different, !mem; end Compilation: $:> focc -I … fset.foc $:> ls fset.* fset.fo fset.foc fset.ml fset.mli fset.zv $:> zvtov -zenon … fset.zv Pourquoi? not (!mem (e, !empty)) different, mem (défs.) not (#not_b (!equal (!empty, !rem (e, !empty)))) rem_empty, equal_symmetric (props.)

12 Finitude (modularité)
Solution alternative: species finite inherits basic_object = sig card in self → int; sig is_finite in self → bool; property finite : all a in self, !is_finite (a); end species finite = rep; sig card in self → int; sig is_finite in self → bool; property finite : all a in self, !is_finite (a); end Cette espèce représente une propriété  possibilité de modulariser le développement! Comment utiliser cette propriété? …

13 Ensembles finis species finite_set (typ is setoid) inherits set (typ), finite = (** Choice operator *) sig choose in self → typ; property choose_ne : all a in self, not (!is_empty (a)) → !mem (!choose (a), a); theorem choice : all a in self, not (!is_empty (a)) → ex e in typ, !mem (e, a) proof : by !choose_ne; (* Definitions *) let rec is_finite (a) = if !is_empty (a) then #True else let e = !choose (a) in !is_finite (!rem (e, a));

14 Ensembles finis (suite)
let rec union (a, b) = if !is_empty (a) then b else let e = !choose (a) in !union (!rem (e, a), !add (e, b)); let inter (a, b) = let ab = !restrict (a, b) in let ba = !restrict (b, a) in !restrict (!restrict (!union (a, b), ab), ba); (* Theorems *) theorem union_empty : all a in self, !equal (!union (!empty, a), a) proof : by !equal_reflexive def !is_empty, !union; end

15 Ensembles finis (espèce complète)
Implantation avec des listes: species fset_list (typ is setoid) inherits finite_set (typ) = rep = list (typ); let empty = #Nil; let card (e) = #length (e); let add (e, a) = if !mem (e, a) then a else #Cons (e, a); proof of rem_empty = …; end La propriété rem_empty provient de set: property rem_empty : all e in typ, !equal (!rem (e, !empty), !empty);

16 Ensembles finis d’entiers (collection)
collection int_fset implements fset_list (foc_small_integers) = end La collection int_fset représente du code exécutable. foc_small_integers est une collection (prédéfinie):  elle doit au moins implanter l’espèce setoid (paramètre de fset_list) On peut donner à fset_list toute collection implantant setoid. Attention, cependant:  le paramètre ne peut pas être une espèce; c’est uniquement une collection!

17 Utiliser les collections
let a = foc_small_integers!parse ("1");; let l1 = int_fset!add (#a, int_fset!add (#b, int_fset!empty));; let l2 = int_fset!add (#b, int_fset!add (#c, int_fset!add (#d, int_fset!empty)));; #print_string (int_fset!print (int_fset!union (#l1, #l2)));; #print_string (int_fset!print (int_fset!inter (#l1, #l2)));; #print_string (foc_small_integers!print (#hd (#l1)));; Exécution: $:> fset 2 → la représentation est abstraite!

18 Une autre implantation
La méthode mem est redéfinie. La preuve de mem_empty faite dans set: theorem mem_empty : all e in typ, not (!mem (e, !empty)) proof : by !rem_empty, !equal_symmetric def !different, !mem; doit être refaite! species efset_list (typ is setoid) inherits finite_set (typ) = rep = int × list (typ); let empty = #crp (0, #Nil); let card (e) = #first (e); let mem (e, a) = #mem (e, #scnd (a)); proof of mem_empty = …; end collection int_efset implements efset_list (foc_small_integers) = end

19 Hiérarchie de la spécification
setoid set finite_set finite fset_list efset_list int_fset fsi int_efset Espèce Collection Héritage Paramétrisation Implantation

20 Extension de la spécification
On souhaite étendre notre spécification: Ensembles finis (totalement) ordonnés En ne changeant rien à la spécification existante En ne dupliquant pas de code Est-ce possible? Oui: héritage avec raffinement du paramètre Technique issue de la programmation objets

21 Ordre total Espèce de la bibliothèque standard:
species pre_order inherits setoid = sig leq in self → self → bool; let lt (x, y) = #and_b (!leq (x, y), #not_b (!equal (x, y))); let geq (x, y) = !leq (y, x); let gt (x, y) = !lt (y, x); theorem lt_is_not_leq : all x y in self, (!lt (x, y) → !leq (x, y) and !different (x, y)) and (!leq (x, y) → !lt (x, y) or !equal (x, y)) proof : def !lt, !different; end Ordre total Espèce de la bibliothèque standard: species ordered_set inherits partial_order = let equal (x, y) = #and_b (!leq (x, y), !leq (y, x)); let lt (x, y) = #not_b (!leq (y, x)); property total_order : all x y in self, !leq (x, y) or !leq (y, x); proof of lt_is_not_leq = by !total_order def !lt, !different, !equal; ... end species partial_order inherits pre_order = property leq_antisymmetric : all x y in self, !leq (x, y) → !leq (y, x) → !equal (x, y); end

22 Ensembles finis ordonnés
species finite_ordered_set (typ is ordered_set) inherits finite_set (typ) = (* Definitions *) let is_single (a) = !is_empty (!rem (!choose (a), a)); let min_e (e, f) = if typ!leq (e, f) then e else f; let max_e (e, f) = if typ!leq (e, f) then f else e; let rec min (a) = if !is_empty (a) then #foc_error ("min: set is empty") else let e = !choose (a) in if !is_single (a) then e else !min_e (e, !min (!rem (e, a)));

23 Ensembles finis ordonnés (suite)
let rec max (a) = if !is_empty (a) then #foc_error ("max: set is empty") else let e = !choose (a) in if !is_single (a) then e else !max_e (e, !max (!rem (e, a))); (* Properties: must be careful to partiality *) property minp : all a in self, all e in typ, !mem (e, a) → typ!leq (!min (a), e); property maxp : all a in self, all e in typ, !mem (e, a) → typ!leq (e, !max (a)); end

24 Implantation: 2 possibilités
species foset_list (typ is ordered_set) inherits finite_ordered_set (typ) = rep = list (typ); end ou mieux: species foset_list (typ is ordered_set) inherits finite_ordered_set (typ), fset_list (typ) =

25 Ensembles finis ordonnés d’entiers
species oints inherits ordered_set, integers_int = let leq = #int_leq; proof of leq_reflexive = ...; proof of leq_antisymmetric = ...; proof of leq_transitive = ...; proof of lt_is_not_leq = ...; proof of total_order = ...; end collection ints implements oints = end collection int_foset implements foset_list (ints) = end

26 Nouvelle hiérarchie setoid set finite_set finite fset_list int_fset
fsi finite_ordered_set ints ordered_set foset_list int_foset

27 Documentation: FocDoc
Le compilateur peut produire un fichier FocDoc Fichier XML décrivant l’interface des espèces Validité: DTD ou XSD fournies Production de documents HTML (MathML) ou LaTeX XSL stylesheets (pré-processeur XSL requis) Gestion de base de données Focal Requêtes Xquery (SQL adapté à XML) Documentation de notre exemple: $:> focc -I … -focdoc -dtd focdoc.dtd fo_set.foc $:> xsltproc -o fo_set.xhtml focdoc2html.xsl fo_set.focdoc $:> xsltproc -o fo_set.xml mmlctop2_0.xsl fo_set.xhtml fo_set.focdoc fo_set.xml

28 Applications Focal Bibliothèque de calcul formel (R. Rioboo, LIP6):
Actuelle bibliothèque standard de Focal Projet EDEMOI de l’ACI Sécurité Informatique (V. Donzeau-Gouge, C. Dubois, D. Delahaye, J. F. Étienne, CNAM): Réglementation de la sûreté dans les aéroports Politiques de sécurité (M. Jaume, C. Morisset, LIP6; J. Blond, Bertin): Bell et Lapadula, Muraille de Chine, ... Voir l’exposé lundi!

29 Application: le projet EDEMOI
Posez-lui des questions! V. Donzeau-Gouge, C. Dubois, D. Delahaye, J.-F. Étienne: Réglementation de la sûreté dans les aéroports formalisée en Focal Modélisation: Héritage, paramétrisation Sortie vers UML Certification: Cohérence de la spécification Zenon se révèle très approprié! Annexe 17 (ICAO) Doc 30 (ECAC)

30 Pour finir… Distribution disponible sur le site du projet Focal:
Quelques travaux en cours ou futurs: Tests (C. Dubois, M. Carlier) Invariants de représentation, réécriture, déduction modulo, ... Demain, C. Morisset pour la deuxième partie du tutoriel ou comment il est difficile de louer des DVDs sans Focal...


Télécharger ppt "Tutoriel Focal (première partie)"

Présentations similaires


Annonces Google