Nie można tego udowodnić. Rozważmy następujący szczególny przypadek twierdzenia, gdy ustawiamy X := bool
:
foo true = foo false -> true = false
Biorąc to pod uwagę true
i false
są różne, gdyby twierdzenie to było możliwe do udowodnienia, powinno być możliwe wykazanie tego foo true
i foo false
są różne. Problem polega na tym, że te dwa typy są izomorficzne :
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.
W teorii Coqa nie można pokazać, że dwa typy izomorficzne są różne bez przyjęcia dodatkowych aksjomatów. Właśnie dlatego rozszerzenie teorii Coqa, takiej jak teoria typu homotopii, jest rozsądne. W HoTT można wykazać, że typy izomorficzne są równe, a gdyby można było udowodnić swoje twierdzenie, HoTT byłby niespójny.
Arthur Azevedo De Amorim
źródło
(x <> y) -> (foo x <> foo y)
? Jestem naprawdę zdezorientowany na tym świecie bez zasady wykluczonego środka.