J'ouvre un autre fil pour ne pas trop pourrir le Quizz fonctionnel
Je voulais apporter quelques précisions relativement au questionnement de DrTopos sur l'existentiel en Coq, le proof-irrelevance (indiscernabilité des preuves en « Français ») et ce genre de choses (désolé pour le retard, je suis en train d'apprendre :-))
Pour vérifier que j'ai bien compris, et si oui pour aider les lecteurs : le principe de "proof-irrelevance" pour un système logique revient à dire que si j'ai une proposition P, et deux preuves p1 et p2 de P, alors, du point de vue du système logique, p1 = p2 même si elles sont "différentes" au sens intuitif de "la façon de montrer". Autre vision de la "proof-irrelevance", il existe deux types de proposition seulement, celles qui sont démontrables et celles qui ne le sont pas (bref, en Coq, ça revient à dire que le type Prop est un type à deux éléments)
Tout d'abord, l'existentiel est défini de la façon suivante :
qui en gros est une paire de Heyting puisque pour construire un élément de type "ex A P", c'est à dire "il existe x de type A tel que P x", il faut fournir un élément x de type A et une preuve de P x. D'où l'inquiétude : peut-on extraire la première composante de cette paire à l'aide d'un destructeur ? Si oui, on n'aurait évidement pas proof-irrelevance, puisqu'on pourrait discerner deux preuves de "il existe un entier naturel pair" qui prendraient 0 ou 2 comme sus-dit entier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Inductive ex (A:Type) (P:A -> Prop) : Prop := ex_intro : forall x:A, P x -> ex P.
Or en Coq, on ne peut pas extraire le témoin. La limitation est que l'on ne peux pas extraire d'élément de type Type à partir d'un élément de type Prop. Or dans la définition, le témoin est de type Type et l'existentiel de type Prop, donc on ne peut sortir le témoin !
La raison est double. La première, qui me semble être celle historique, est que lorsque l'on fait de l'extraction de preuve toute donnée de type Prop est ignoré. On considère qu'elles n'ont pas de contenu calculatoire. Donc si on pouvait extraire un élément de type Type d'un élément de type Prop, on jetterai l'élément de type Prop à l'extraction, et l'élément de type Type devrait être créé ex-nihilo (là normalement j'ai perdu tout le monde)
La deuxième raison, qui devrait plus plaire au DrTopos est que les gens qui font Coq ont à coeur de maintenir la compatibilité avec le principe de proof-irrelevance. Ils savent que si l'on ajoute la logique classique et l'opérateur de description à Coq, alors on peut prouver le principe de proof-irrelevance, et que s'il était contradictoire avec le reste du système Coq, cela rendrait impossible l'ajout de ces deux principes qui plaisent quand même bien aux matheux qui font du Coq (il parait que ne pas avoir le droit de faire de disjonction de cas ou de nommer cet unique réel qui monté au carré vaut x leur pose problème. Je ne les comprendrais jamais :-p).
Alors est-il impossible de faire du Martin-Löf, de récupérer le premier élément ? Et bien non ! Le type sig est là pour vous :
Aucune différence mis à part que c'est de type Type au lieu d'être de type Prop, et que l'on peut donc s'en donner à coeur joie sur l'extraction ! Et lors de l'extraction de programme, l'élément vérifiant l'existentiel sera bien extrait et seul la preuve sera jetée (puisqu'elle a été faite une fois pour toutes)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Inductive sig (A:Type) (P:A -> Prop) : Type := exist : forall x:A, P x -> sig P.
Pour résumer, Coq n'est pas incompatible avec le principe d'indiscernabilité des preuves (du moins pas de façon connue :-)), et en plus, ça arrange aussi au niveau de l'extraction de programme.
Bref, faites du coq, c'est comme ça
Partager