Existe-t-il un moyen de prouver le théorème suivant dans Coq?
Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.
EDIT : Une tentative de donner une brève explication de "ce qu'est la pertinence non pertinente" (corrigez-moi quelqu'un si je me trompe ou je me trompe)
L'idée de base est que dans le monde de la proposition (ou du Prop
genre dans Coq), ce qui vous intéresse (et vous devriez) est vraiment la prouvabilité d'une proposition, pas les preuves de celle-ci, il peut y en avoir beaucoup (ou aucune). Dans le cas où vous avez plusieurs preuves, du point de vue de la prouvabilité, elles sont égales dans le sens où elles prouvent la même proposition . Leur distinction n'est donc pas pertinente. Cela diffère du point de vue informatique où vous vous souciez vraiment de la distinction de deux termes, par exemple, fondamentalement, vous ne voulez pas que les deux habitants du bool
type (ou Set
selon les mots de Coq), à savoir true
et false
soient égaux. Mais si vous les mettez Prop
, ils sont traités de la même manière.
la source
Réponses:
La non-pertinence de la preuve en général n'est pas impliquée par la théorie derrière Coq. Même la preuve de la non-pertinence de l'égalité n'est pas implicite; il est équivalent à l'axiome K de Streicher . Les deux peuvent être ajoutés en tant qu'axiomes .
Il y a des développements où il est utile de raisonner sur les objets de preuve, et la non-pertinence de la preuve rend cela presque impossible. On peut dire que ces développements devraient avoir tous les objets dont la structure importe
Set
, mais avec la théorie de base de Coq, la possibilité est là.Il existe un sous-cas important de non-pertinence de la preuve qui tient toujours. L'axiome K de Streicher s'applique toujours aux domaines décidables, c'est-à-dire que les preuves d'égalité sur les ensembles décidables sont uniques. La preuve générale se trouve dans le
Eqdep_dec
module de la bibliothèque standard Coq. Voici votre théorème comme corollaire (ma preuve ici n'est pas nécessairement la plus élégante):Pour ce cas particulier, voici une preuve directe (inspirée de la preuve générale en
Eqdep_dec.v
). Tout d'abord, définissons nous définissons une preuve canonique detrue=b
(comme d'habitude dans Coq, il est plus facile d'avoir la constante en premier). Ensuite, nous montrons que toute preuve detrue=b
doit êtrerefl_equal true
.Si vous ajoutez une logique classique à Coq, vous obtenez la pertinence de la preuve. Intuitivement parlant, la logique classique vous donne un oracle de décision pour les propositions, et c'est assez bon pour l'axiome K. Il y a une preuve dans le module de bibliothèque standard Coq
Classical_Prop
.la source