回答:
証明できません。次のように設定するとき、定理の次の特別なケースを考えますX := bool
。
foo true = foo false -> true = false
ことを考えるtrue
と、false
定理が証明可能であれば異なっている、あることを示すことが可能であるべきであるfoo true
とはfoo false
異なっています。問題は、これら2つのタイプが同型であることです。
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.
Coqの理論では、余分な公理を仮定せずに2つの同型タイプが異なることを示すことはできません。これが、ホモトピー型理論などのCoqの理論の拡張が適切である理由です。HoTTでは、同型の型が等しいことを示すことができ、定理を証明することが可能である場合、HoTTは矛盾します。
(x <> y) -> (foo x <> foo y)
ですか?中途排除の原則がなければ、私はこの世界で本当に混乱しています。