La irrelevancia de la prueba en general no está implícita en la teoría detrás de Coq. Incluso la prueba de irrelevancia para la igualdad no está implícita; es equivalente al axioma K de Streicher . Ambos se pueden agregar como axiomas .
Hay desarrollos en los que es útil razonar sobre objetos de prueba, y la irrelevancia de la prueba hace que esto sea casi imposible. Podría decirse que estos desarrollos deberían tener todos los objetos cuya estructura es importante Set
, pero con la teoría básica de Coq, existe la posibilidad.
Hay un importante subcase de irrelevancia de la prueba que siempre se mantiene. El axioma K de Streicher siempre tiene dominios decidibles, es decir, las pruebas de igualdad en conjuntos decidibles son únicas. La prueba general está en el Eqdep_dec
módulo en la biblioteca estándar de Coq. Aquí está su teorema como corolario (mi prueba aquí no es necesariamente la más 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.
Para este caso especial, aquí hay una prueba directa (inspirada en la prueba general en Eqdep_dec.v
). Primero, definimos definimos una prueba canónica de true=b
(como es habitual en Coq, es más fácil tener la constante primero). Luego mostramos que cualquier prueba de true=b
tiene que ser 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 agrega lógica clásica a Coq, obtendrá irrelevancia de prueba. Intuitivamente hablando, la lógica clásica le brinda un oráculo de decisión para las proposiciones, y eso es lo suficientemente bueno para el axioma K. Hay una prueba en el módulo de biblioteca estándar de Coq Classical_Prop
.