ไม่สามารถพิสูจน์ได้ พิจารณากรณีพิเศษของทฤษฎีบทต่อไปนี้เมื่อเราตั้งค่าX := bool
:
foo true = foo false -> true = false
ระบุว่าtrue
และfalse
มีความแตกต่างกันถ้าทฤษฎีบทก็สามารถพิสูจน์ได้ก็ควรจะเป็นไปได้ที่จะแสดงให้เห็นว่าfoo true
และfoo false
จะแตกต่างกัน ปัญหาคือว่าทั้งสองประเภทisomorphic :
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 มันเป็นไปไม่ได้ที่จะแสดงให้เห็นว่าสองประเภท isomorphic แตกต่างกันโดยไม่ต้องสมมติความจริงเป็นพิเศษ นี่คือเหตุผลที่การขยายทฤษฎี Coq เช่นทฤษฎีแบบhomotopyเป็นเสียง ใน HoTT ประเภท isomorphic สามารถแสดงให้เท่ากันและถ้าเป็นไปได้ที่จะพิสูจน์ทฤษฎีบทของคุณ HoTT จะไม่สอดคล้องกัน