Prouver la non-pertinence des preuves dans Coq?

18

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 Propgenre 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 booltype (ou Setselon les mots de Coq), à savoir trueet falsesoient égaux. Mais si vous les mettez Prop, ils sont traités de la même manière.

journée
la source
Intrigant. Je suis sûr que vous obtiendrez une réponse en quelques minutes sur la liste de diffusion Coq. (Assurez-vous de poster la réponse ici, si vous le faites.)
Dave Clarke
2
Pour ceux d'entre nous qui sont curieux de savoir sur quoi porte votre question, mais qui ne connaissent pas Coq, pouvez-vous peut-être ajouter une ou deux phrases expliquant ce que ce théorème signifie en anglais? (Et peut-être à quoi sert la "non-pertinence de la preuve"?)
Joshua Grochow
@Joshua, je ne suis pas en mesure de l'expliquer en détail, car c'est aussi nouveau pour moi, c'est aussi pourquoi cela m'a intrigué pendant un certain temps. Mais de toute façon, voici ma tentative (voir dans la partie question).
jour
6
@Joshua, IIRC, en mathématiques constructives, une preuve d'une implication comme est une fonction / processus / algorithme / construction qui convertit une preuve de en une preuve de , et la construction est une preuve non pertinente si la preuve résultante de ne dépend pas de la preuve qui est donnée pour . UNEBUNEBBUNE
Kaveh

Réponses:

28

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_decmodule 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):

Require Bool.
Require Eqdep_dec.
Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.
Proof.
  intros; apply Eqdep_dec.eq_proofs_unicity; intros.
  destruct (Bool.bool_dec x y); tauto.
Qed.

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 de true=b(comme d'habitude dans Coq, il est plus facile d'avoir la constante en premier). Ensuite, nous montrons que toute preuve de true=bdoit être refl_equal true.

Let nu b (p:true = b) : true = b :=
  match Bool.bool_dec true b with
    | left eqxy => eqxy
    | right neqxy => False_ind _ (neqxy p)
  end.
Lemma bool_pcanonical : forall (b : bool) (p : true = b), p = nu b p.
Proof.
  intros. case p. destruct b.
  unfold nu; simpl. reflexivity.
  discriminate p.
Qed.

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.

Gilles 'SO- arrête d'être méchant'
la source