-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Retract of weak equivalences is a weak equivalence #1
base: top-dev
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -19,14 +19,75 @@ structure is_model_category (W C F : morphism_class M) : Prop := | |
-- TODO: Show that it follows that W is closed under retracts. See | ||
-- https://ncatlab.org/nlab/show/model+category#ClosureOfMorphisms | ||
|
||
lemma is_model_category.weq_of_weq_retract_fib { W C F : morphism_class M } ( h : is_model_category W C F ) | ||
{a b a' b'} {f : a ⟶ b} {f' : a' ⟶ b'} (r : retract f f') (hf : W f) (hf': F f') : W f' := begin | ||
rcases h.acf.fact f with ⟨ c, α, β, WCα, Fβ, f_fact ⟩, | ||
rw h.acf.llp at WCα, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since you undo this |
||
choose l hl using WCα hf' r.ra (β ≫ r.rb) (by { rw [← category.assoc, f_fact], exact r.hr }), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I could have sworn I tried |
||
have rβf' : retract β f' := { | ||
ia := (r.ia) ≫ α, | ||
ra := l, | ||
ib := r.ib, | ||
rb := r.rb, | ||
ha := by { simp, rw hl.1, exact r.ha }, | ||
hb := r.hb, | ||
hi := by { rw [category.assoc, f_fact], exact r.hi }, | ||
hr := hl.2, | ||
}, | ||
rw ← h.acf.llp at WCα, | ||
rw ← f_fact at hf, | ||
exact (is_wfs.retract_right h.caf rβf' ⟨ Fβ, h.weq.weq_cancel_left WCα.2 hf ⟩).2 | ||
end | ||
|
||
#check @Is_pushout.uniqueness | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This seems to be left over. |
||
|
||
lemma is_model_category.weq_of_weq_retract { W C F : morphism_class M } [ @has_pushouts M 𝓜] ( h : is_model_category W C F ) | ||
{a b a' b'} {f : a ⟶ b} {f' : a' ⟶ b'} (r : retract f f') (hf : W f) : W f' := begin | ||
rcases h.acf.fact f' with ⟨ c, α, β, WCα, Fβ, f'_fact ⟩, | ||
cases has_pushouts.pushout α r.ia with z γ δ po, | ||
have WCδ : (C ∩ W) δ := by { rw h.acf.llp, rw h.acf.llp at WCα, exact llp_pushout F po WCα }, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You can abbreviate the start of this proof to |
||
have uq := @Is_pushout.uniqueness M 𝓜 a' c a z α r.ia γ δ po, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This doesn't actually appear to be necessary: it worked fine if I replaced the single use of |
||
have rεβ : retract (po.induced (β ≫ r.ib) f (by { rw [← category.assoc, f'_fact], exact r.hi.symm})) β := { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would probably name this map There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah great - I was trying to do this with |
||
ia := γ, | ||
ra := po.induced (𝟙 c) (r.ra ≫ α) (by { rw [category.comp_id, ← category.assoc, r.ha, category.id_comp] }), | ||
ib := r.ib, | ||
rb := r.rb, | ||
ha := by simp, | ||
hb := r.hb, | ||
hi := by simp, | ||
hr := by { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As a style thing, we normally only use |
||
refine uq _ _, | ||
rw [← category.assoc, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's a good habit to use |
||
Is_pushout.induced_commutes₀ po _ _ _, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since |
||
← category.assoc, | ||
Is_pushout.induced_commutes₀ po _ _ _, | ||
category.assoc, | ||
category.id_comp, | ||
r.hb, | ||
category.comp_id], | ||
rw [← category.assoc, | ||
Is_pushout.induced_commutes₁ po _ _ _, | ||
← category.assoc, | ||
Is_pushout.induced_commutes₁ po _ _ _, | ||
category.assoc, | ||
f'_fact, | ||
r.hr], | ||
} | ||
}, | ||
rw ← f'_fact, | ||
apply h.weq.weq_comp a' c b' α β WCα.2, | ||
refine is_model_category.weq_of_weq_retract_fib h rεβ _ Fβ, | ||
apply h.weq.weq_cancel_left WCδ.2, | ||
rw Is_pushout.induced_commutes₁ po _ _ _, | ||
assumption, | ||
end | ||
|
||
omit 𝓜 | ||
class model_category (M : Type u) extends category.{v} M := | ||
(complete : has_limits M) | ||
(cocomplete : has_colimits M) | ||
(W C F : morphism_class M) | ||
(h : is_model_category W C F) | ||
|
||
variables {M} | ||
include 𝓜 | ||
|
||
/-- We can skip checking the condition C ∩ W ⊆ AC. Compare Hirschhorn, Theorem 11.3.1. -/ | ||
|
@@ -63,7 +124,7 @@ begin | |
have : retract g f, | ||
{ refine ⟨𝟙 a, 𝟙 a, l, h, _, _, _, _⟩, | ||
all_goals { tidy } }, | ||
exact acf.retract this g_ac | ||
exact acf.retract_left this g_ac | ||
end | ||
|
||
def model_category.mk' [has_limits M] [has_colimits M] {W C AF AC F : morphism_class M} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,6 +2,7 @@ import category_theory.morphism_class_closure | |
import category_theory.retract | ||
import category_theory.colimits | ||
import category_theory.transfinite.composition | ||
import category_theory.opposites | ||
import logic.crec | ||
|
||
universes v u | ||
|
@@ -30,14 +31,15 @@ structure is_wfs (L R : morphism_class M) : Prop := | |
(fact : ∀ {x y} (f : x ⟶ y), ∃ z (g : x ⟶ z) (h : z ⟶ y), | ||
L g ∧ R h ∧ g ≫ h = f) | ||
|
||
|
||
lemma is_wfs.lp {L R : morphism_class M} (w : is_wfs L R) | ||
{a b x y} {f : a ⟶ b} {g : x ⟶ y} (hf : L f) (hg : R g) : lp f g := | ||
begin | ||
rw w.llp at hf, | ||
exact hf hg | ||
end | ||
|
||
lemma is_wfs.retract {L R : morphism_class M} (w : is_wfs L R) | ||
lemma is_wfs.retract_left {L R : morphism_class M} (w : is_wfs L R) | ||
{a b a' b'} {f : a ⟶ b} {f' : a' ⟶ b'} (r : retract f f') (hf : L f) : L f' := | ||
begin | ||
rw w.llp, | ||
|
@@ -47,6 +49,18 @@ begin | |
refine ⟨r.ib ≫ l, _, _⟩, | ||
{ rw [←category.assoc, ←r.hi, category.assoc, hl₁, ←category.assoc, r.ha, category.id_comp] }, | ||
{ rw [category.assoc, hl₂, ←category.assoc, r.hb, category.id_comp] } | ||
end | ||
|
||
lemma is_wfs.retract_right {L R :morphism_class M } (w : is_wfs L R) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I ended up copying the proof of the previous lemma for this. I first tried to prove it by applying the previous lemma to the opposite category, but I quickly got bogged down. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes. It was probably made more difficult by the way that the opposite category was implemented at the time. We later found that it was very easy to get confused about whether we were considering objects and morphisms in a category or in its opposite. Nowadays we have a design in which you need to apply specific functions to convert between a category and its opposite, which helps keep things straight. Ideally we will some day have a method to automatically dualize theorems, but this doesn't exist yet. |
||
{a b a' b'} {f : a ⟶ b} {f' : a' ⟶ b'} (r : retract f f') (hf : R f) : R f' := | ||
begin | ||
rw w.rlp, | ||
intros x y g hg h k s, | ||
rcases w.lp hg hf (h ≫ r.ia) (k ≫ r.ib) | ||
(by rw [← category.assoc, ←s, category.assoc, category.assoc, r.hi]) with ⟨l, hl₁, hl₂⟩, | ||
refine ⟨l ≫ r.ra, _, _⟩, | ||
{ rw [←category.assoc, hl₁, category.assoc, r.ha, category.comp_id] }, | ||
{ rw [category.assoc, r.hr, ←category.assoc, hl₂, category.assoc, r.hb, category.comp_id] } | ||
end | ||
|
||
lemma llp_rlp_self (L : morphism_class M) : L ⊆ llp (rlp L) := | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It would be more natural to state this as a "theorem about model categories", rather than a "theorem about classes of maps that form a model category structure", and maybe in a separate file like
category_theory.model.lemmas
. Something like:Currently there aren't any examples of this here because I didn't actually prove any theorems about model categories! But there are a bunch in the lean-homotopy-theory project, e.g. in https://github.com/rwbarton/lean-homotopy-theory/tree/lean-3.4.2/src/homotopy_theory/formal/cofibrations.
There might be some rough edges in the way the
model_category
class is set up given that it's not currently used as a hypothesis anywhere.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So I have a question about this. Trying to rephrase this to use
model_category.{v} M
rather thanis_model_category W C F
(and omitting \MCM from the context) I end up withbut
h.W
andh.F
produce the following error:"invalid field notation, function 'category_theory.model_category.W' does not have explicit argument with type (category_theory.model_category ...)".
I don't understand this - if I
#check h.W
, it's a morphism class on M like I expect.