Mots clés : isomorphisme de
Curry-Howard, réalisabilité, logique intuitionniste, calcul
des constructions inductives .
- Logique Intuitionniste
- Logique constructive dans laquelle la disjonction
ou la quantification existentielle ont un sens
fort : une preuve de
A
A permet de
décider qui de A ou
A est vérifié, une preuve de
x.P(x) permet de
construire a tel que
P(a). Le principe
du tiers-exclu
A
A n'est pas a
priori admis pour une formule quelconque A.
- Réalisabilité
- Introduite par le logicien Kleene, il s'agit d'une
interprétation de la logique intuitionniste dans laquelle
toute formule est vue comme un ensemble de programmes qui
satisfait un propriété caractérisée par la formule. La
validité de la réalisabilité assure que toute preuve
d'une formule peut être traduite en un programme
appartenant à l'interprétation de la formule et donc
satisfaisant la propriété.
- Isomorphisme de Curry-Howard
- Correspondance entre les preuves en déduction
naturelle et les lambda-termes typés.
Résumé :
Le Calcul des Constructions Inductives repose sur
l'isomorphisme de Curry-Howard qui identifie les preuves et
les programmes fonctionnels. Coq propose une chaîne de développement
allant de l'écriture de la spécification jusqu'à la
production d'un code exécutable certifié.
La principale originalité du Calcul des Constructions
Inductives est que les démonstrations y sont des objets au
même titre que les nombres, les fonctions ou les ensembles.
Ainsi un entier pair sera représenté par un couple formé d'un
entier et d'une preuve que cet entier est pair. La seconde
originalité de ce formalisme est que chaque terme exprimant
un objet d'un type de données, peut se réduire sur une valeur
de ce type de données. Par exemple, le terme 2 + 5 se réduit sur la valeur 7.
Ces propriétés combinées permettent de concevoir la
spécification d'un programme comme une relation liant la
valeur d'entrée et la valeur de sortie de ce programme. En
effet, si Q(x,
y) décrit une telle relation, une preuve dans
le Calcul des Constructions
Inductives de la totalité de cette relation
(c'est-à-dire que
x.
y.Q(x, y))
est en fait une fonction qui, à tout objet a associe un objet b et une preuve de Q(a, b). À partir de cette
preuve, il est possible d'exprimer dans le calcul à la fois
un programme fonctionnel f
et sa preuve de correction (c'est-à-dire
x.Q(x, f
(x))). La fonction f appliquée à l'entrée a se réduira pour fournir la sortie
b.
Mais les preuves ne sont pas, en général, des programmes
efficaces, et il est nécessaire, en pratique, d'éliminer
certaines parties de ces preuves non pertinentes pour le
calcul : cette étape s'appelle l'extraction de
programme. Les programmes extraits peuvent alors être
traduits dans un langage de programmation ordinaire tel que
ML, puis compilés en code machine.
Dans cette approche, la spécification du programme est vue
comme une formule mathématique et le programme certifié est
obtenu à partir de la preuve de cette formule.
Cette interprétation est particulièrement adaptée à la
programmation fonctionnelle mais fournit également une
technique de preuve de programme impératif.