lean2/hott/algebra/precategory/iso.hlean

71 lines
2.4 KiB
Text
Raw Normal View History

2014-12-12 04:14:53 +00:00
-- Copyright (c) 2014 Jakob von Raumer. All rights reserved.
-- Released under Apache 2.0 license as described in the file LICENSE.
-- Authors: Floris van Doorn, Jakob von Raumer
2014-12-12 19:19:06 +00:00
import .basic .morphism types.sigma
2014-12-12 04:14:53 +00:00
open eq precategory sigma sigma.ops equiv is_equiv function is_trunc
2014-12-12 04:14:53 +00:00
open prod
namespace morphism
variables {ob : Type} [C : precategory ob] include C
variables {a b c : ob} {g : b ⟶ c} {f : a ⟶ b} {h : b ⟶ a}
-- "is_iso f" is equivalent to a certain sigma type
2014-12-12 19:19:06 +00:00
protected definition sigma_char (f : hom a b) :
(Σ (g : hom b a), (g ∘ f = id) × (f ∘ g = id)) ≃ is_iso f :=
2014-12-12 04:14:53 +00:00
begin
fapply (equiv.mk),
intro S, apply is_iso.mk,
exact (pr₁ S.2),
exact (pr₂ S.2),
fapply adjointify,
intro H, apply (is_iso.rec_on H), intros (g, η, ε),
exact (sigma.mk g (pair η ε)),
2014-12-12 04:14:53 +00:00
intro H, apply (is_iso.rec_on H), intros (g, η, ε), apply idp,
intro S, apply (sigma.rec_on S), intros (g, ηε),
apply (prod.rec_on ηε), intros (η, ε), apply idp,
end
-- The structure for isomorphism can be characterized up to equivalence
-- by a sigma type.
definition sigma_is_iso_equiv ⦃a b : ob⦄ : (Σ (f : hom a b), is_iso f) ≃ (a ≅ b) :=
begin
fapply (equiv.mk),
intro S, apply isomorphic.mk, apply (S.2),
fapply adjointify,
intro p, apply (isomorphic.rec_on p), intros (f, H),
exact (sigma.mk f H),
2014-12-12 04:14:53 +00:00
intro p, apply (isomorphic.rec_on p), intros (f, H), apply idp,
intro S, apply (sigma.rec_on S), intros (f, H), apply idp,
end
set_option apply.class_instance false -- disable class instance resolution in the apply tactic
2014-12-12 04:14:53 +00:00
-- The statement "f is an isomorphism" is a mere proposition
definition is_hprop_of_is_iso : is_hset (is_iso f) :=
begin
apply is_trunc_is_equiv_closed,
2014-12-12 04:14:53 +00:00
apply (equiv.to_is_equiv (!sigma_char)),
apply is_trunc_sigma,
2014-12-12 04:14:53 +00:00
apply (!homH),
intro g, apply is_trunc_prod,
repeat (apply is_trunc_eq; apply is_trunc_succ; apply (!homH)),
2014-12-12 04:14:53 +00:00
end
-- The type of isomorphisms between two objects is a set
definition is_hset_iso : is_hset (a ≅ b) :=
begin
apply is_trunc_is_equiv_closed,
2014-12-12 04:14:53 +00:00
apply (equiv.to_is_equiv (!sigma_is_iso_equiv)),
apply is_trunc_sigma,
2014-12-12 04:14:53 +00:00
apply homH,
intro f, apply is_hprop_of_is_iso,
end
-- In a precategory, equal objects are isomorphic
2014-12-12 19:19:06 +00:00
definition iso_of_path (p : a = b) : isomorphic a b :=
eq.rec_on p (isomorphic.mk id)
2014-12-12 04:14:53 +00:00
end morphism