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

Documents pareils