Cela ne peut pas être prouvé. Considérons le cas spécial suivant du théorème, lorsque nous posons X := bool
:
foo true = foo false -> true = false
Étant donné que true
et false
sont différents, si le théorème était prouvable, il devrait être possible de le montrer foo true
et foo false
sont différents. Le problème est que ces deux types sont isomorphes :
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.
Dans la théorie de Coq, il n'est pas possible de montrer que deux types isomorphes sont différents sans supposer des axiomes supplémentaires. C'est pourquoi une extension de la théorie de Coq telle que la théorie du type d'homotopie est valable. Dans HoTT, on peut montrer que les types isomorphes sont égaux, et s'il était possible de prouver votre théorème, HoTT serait incohérent.
Arthur Azevedo De Amorim
la source
(x <> y) -> (foo x <> foo y)
? Je suis vraiment confus dans ce monde sans principe de milieu exclu.