mirror of https://github.com/nmvdw/HITs-Examples
172 lines
5.0 KiB
Coq
172 lines
5.0 KiB
Coq
(** Some general prerequisities in homotopy type theory. *)
|
|
Require Import HoTT.
|
|
|
|
Definition squash (A : Type) `{Decidable A} : Type :=
|
|
match dec A with
|
|
| inl _ => Unit
|
|
| inr _ => Empty
|
|
end.
|
|
|
|
Definition from_squash (A : Type) `{Decidable A} {x : squash A} : A.
|
|
Proof.
|
|
unfold squash in *.
|
|
destruct (dec A).
|
|
- apply a.
|
|
- contradiction.
|
|
Defined.
|
|
|
|
Lemma ap_inl_path_sum_inl {A B} (x y : A) (p : inl x = inl y) :
|
|
ap inl (path_sum_inl B p) = p.
|
|
Proof.
|
|
transitivity (@path_sum _ B (inl x) (inl y) (path_sum_inl B p));
|
|
[ | apply (eisretr_path_sum _) ].
|
|
destruct (path_sum_inl B p).
|
|
reflexivity.
|
|
Defined.
|
|
|
|
Lemma ap_equiv {A B} (f : A <~> B) {x y : A} (p : x = y) :
|
|
ap (f^-1 o f) p = eissect f x @ p @ (eissect f y)^.
|
|
Proof.
|
|
destruct p.
|
|
hott_simpl.
|
|
Defined.
|
|
|
|
Global Instance hprop_lem `{Univalence} (T : Type) (Ttrunc : IsHProp T) : IsHProp (T + ~T).
|
|
Proof.
|
|
apply (equiv_hprop_allpath _)^-1.
|
|
intros [x | nx] [y | ny] ; try f_ap ; try (apply Ttrunc) ; try contradiction.
|
|
- apply equiv_hprop_allpath. apply _.
|
|
Defined.
|
|
|
|
Global Instance inl_embedding (A B : Type) : IsEmbedding (@inl A B).
|
|
Proof.
|
|
- intros [x1 | x2].
|
|
* apply ishprop_hfiber_inl.
|
|
* intros [z p].
|
|
contradiction (inl_ne_inr _ _ p).
|
|
Defined.
|
|
|
|
Global Instance inr_embedding (A B : Type) : IsEmbedding (@inr A B).
|
|
Proof.
|
|
- intros [x1 | x2].
|
|
* intros [z p].
|
|
contradiction (inr_ne_inl _ _ p).
|
|
* apply ishprop_hfiber_inr.
|
|
Defined.
|
|
|
|
Class MerelyDecidablePaths A :=
|
|
m_dec_path : forall (a b : A), Decidable(Trunc (-1) (a = b)).
|
|
|
|
Definition S1_merely_decidable_equality `{Univalence} : MerelyDecidablePaths S1.
|
|
Proof.
|
|
simple refine (S1_ind _ _ _) ; simpl.
|
|
- simple refine (S1_ind _ _ _) ; simpl.
|
|
* apply (inl (tr idpath)).
|
|
* apply path_ishprop.
|
|
- apply path_forall.
|
|
intro z.
|
|
rewrite transport_forall, transport_sum.
|
|
destruct
|
|
(transportD (fun _ : S1 => S1)
|
|
(fun x y : S1 => Decidable (Trunc (-1) (x = y)))
|
|
loop
|
|
(transport (fun _ : S1 => S1) loop^ z)
|
|
(S1_ind
|
|
(fun x : S1 => Decidable (Trunc (-1) (base = x)))
|
|
(inl (tr 1%path))
|
|
(transport_sum loop (inl (tr 1))
|
|
@
|
|
ap inl
|
|
(path_ishprop
|
|
(transport
|
|
(fun a : S1 => Trunc (-1) (base = a))
|
|
loop
|
|
(tr 1))
|
|
(tr 1)
|
|
)
|
|
)
|
|
(transport (fun _ : S1 => S1) loop^ z)
|
|
)
|
|
)
|
|
as [t | n].
|
|
** revert t.
|
|
revert z.
|
|
simple refine (S1_ind (fun _ => _) _ _) ; simpl.
|
|
*** intros.
|
|
apply path_ishprop.
|
|
*** apply path_forall.
|
|
intro z.
|
|
rewrite transport_forall, transport_paths_FlFr, ap_const.
|
|
hott_simpl.
|
|
apply set_path2.
|
|
** contradiction n.
|
|
rewrite ?transport_const.
|
|
simple refine (S1_ind (fun q => Trunc (-1) (base = q)) _ _ z) ; simpl.
|
|
*** apply (tr idpath).
|
|
*** apply path_ishprop.
|
|
Defined.
|
|
|
|
Global Instance DecidableToMerely A (H : DecidablePaths A) : MerelyDecidablePaths A.
|
|
Proof.
|
|
intros x y.
|
|
destruct (dec (x = y)).
|
|
- apply (inl(tr p)).
|
|
- refine (inr(fun p => _)).
|
|
strip_truncations.
|
|
apply (n p).
|
|
Defined.
|
|
|
|
Section merely_decidable_operations.
|
|
Variable (A B : Type).
|
|
Context `{MerelyDecidablePaths A} `{MerelyDecidablePaths B}.
|
|
|
|
Global Instance merely_decidable_paths_prod : MerelyDecidablePaths(A * B).
|
|
Proof.
|
|
intros x y.
|
|
destruct (m_dec_path (fst x) (fst y)) as [p1 | n1],
|
|
(m_dec_path (snd x) (snd y)) as [p2 | n2].
|
|
- apply inl.
|
|
strip_truncations.
|
|
apply tr.
|
|
apply path_prod ; assumption.
|
|
- apply inr.
|
|
intros pp.
|
|
strip_truncations.
|
|
apply (n2 (tr (ap snd pp))).
|
|
- apply inr.
|
|
intros pp.
|
|
strip_truncations.
|
|
apply (n1 (tr (ap fst pp))).
|
|
- apply inr.
|
|
intros pp.
|
|
strip_truncations.
|
|
apply (n1 (tr (ap fst pp))).
|
|
Defined.
|
|
|
|
Global Instance merely_decidable_sum : MerelyDecidablePaths (A + B).
|
|
Proof.
|
|
intros [x1 | x2] [y1 | y2].
|
|
- destruct (m_dec_path x1 y1) as [t | n].
|
|
* apply inl.
|
|
strip_truncations.
|
|
apply (tr(ap inl t)).
|
|
* refine (inr(fun p => _)).
|
|
strip_truncations.
|
|
refine (n(tr _)).
|
|
refine (path_sum_inl _ p).
|
|
- refine (inr(fun p => _)).
|
|
strip_truncations.
|
|
refine (inl_ne_inr x1 y2 p).
|
|
- refine (inr(fun p => _)).
|
|
strip_truncations.
|
|
refine (inr_ne_inl x2 y1 p).
|
|
- destruct (m_dec_path x2 y2) as [t | n].
|
|
* apply inl.
|
|
strip_truncations.
|
|
apply (tr(ap inr t)).
|
|
* refine (inr(fun p => _)).
|
|
strip_truncations.
|
|
refine (n(tr _)).
|
|
refine (path_sum_inr _ p).
|
|
Defined.
|
|
End merely_decidable_operations. |