La prova dell'irrilevanza in generale non è implicita dalla teoria alla base di Coq. Anche la prova dell'irrilevanza per l'uguaglianza non è implicita; è equivalente all'assioma K di Streicher . Entrambi possono essere aggiunti come assiomi .
Ci sono sviluppi in cui è utile ragionare su oggetti di prova, e l'irrilevanza di prova rende quasi impossibile. Probabilmente questi sviluppi dovrebbero avere tutti gli oggetti la cui struttura è importante Set
, ma con la teoria di base di Coq la possibilità è lì.
C'è un'importante sottocasi di irrilevanza delle prove che vale sempre. L'assioma K di Streicher tiene sempre su domini decidibili, cioè le prove di uguaglianza su insiemi decidibili sono uniche. La prova generale è nel Eqdep_dec
modulo nella libreria standard Coq. Ecco il tuo teorema come corollario (la mia prova qui non è necessariamente la più elegante):
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.
Per questo caso speciale, ecco una prova diretta (ispirata alla prova generale in Eqdep_dec.v
). Innanzitutto, definiamo di definire una prova canonica di true=b
(come al solito in Coq, è più facile avere la costante prima). Quindi mostriamo che ogni prova true=b
deve essere 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.
Se aggiungi la logica classica a Coq, ottieni prove irrilevanza. Intuitivamente parlando, la logica classica ti dà un oracolo decisionale per le proposizioni, e questo è abbastanza buono per l'assioma K. C'è una prova nel modulo di libreria standard Coq Classical_Prop
.