No se puede probar. Considere el siguiente caso especial del teorema, cuando establecemos X := bool
:
foo true = foo false -> true = false
Dado que true
y false
son diferentes, si el teorema fuera demostrable, debería ser posible mostrar eso foo true
y foo false
son diferentes. El problema es que estos dos tipos son isomórficos :
Inductive foo : bool -> Type :=
| constr : forall (x : bool), foo x.
(* An isomorphism between foo true and foo false *)
Definition foo_t_f (x : foo true) : foo false := constr false.
Definition foo_f_t (x : foo false) : foo true := constr true.
(* Proofs that the functions are inverses of each other *)
Lemma foo_t_fK x : foo_f_t (foo_t_f x) = x.
Proof. unfold foo_f_t, foo_t_f. now destruct x. Qed.
Lemma foo_f_tK x : foo_t_f (foo_f_t x) = x.
Proof. unfold foo_f_t, foo_t_f. now destruct x. Qed.
En la teoría de Coq, no es posible demostrar que dos tipos isomórficos son diferentes sin suponer axiomas adicionales. Es por eso que una extensión de la teoría de Coq, como la teoría del tipo de homotopía, es sólida. En HoTT, se puede demostrar que los tipos isomórficos son iguales, y si fuera posible probar su teorema, HoTT sería inconsistente.
Arthur Azevedo De Amorim
fuente
(x <> y) -> (foo x <> foo y)
? Estoy realmente confundido en este mundo sin principio de medio excluido.