163 lines
6.4 KiB
Text
163 lines
6.4 KiB
Text
|
/-
|
|||
|
Copyright (c) 2015 Floris van Doorn. All rights reserved.
|
|||
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|||
|
Authors: Floris van Doorn, Egbert Rijke
|
|||
|
-/
|
|||
|
|
|||
|
import .seq_colim types.unit
|
|||
|
|
|||
|
open eq nat is_equiv equiv is_trunc pi unit function prod unit sigma sigma.ops sum prod trunc fin
|
|||
|
algebra
|
|||
|
|
|||
|
namespace seq_colim
|
|||
|
|
|||
|
universe variable u
|
|||
|
variables {A : ℕ → Type.{u}} (f : seq_diagram A)
|
|||
|
variables {n : ℕ} (a : A n)
|
|||
|
|
|||
|
definition arrow_colim_of_colim_arrow [unfold 4] {X : Type}
|
|||
|
(g : seq_colim (seq_diagram_arrow_left f X)) (x : X) : seq_colim f :=
|
|||
|
begin induction g with n g n g, exact ι f (g x), exact glue f (g x) end
|
|||
|
|
|||
|
definition omega_compact [class] (X : Type) : Type :=
|
|||
|
Π⦃A : ℕ → Type⦄ (f : seq_diagram A),
|
|||
|
is_equiv (arrow_colim_of_colim_arrow f :
|
|||
|
seq_colim (seq_diagram_arrow_left f X) → (X → seq_colim f))
|
|||
|
|
|||
|
definition equiv_of_omega_compact [unfold 4] (X : Type) [H : omega_compact X]
|
|||
|
{A : ℕ → Type} (f : seq_diagram A) :
|
|||
|
seq_colim (seq_diagram_arrow_left f X) ≃ (X → seq_colim f) :=
|
|||
|
equiv.mk _ (H f)
|
|||
|
|
|||
|
definition omega_compact_of_equiv [unfold 4] (X : Type)
|
|||
|
(H : Π⦃A : ℕ → Type⦄ (f : seq_diagram A),
|
|||
|
seq_colim (seq_diagram_arrow_left f X) ≃ (X → seq_colim f))
|
|||
|
(p : Π⦃A : ℕ → Type⦄ (f : seq_diagram A) {n : ℕ} (g : X → A n) (x : X),
|
|||
|
H f (ι _ g) x = ι _ (g x))
|
|||
|
(q : Π⦃A : ℕ → Type⦄ (f : seq_diagram A) {n : ℕ} (g : X → A n) (x : X),
|
|||
|
square (p f (@f n ∘ g) x) (p f g x) (ap (λg, H f g x)
|
|||
|
(glue (seq_diagram_arrow_left f X) g)) (glue f (g x)))
|
|||
|
: omega_compact X :=
|
|||
|
λA f, is_equiv_of_equiv_of_homotopy (H f)
|
|||
|
begin
|
|||
|
intro g, apply eq_of_homotopy, intro x,
|
|||
|
induction g with n g n g,
|
|||
|
{ exact p f g x },
|
|||
|
{ apply eq_pathover, refine _ ⬝hp !elim_glue⁻¹, exact q f g x }
|
|||
|
end
|
|||
|
|
|||
|
local attribute is_contr_seq_colim [instance]
|
|||
|
definition is_contr_empty_arrow [instance] (X : Type) : is_contr (empty → X) :=
|
|||
|
by apply is_trunc_pi; contradiction
|
|||
|
|
|||
|
definition omega_compact_empty [instance] [constructor] : omega_compact empty :=
|
|||
|
begin
|
|||
|
intro A f,
|
|||
|
fapply adjointify,
|
|||
|
{ intro g, exact ι' _ 0 empty.elim},
|
|||
|
{ intro g, apply eq_of_homotopy, contradiction},
|
|||
|
{ intro h, apply is_prop.elim}
|
|||
|
end
|
|||
|
|
|||
|
definition omega_compact_unit' [instance] [constructor] : omega_compact unit :=
|
|||
|
begin
|
|||
|
intro A f,
|
|||
|
fapply adjointify,
|
|||
|
{ intro g, induction g ⋆,
|
|||
|
{ exact ι _ (λx, a)},
|
|||
|
{ apply glue}},
|
|||
|
{ intro g, apply eq_of_homotopy, intro u, induction u,
|
|||
|
induction g ⋆,
|
|||
|
{ reflexivity},
|
|||
|
{ esimp, apply eq_pathover_id_right, apply hdeg_square,
|
|||
|
refine ap_compose (λx, arrow_colim_of_colim_arrow f x ⋆) _ _ ⬝ _,
|
|||
|
refine ap02 _ !elim_glue ⬝ _, apply elim_glue}},
|
|||
|
{ intro h, induction h with n h n h,
|
|||
|
{ esimp, apply ap (ι' _ n), apply unit_arrow_eq},
|
|||
|
{ esimp, apply eq_pathover_id_right,
|
|||
|
refine ap_compose' (seq_colim.elim _ _ _) _ _ ⬝ph _,
|
|||
|
refine ap02 _ !elim_glue ⬝ph _,
|
|||
|
refine !elim_glue ⬝ph _,
|
|||
|
refine _ ⬝pv natural_square_tr (@glue _ (seq_diagram_arrow_left f unit) n) (unit_arrow_eq h),
|
|||
|
refine _ ⬝ (ap_compose (ι' _ _) _ _)⁻¹,
|
|||
|
apply ap02, unfold [seq_diagram_arrow_left],
|
|||
|
apply unit_arrow_eq_compose}}
|
|||
|
end
|
|||
|
|
|||
|
-- The following is a start of a different proof that unit is omega-compact,
|
|||
|
-- which proves first that the types are equivalent
|
|||
|
definition omega_compact_unit [instance] [constructor] : omega_compact unit :=
|
|||
|
begin
|
|||
|
fapply omega_compact_of_equiv,
|
|||
|
{ intro A f, refine _ ⬝e !arrow_unit_left⁻¹ᵉ, fapply seq_colim_equiv,
|
|||
|
{ intro n, apply arrow_unit_left },
|
|||
|
intro n f, reflexivity },
|
|||
|
{ intros, induction x, reflexivity },
|
|||
|
{ intros, induction x, esimp, apply hdeg_square, exact !elim_glue ⬝ !idp_con },
|
|||
|
end
|
|||
|
|
|||
|
local attribute equiv_of_omega_compact [constructor]
|
|||
|
definition omega_compact_prod [instance] [constructor] {X Y : Type} [omega_compact.{_ u} X]
|
|||
|
[omega_compact.{u u} Y] : omega_compact.{_ u} (X × Y) :=
|
|||
|
begin
|
|||
|
fapply omega_compact_of_equiv,
|
|||
|
{ intro A f,
|
|||
|
exact calc
|
|||
|
seq_colim (seq_diagram_arrow_left f (X × Y))
|
|||
|
≃ seq_colim (seq_diagram_arrow_left (seq_diagram_arrow_left f Y) X) :
|
|||
|
begin
|
|||
|
apply seq_colim_equiv (λn, !imp_imp_equiv_prod_imp⁻¹ᵉ),
|
|||
|
intro n f, reflexivity
|
|||
|
end
|
|||
|
... ≃ (X → seq_colim (seq_diagram_arrow_left f Y)) : !equiv_of_omega_compact
|
|||
|
... ≃ (X → Y → seq_colim f) : arrow_equiv_arrow_right _ !equiv_of_omega_compact
|
|||
|
... ≃ (X × Y → seq_colim f) : imp_imp_equiv_prod_imp },
|
|||
|
{ intros, induction x with x y, reflexivity },
|
|||
|
{ intros, induction x with x y, apply hdeg_square,
|
|||
|
refine ap_compose (λz, arrow_colim_of_colim_arrow f z y) _ _ ⬝ _,
|
|||
|
refine ap02 _ (ap_compose (λz, arrow_colim_of_colim_arrow _ z x) _ _) ⬝ _,
|
|||
|
refine ap02 _ (ap02 _ !elim_glue) ⬝ _, refine ap02 _ (ap02 _ !idp_con) ⬝ _, esimp,
|
|||
|
refine ap02 _ !elim_glue ⬝ _, apply elim_glue }
|
|||
|
end
|
|||
|
|
|||
|
definition not_omega_compact_nat : ¬(omega_compact.{0 0} ℕ) :=
|
|||
|
assume H,
|
|||
|
let e := equiv_of_omega_compact ℕ seq_diagram_fin ⬝e
|
|||
|
arrow_equiv_arrow_right _ seq_colim_fin_equiv in
|
|||
|
begin
|
|||
|
-- check_expr e,
|
|||
|
have Πx, ∥ Σn, Πm, e x m < n ∥,
|
|||
|
begin
|
|||
|
intro f, induction f using seq_colim.rec_prop with n f,
|
|||
|
refine tr ⟨n, _⟩, intro m, exact is_lt (f m)
|
|||
|
end,
|
|||
|
induction this (e⁻¹ᵉ id) with x, induction x with n H2,
|
|||
|
apply lt.irrefl n,
|
|||
|
refine lt_of_le_of_lt (le_of_eq _) (H2 n),
|
|||
|
exact ap10 (right_inv e id)⁻¹ n
|
|||
|
end
|
|||
|
|
|||
|
exit
|
|||
|
print seq_diagram_over
|
|||
|
definition seq_colim_over_equiv {X : Type} {A : X → ℕ → Type} (g : Π⦃x n⦄, A x n → A x (succ n))
|
|||
|
(x : X)
|
|||
|
: @seq_colim_over _ (constant_seq X) _ _ ≃ seq_colim (@g x) :=
|
|||
|
begin
|
|||
|
|
|||
|
end
|
|||
|
|
|||
|
definition seq_colim_pi_equiv {X : Type} {A : X → ℕ → Type} (g : Π⦃x n⦄, A x n → A x (succ n))
|
|||
|
[omega_compact X] : (Πx, seq_colim (@g x)) ≃ seq_colim (seq_diagram_pi g) :=
|
|||
|
-- calc
|
|||
|
-- (Πx, seq_colim (@g x)) ≃ Πx, seq_colim (@g x)
|
|||
|
begin
|
|||
|
refine !pi_equiv_arrow_sigma ⬝e _,
|
|||
|
refine sigma_equiv_sigma_left (arrow_equiv_arrow_right X (sigma_equiv_sigma_left (seq_colim_constant_seq X)⁻¹ᵉ)) ⬝e _,
|
|||
|
exact sigma_equiv_sigma_left (arrow_equiv_arrow_right X _) ⬝e _,
|
|||
|
end
|
|||
|
|
|||
|
set_option pp.universes true
|
|||
|
print seq_diagram_arrow_left
|
|||
|
|
|||
|
end seq_colim
|