LES OBJETS ET LEURS MÉCANISMES DANS LE λΠ
Transcription
LES OBJETS ET LEURS MÉCANISMES DANS LE λΠ
LES OBJETS ET LEURS MÉCANISMES DANS LE λΠ-CALCUL MODULO Raphaël Cauderlier Sous la direction de Catherine Dubois 1 Introduction Les progrès fulgurants de l'informatique ont permis aux logiciels d'entrer dans chaque parcelle de nos vies. Nous nous éloignons rarement d'une machine faisant tourner des logiciels et nous nous conons de plus en plus à ces logiciels. Nous leur conons un peu de notre intimité à chaque fois que nous enregistrons des données personnelles sur une machine. Nous leur conons notre sécurité et notre liberté lorsque nous verrouillons nos portes par des systèmes de contrôle d'identité. Nous leur conons notre argent lorsque nous eectuons un paiement par carte bancaire. Nous leur conons même nos vies lorsque nous nous déplaçons en voiture assistée par ordinateur, avion ou transport en commun automatisé ou encore lorsque les logiciels contrôlent les machines de nos hôpitaux. Cependant, le développement des logiciels est tellement dicile que les programmes présentent presque systématiquement des bugs, c'est-à-dire des comportements non souhaités. Ces bugs peuvent avoir des eets catastrophiques. Par exemple, les failles Heartbleed[7] et Shellshock, découvertes en 2014, ont menacé la sécurité de millions de sites et d'utilisateurs du web. Les méthodes formelles visent à garantir la conance que nous avons en nos logiciels en démontrant mathématiquement qu'ils vérient leurs spécications. Parmi elles, on peut distinguer les méthodes formelles déductives comme la méthode B[2] et les assistants de preuve Coq[8], Matita[3] et Isabelle[18] qui permettent de dériver ou d'extraire un programme de sa spécication ou encore les ateliers de développement FoCaLiZe[11] et FramaC[16] qui permettent de développer des logiciels en parallèle de sa certication. Toutes ces méthodes s'appuient sur la preuve formelle. Par rapport aux autres méthodes formelles, comme le model-checking et l'analyse statique, les méthodes formelles déductives ont l'avantage de fournir des résultats pour toute exécution et sans approximation mais sont aussi beaucoup plus coûteuses car elles demandent une grande expertise du système logique sous-jacent. Malgré son coût, la démonstration formelle a été appliquée avec succès pour démontrer des théorèmes mathématiques trop diciles pour être vériés manuellement par des mathématiciens, par exemple parce qu'ils reposaient sur beaucoup de calcul comme la conjecture de Kepler[13] sur l'empilement optimal de sphères ou le théorème des 4 couleurs[12] sur la coloration des graphes planaires. Plusieurs outils logiciels permettent d'interagir avec un utilisateur humain pour développer une démonstration. Ils ont chacun leurs particularités 2 et leurs points forts. Le système Coq[8] permet de développer des preuves constructives dans un système logique puissant et propose un langage de tactiques évolué qui permet de programmer la manière de chercher des preuves. Le système Isabelle[18] permet de chercher automatiquement des contreexemples aux énoncés entrés dans le systèmes avant de commencer la démonstration, ce qui permet de détecter un grand nombre d'erreurs de spécication. Il dispose aussi d'un mécanisme poussé pour décharger la recherche de preuve à des prouveurs automatiques utilisés comme des oracles indiquant quelles sont les hypothèses susantes pour terminer la démonstration. Cependant, contrairement au cas du développement de logiciels dans plusieurs langages de programmation en compilant tous les programmes vers le même langage d'assemblage, il n'est pas possible de développer une démonstration dans ces diérents systèmes logiques pour bénécier des avantages de chacun. Ce problème ralentit l'adoption de ces outils car en plus d'être coûteux, le développement d'une preuve formelle n'est pas réutilisable dans un autre cadre logique. FoCaLiZe[11] est un atelier de développement, spécication et certication qui vise à populariser la démonstration interactive auprès des développeurs. Il propose des fonctionnalités inspirées du paradigme, très populaire, de la programmation orientée objet ainsi qu'un langage de spécication simple : la logique du premier ordre. Le compilateur de FoCaLiZe produit d'une part un programme dans le langage OCaml[14], et d'autre part, à l'aide de Zenon[6], une preuve vériable par Coq. FoCaLiZe permet donc la coopération de la preuve automatique et de la vérication de preuve. Le λΠ-calcul modulo[9] est une extension du λ-calcul ajoutant du typage dépendant et de la réécriture. La combinaison de ces deux fonctionnalités en fait un calcul permettant d'encoder de manière supercielle une grande variété de formalismes logiques. Ces encodages ont été implantés en tant que traducteurs vers Dedukti[17] un véricateur de preuves pour le λΠ-calcul modulo des preuves de Coq, Matita, HOL, Zenon et iProver Modulo. Cette thèse a deux objectifs. D'une part, elle vise à étudier la possibilité d'utiliser FoCaLiZe comme atelier d'interopérabilité entre les langages traduits vers Dedukti, ce qui nécessite une extension du compilateur de FoCaLiZe pour produire une sortie Dedukti en plus de la sortie Coq et de la sortie OCaml. D'autre part, nous chercherons à généraliser cette traduction de FoCaLiZe vers Dedukti à une traduction des objets et de leurs mécanismes en Dedukti. 3 2 Contexte scientique 2.1 Dedukti Le λΠ-calcul modulo est un λ-calcul typé avec types dépendants et dont la conversion peut être étendue à la congruence modulo un système de réécriture du premier ordre arbitraire. Si ce système de réécriture est conuent et fortement normalisant, la vérication du typage est décidable. Dedukti ("deduire" en Esperanto) en est une implantation, c'est-à-dire un véricateur de types pour le λΠ-calcul modulo. Dedukti est un logiciel libre téléchargeable à l'adresse suivante : http: //dedukti.gforge.inria.fr. 2.2 Zenon Zenon est un prouveur automatique pour la logique classique du premier ordre. Il implante la méthode des tableaux. Contrairement à la plupart des autres prouveurs automatiques, Zenon produit une preuve, vériable par Coq, Isabelle ou Dedukti. Il dispose également d'un système d'extensions qui permettent d'étendre la méthode des tableaux, par exemple à la déduction modulo[10] ou à la super déduction[15]. Les extensions de Zenon sont aussi utilisées pour dénir des théories comme l'arithmétique, la théorie des booléens ou encore la théorie des types inductifs. Zenon est disponible à l'adresse suivante : http://zenon-prover.org. 2.3 FoCaLiZe FoCaLiZe est un atelier de programmation, spécication et vérication. Il permet d'écrire des programme dans un style fonctionnel et de modulariser le développement à travers des mécanismes orientés objets. Le bloc de base d'un développement FoCaLiZe s'appelle une espèce. Il s'agit d'un ensemble de méthodes travaillant sur un type lié à l'espèce, la représentation. On distingue les méthodes calculatoires qui correspondent aux méthodes usuelles des langages de programmation orientés objets et des méthodes logiques qui sont des preuves de correction des méthodes calculatoires. Les espèces forment une hiérarchie via une relation d'héritage entre espèces. L'héritage multiple est autorisé. 4 Les espèces peuvent être partiellement dénies, c'est-à-dire que certaines méthodes (ou la représentation) peuvent rester abstraites. Par ailleurs il est possible de redénir des méthodes au cours de l'héritage selon la sémantique de la liaison retardée. Les espèces complètes, c'est-à-dire celles dont toutes les méthodes sont dénies peuvent être instanciées de manière globale en collections. Les collections sont des structures statiques et non pas des valeurs de première classe. Les espèces peuvent être paramétrées par des valeurs et des collections. Le compilateur de FoCaLiZe produit un chier dans le langage de programmation OCaml contenant la partie calculatoire du développement et un chier Coq contenant à la fois la partie calculatoire et la partie logique. Ces deux chiers sont structurellement proches, ce qui permet de retrouver facilement dans le chier Coq où se trouve la preuve de correction de chaque fonction du chier OCaml. Bien qu'orienté objet, le langage FoCaLiZe ne comporte pas d'objet. La notion la plus proche est celle de collection. Contrairement aux objets, les collections ne sont instanciées que de manière globale ; ce ne sont pas des valeurs de première classe pouvant être passées comme argument de fonction ni retournées par les fonctions. Chaque collection de FoCaLiZe correspond, dans le chier OCaml comme dans le chier Coq, à un module. La spécication se fait en logique du premier ordre multisortée. La vérication se fait à travers le prouveur Zenon : les preuves de FoCaLiZe sont des arbres étiquetés par des formules. Les feuilles sont étiquetées par des énoncés de théorèmes précédemment démontrés et Zenon est appelé à chaque n÷eud pour vérier que l'étiquette est une conséquence logique (en logique classique du premier ordre) des étiquettes des ls de l'arbre. La sortie Coq de Zenon est ensuite utilisée pour vérier la preuve dans son ensemble. Ainsi toutes les preuves de FoCaLiZe sont vériées dans le système Coq. 2.4 Le ς -calcul Le ς -calcul[1] a été déni par Abadi et Cardelli en 1996. C'est un calcul similaire au λ-calcul mais centré sur la notion d'objet plutôt que sur la notion de fonction. Abadi et Cardelli ont proposé diérents systèmes de types pour le ς calcul : un système simplement typé, un système polymorphe et un système d'ordre supérieur. Ces systèmes sont assez proches des systèmes de types pour le λ-calcul. Ils s'en distinguent principalement selon deux critères : À cause du caractère très récursif des objets, aucun 5 de ces systèmes de types ne garantit la normalisation (même faible) du calcul. Ces systèmes de types comportent du sous-typage, une fonctionnalité plutôt rare dans les calculs fonctionnels. Ainsi, l'encodage dans le λΠ-calcul modulo peut être jugé a priori différent de ceux déjà réalisés. 3 Compilation de FoCaLiZe en Dedukti J'ai développé au sein du compilateur de FoCaLiZe une nouvelle sortie pour le langage Dedukti. Cette sortie s'appelle Focalide (FOCALize In DEdukti) et est disponible à l'adresse https://www.rocq.inria.fr/ deducteam/Focalide/index.html. Cette sortie est une adaptation de la sortie Coq de FoCaLiZe. Elle a été modiée pour la syntaxe de Dedukti et pour les particularités de Dedukti que nous allons détailler dans cette partie. 3.1 Compilation des aspects logiques de FoCaLiZe Le compilateur de FoCaLiZe vers Coq n'invoque pas directement Zenon mais produit un chier avec l'extension .zv correspondant au chier Coq nal mais comportant des trous contenant des entrées pour Zenon. La syntaxe utilisée pour énoncer les hypothèses et le théorème que Zenon doit démontrer est un fragment de celle de Coq. La compilation des preuves de FoCaLiZe vers Dedukti suit le même procédé : Zenon est appelé dans un fragment de la syntaxe de Dedukti et produit un terme Dedukti. Une sortie Dedukti pour Zenon a été développée par Frédéric Gilbert pour expérimenter une traduction de preuves classiques en preuves intuitionnistes. Comme aucune entrée Dedukti pour Zenon n'existait, j'en ai développé une. Il arrive parfois que Zenon utilise l'égalité au cours d'une preuve sans expliciter le type de cette égalité, laissant Coq l'inférer comme paramètre implicite. Ce mécanisme n'est pas présent dans Dedukti qui demande à ce que tout soit explicité. An de résoudre ce problème, j'ai travaillé avec Pierre Halmagrand et Guillaume Bury sur l'ajout du typage dans Zenon. Ma participation principale à ce travail a été de rendre les extensions de Zenon utilisées par FoCaLize compatibles avec le typage. FoCaLiZe utilise deux extensions de Zenon : l'extension focal traitant essentiellement du type primitif des booléens et des propriétés des connecteurs et l'extension induct traitant du pattern-matching sur les types 6 inductifs. J'ai adapté la première à la version typée de Zenon. La seconde utilise des encodages diciles à typer, j'ai préféré la remplacer par une extension simple pair traitant uniquement le cas des couples. Les preuves nécessitant du raisonnement sur des types inductifs autre que les couples ne sont pour l'instant pas acceptées dans le cadre de la compilation de FoCaLiZe vers Dedukti. 3.2 Aspects programmatoires La partie programmatoire du langage FoCaLiZe est un langage fonctionnel simple à la ML. Il est traduit de manière très directe vers OCaml et Coq. Les principaux manques de Dedukti en tant que langage de programmation fonctionnelle ont été les absences du pattern-matching local et d'une bibliothèques sur les types considérés comme primitifs par FoCaLiZe. 3.2.1 Pattern-matching Le seul pattern-matching autorisé dans Dedukti est l'écriture de règles de réécriture. Celui-ci dière du pattern-matching de FoCaLiZe pour deux raisons. Premièrement il s'agit d'un mécanisme global en Dedukti ne pouvant apparaître qu'à toplevel alors que c'est un mécanisme local en FoCaLiZe pouvant apparaître dans n'importe quel terme. Deuxièmement, la sémantique est légèrement diérente. Par exemple, dans le cas de FoCaLiZe, le second motif du terme let f (n) = match n with | 0 -> 1 | n -> 1 / n ne peut être instancié que par un entier non nul tandis qu'en Dedukti, c'est à l'utilisateur de garantir la conuence du système donc les règles [] f 0 --> 1. [] f n --> 1 / n. ne devraient pas être présentes simultanément. Pour ces raisons, nous ne pouvons pas directement utiliser le patternmatching de Dedukti pour représenter celui de FoCaLiZe mais nous compilons le pattern-matching vers des destructeurs. 7 3.2.2 Bibliothèque sur les types primitifs FoCaLiZe compile vers OCaml et Coq qui sont des langages riches. Certains types et opérations complexes sont primitifs en FoCaLiZe (et non pas dénis dans une bibliothèque) comme les chaînes de caractères, ou le reste de la division euclidienne sur les entiers relatifs. Ainsi la traduction de FoCaLiZe a nécessité le développement d'une bibliothèque pour Dedukti. Ce besoin est spécique à FoCaLiZe parce que les prouveurs considèrent généralement ces types et ces opérations comme faisant partie de théories dénies dans le langage du prouveur. 3.3 Aspects orientés objets FoCaLiZe compile les espèces complètes vers des enregistrements, en OCaml comme en Coq. Dedukti ne dispose pas de types enregistrement mais ils sont faciles à ajouter à Dedukti en tant que sucre syntaxique. J'ai développé un parseur pour Dedukti, Sukerujo ("sucrier" en Esperanto), qui rajoute à la syntaxe de Dedukti des types enregistrement. Les chiers dans la syntaxe Sukerujo peuvent être traduits en Dedukti par l'outil skindent. 3.4 Bilan et perspectives de mon travail sur Focalide J'ai développé un outil, Focalide, permettant de produire un chier Dedukti depuis un chier FoCaLiZe de manière similaire à la sortie Coq de FoCaLiZe. 95% de la bibliothèque standard de FoCaLiZe sont compilés par Focalide vers du code accepté par Dedukti. Les échecs restants sont dûs à des limitations de la traduction et à des limitations de la sortie Dedukti typée de Zenon. Je souhaite continuer à améliorer Focalide et Zenon an de passer la totalité de la bibliothèque. Je suis également intéressé par la possibilité d'utiliser la déduction modulo dans FoCaLiZe, ce qui ne peut se faire que via Focalide puisque l'extension deduction modulo de Zenon (Zenon modulo) ne peut produire que des preuves Dedukti. Enn, je souhaite désormais étudier l'utilisabilité de FoCaLiZe comme atelier de l'interopérabilité entre les systèmes logiques traduits vers Dedukti. 8 4 Traduction d'un calcul objet en Dedukti Le ς -calcul est très complémentaire de FoCaLiZe dans l'étude des objets en Dedukti. En eet, contrairement à FoCaLiZe qui ne dispose d'objet de première classe, le ς -calcul est un calcul dans lequel tout est objet. Non seulement les objets sont des valeurs de première classe mais toutes les valeurs sont des objets. Dedukti est basé sur la réécriture, ce qui est un bon moyen pour exprimer la sémantique d'un langage de programmation via un encodage superciel. Par encodage superciel, nous désignons un encodage préservant l'opération de liaison des variables (c'est-à-dire traduisant les variables par des variables et les lieurs par des lieurs), le typage (c'est-à-dire traduisant les jugements de typage par des jugements de typage) et la réduction. Les dicultés majeures de l'encodage proviennent de l'absence de terminaison et du sous-typage. An de les étudier, nous avons choisi le système de types le plus simple présentant ces dicultés : le ς -calcul simplement typé. 4.1 Un encodage superciel d'un calcul non normalisant Puisque nous voulons un encodage superciel, donc préservant la réduction, d'un calcul non normalisant en Dedukti, le système de réécriture modulo lequel Dedukti doit travailler ne sera pas terminant. Cela ne remet pas en cause la correction de Dedukti qui ne repose que sur la conuence. En revanche, il est possible que Dedukti ne termine pas. Pour simplier la preuve de conuence, nous avons dans un premier temps déni un encodage conuent et fortement normalisant du ς -calcul. Cet encodage vérie deux de nos trois critères de supercialité : il préserve la liaison de variable et le typage mais il ne préserve pas la réduction (la relation de réduction est traduite par un axiome). Cet encodage a été implanté dans l'outil Sigmaid (SIGMA-calculus In Dedukti) et permet non seulement de produire des termes Dedukti mais aussi des termes Coq. Nous avons ensuite ajouté à cet encodage une règle de réécriture permettant de préserver la réduction et nous avons prouvé que le système reste conuent après l'ajout de cette règle. 4.2 Le sous-typage des objets en Dedukti Dedukti ne dispose pas de sous-typage. Le sous-typage ne peut s'encoder de manière implicite en Dedukti puisqu'il y a en Dedukti unicité du type des 9 termes (modulo conversion). Le sous-typage est donc explicité en Dedukti au moyen de coercions qui sont insérées par Sigmaid. Ces coercions ne sont pas présentent dans le ς -calcul donc elles ne doivent pas bloquer la réduction des ς -termes. Heureusement, cette condition peut s'écrire comme un système de réécriture indiquant comment commuter les coercions et les opérations du calcul. 4.3 Bilan de la traduction du ς -calcul simplement typé en Dedukti Nous avons prouvé la correction de cet encodage superciel du ς -calcul simplement typé en Dedukti et nous l'avons implanté dans un outil, Sigmaid. Ce travail a été présenté à la conférence TYPES 2014[5] et un article a été soumis. Cet encodage est actuellement la seule traduction supercielle d'un calcul non normalisant en Dedukti. En revanche, notre traitement du sous-typage est proche de la solution adoptée par Ali Assaf pour le sous-typage de Coq dans le traducteur de Coq en Dedukti[4]. 5 Conclusion Au cours de cette première moitié de thèse, j'ai étudié la traduction en Dedukti de deux systèmes orientés objet très diérents : FoCaLiZe est un système très statique mais faisant interagir des méthodes calculatoires et des méthodes logiques tandis que le ς -calcul simplement typé n'est que calculatoire mais très dynamique. Je souhaite poursuivre ce travail en cherchant comment étendre le ς calcul avec des méthodes logiques quitte à limiter l'aspect dynamique du calcul. Je souhaite aussi étudier les possibilités oertes par les mécanismes orientés objet en Dedukti pour l'interopérabilité des systèmes traduits vers Dedukti. References [1] M. Abadi and L. Cardelli. A Theory of Objects. Monographs in Computer Science. Springer New York, 1996. [2] Jean-Raymond Abrial. The B Book - Assigning Programs to Meanings. Cambridge University Press, August 1996. 10 [3] Andrea Asperti, Claudio Sacerdoti Coen, Enrico Tassi, and Stefano Zacchiroli. User interaction with the matita proof assistant. Journal of Automated Reasoning, Special, 2006. [4] Ali Assaf. A calculus of constructions with explicit subtyping. HAL Id : hal-01097401, 2014. [5] Ali Assaf, Raphaël Cauderlier, and Catherine Dubois. Objects and subtyping in the λπ calculus modulo. In TYPES 2014, Book of Abstracts, 2014. [6] Richard Bonichon, David Delahaye, and Damien Doligez. Zenon : An extensible automated theorem prover producing checkable proofs. In LPAR, pages 151165, 2007. [7] Codenomicon. heartbleed. http://heartbleed.com/, 2014. [8] The Coq Development Team. The Coq Reference Manual, version 8.4, August 2012. Available electronically at http://coq.inria.fr/doc. [9] Denis Cousineau and Gilles Dowek. Embedding pure type systems in the lambda-pi-calculus modulo. In S. Ronchi Della Rocca, editor, TLCA, volume 4583 of LNCS, pages 102117. Springer, 2007. [10] David Delahaye, Damien Doligez, Frédéric Gilbert, Pierre Halmagrand, and Olivier Hermant. Zenon modulo: When achilles outruns the tortoise using deduction modulo. In LPAR 2013, pages 274290, 2013. [11] C. Dubois, T. Hardin, and V. Viguié Donzeau-Gouge. Focal: an environment for developing certied components. In Hans-Wolfgang Loidl editor, editor, Fifth Symposium on Trends in Functional Programming, Trends in Functional Programming, pages 3348, November 2004. [12] Georges Gonthier. The four colour theorem: Engineering of a formal proof. In ASCM, 2007. [13] Thomas C. Hales, John Harrison, Sean McLaughlin, Tobias Nipkow, Steven Obua, and Roland Zumkeller. A revision of the proof of the kepler conjecture. In Discrete and Computational Geometry 44(1), pages 134, 2010. [14] [email protected]. Ocaml. http://caml.inria.fr. 11 [15] Mélanie Jacquel, Karim Berkani, David Delahaye, and Catherine Dubois. Tableaux modulo theories using superdeduction - an application to the verication of b proof rules with the zenon automated theorem prover. In IJCAR 2012, pages 332338, 2012. [16] Florent Kirchner, Nikolai Kosmatov, Virgile Prevosto, Julien Signoles, and Boris Yakobowski. Frama-c: A software analysis perspective. Formal Aspects of Computing, pages 137, 2015. [17] Ronan Saillard. Dedukti: a universal proof checker. In Foundation of Mathematics for Computer-Aided Formalization Workshop, 2013. [18] Markus Wenzel. The isabelle/isar reference manual. 2000. 12