2015-09-13 18:58:11 +00:00
|
|
|
|
/-
|
|
|
|
|
Copyright (c) 2015 Ulrik Buchholtz. All rights reserved.
|
|
|
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
2016-02-26 22:00:28 +00:00
|
|
|
|
Authors: Ulrik Buchholtz, Floris van Doorn
|
2016-06-24 08:54:00 +00:00
|
|
|
|
|
|
|
|
|
Connectedness of types and functions
|
2015-09-13 18:58:11 +00:00
|
|
|
|
-/
|
2016-04-22 19:12:25 +00:00
|
|
|
|
import types.trunc types.arrow_2 types.lift
|
2015-09-13 18:58:11 +00:00
|
|
|
|
|
2016-06-24 08:54:00 +00:00
|
|
|
|
open eq is_trunc is_equiv nat equiv trunc function fiber funext pi pointed
|
2015-09-13 18:58:11 +00:00
|
|
|
|
|
2016-06-24 08:54:00 +00:00
|
|
|
|
definition is_conn [reducible] (n : ℕ₋₂) (A : Type) : Type :=
|
|
|
|
|
is_contr (trunc n A)
|
|
|
|
|
|
|
|
|
|
definition is_conn_fun [reducible] (n : ℕ₋₂) {A B : Type} (f : A → B) : Type :=
|
|
|
|
|
Πb : B, is_conn n (fiber f b)
|
2015-09-13 18:58:11 +00:00
|
|
|
|
|
2016-06-24 08:54:00 +00:00
|
|
|
|
definition is_conn_inf [reducible] (A : Type) : Type := Πn, is_conn n A
|
|
|
|
|
definition is_conn_fun_inf [reducible] {A B : Type} (f : A → B) : Type := Πn, is_conn_fun n f
|
|
|
|
|
|
|
|
|
|
namespace is_conn
|
2015-09-13 18:58:11 +00:00
|
|
|
|
|
2016-02-26 22:00:28 +00:00
|
|
|
|
definition is_conn_equiv_closed (n : ℕ₋₂) {A B : Type}
|
2015-11-05 19:37:46 +00:00
|
|
|
|
: A ≃ B → is_conn n A → is_conn n B :=
|
|
|
|
|
begin
|
|
|
|
|
intros H C,
|
|
|
|
|
fapply @is_contr_equiv_closed (trunc n A) _,
|
|
|
|
|
apply trunc_equiv_trunc,
|
|
|
|
|
assumption
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
theorem is_conn_of_le (A : Type) {n k : ℕ₋₂} (H : n ≤ k) [is_conn k A] : is_conn n A :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_contr_equiv_closed,
|
2016-03-28 16:46:17 +00:00
|
|
|
|
apply trunc_trunc_equiv_left _ H
|
2016-03-06 00:35:12 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-03-06 16:24:59 +00:00
|
|
|
|
theorem is_conn_fun_of_le {A B : Type} (f : A → B) {n k : ℕ₋₂} (H : n ≤ k)
|
|
|
|
|
[is_conn_fun k f] : is_conn_fun n f :=
|
2016-03-06 00:35:12 +00:00
|
|
|
|
λb, is_conn_of_le _ H
|
|
|
|
|
|
2016-06-24 08:54:00 +00:00
|
|
|
|
definition is_conn_of_is_conn_succ (n : ℕ₋₂) (A : Type) [is_conn (n.+1) A] : is_conn n A :=
|
|
|
|
|
is_trunc_trunc_of_le A -2 (trunc_index.self_le_succ n)
|
|
|
|
|
|
2016-03-06 16:24:59 +00:00
|
|
|
|
namespace is_conn_fun
|
2015-11-05 19:37:46 +00:00
|
|
|
|
section
|
2016-03-06 16:24:59 +00:00
|
|
|
|
parameters (n : ℕ₋₂) {A B : Type} {h : A → B}
|
|
|
|
|
(H : is_conn_fun n h) (P : B → Type) [Πb, is_trunc n (P b)]
|
2015-11-05 19:37:46 +00:00
|
|
|
|
|
2016-01-23 19:15:59 +00:00
|
|
|
|
private definition rec.helper : (Πa : A, P (h a)) → Πb : B, trunc n (fiber h b) → P b :=
|
2015-11-05 19:37:46 +00:00
|
|
|
|
λt b, trunc.rec (λx, point_eq x ▸ t (point x))
|
|
|
|
|
|
2016-01-23 19:15:59 +00:00
|
|
|
|
private definition rec.g : (Πa : A, P (h a)) → (Πb : B, P b) :=
|
|
|
|
|
λt b, rec.helper t b (@center (trunc n (fiber h b)) (H b))
|
2015-11-05 19:37:46 +00:00
|
|
|
|
|
|
|
|
|
-- induction principle for n-connected maps (Lemma 7.5.7)
|
2016-01-23 19:15:59 +00:00
|
|
|
|
protected definition rec : is_equiv (λs : Πb : B, P b, λa : A, s (h a)) :=
|
|
|
|
|
adjointify (λs a, s (h a)) rec.g
|
2015-11-05 19:37:46 +00:00
|
|
|
|
begin
|
2016-01-23 19:15:59 +00:00
|
|
|
|
intro t, apply eq_of_homotopy, intro a, unfold rec.g, unfold rec.helper,
|
2015-11-05 19:37:46 +00:00
|
|
|
|
rewrite [@center_eq _ (H (h a)) (tr (fiber.mk a idp))],
|
|
|
|
|
end
|
|
|
|
|
begin
|
2016-01-23 19:15:59 +00:00
|
|
|
|
intro k, apply eq_of_homotopy, intro b, unfold rec.g,
|
2015-11-05 19:37:46 +00:00
|
|
|
|
generalize (@center _ (H b)), apply trunc.rec, apply fiber.rec,
|
|
|
|
|
intros a p, induction p, reflexivity
|
|
|
|
|
end
|
|
|
|
|
|
2016-01-23 19:15:59 +00:00
|
|
|
|
protected definition elim : (Πa : A, P (h a)) → (Πb : B, P b) :=
|
2015-11-05 19:37:46 +00:00
|
|
|
|
@is_equiv.inv _ _ (λs a, s (h a)) rec
|
|
|
|
|
|
2016-01-23 19:15:59 +00:00
|
|
|
|
protected definition elim_β : Πf : (Πa : A, P (h a)), Πa : A, elim f (h a) = f a :=
|
2015-11-05 19:37:46 +00:00
|
|
|
|
λf, apd10 (@is_equiv.right_inv _ _ (λs a, s (h a)) rec f)
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
2016-01-23 19:15:59 +00:00
|
|
|
|
section
|
2016-03-06 16:24:59 +00:00
|
|
|
|
parameters (n k : ℕ₋₂) {A B : Type} {f : A → B}
|
|
|
|
|
(H : is_conn_fun n f) (P : B → Type) [HP : Πb, is_trunc (n +2+ k) (P b)]
|
2016-01-23 19:15:59 +00:00
|
|
|
|
|
2016-03-06 16:24:59 +00:00
|
|
|
|
include H HP
|
2016-01-23 19:15:59 +00:00
|
|
|
|
-- Lemma 8.6.1
|
2016-02-26 22:00:28 +00:00
|
|
|
|
proposition elim_general : is_trunc_fun k (pi_functor_left f P) :=
|
2016-01-23 19:15:59 +00:00
|
|
|
|
begin
|
2016-03-06 16:24:59 +00:00
|
|
|
|
revert P HP,
|
|
|
|
|
induction k with k IH: intro P HP t,
|
|
|
|
|
{ apply is_contr_fiber_of_is_equiv, apply is_conn_fun.rec, exact H, exact HP},
|
2016-01-23 19:15:59 +00:00
|
|
|
|
{ apply is_trunc_succ_intro,
|
|
|
|
|
intros x y, cases x with g p, cases y with h q,
|
2016-02-29 20:11:17 +00:00
|
|
|
|
have e : fiber (λr : g ~ h, (λa, r (f a))) (apd10 (p ⬝ q⁻¹))
|
2016-01-23 19:15:59 +00:00
|
|
|
|
≃ (fiber.mk g p = fiber.mk h q
|
|
|
|
|
:> fiber (λs : (Πb, P b), (λa, s (f a))) t),
|
2016-02-29 20:11:17 +00:00
|
|
|
|
begin
|
|
|
|
|
apply equiv.trans !fiber.sigma_char,
|
|
|
|
|
have e' : Πr : g ~ h,
|
2016-01-23 19:15:59 +00:00
|
|
|
|
((λa, r (f a)) = apd10 (p ⬝ q⁻¹))
|
|
|
|
|
≃ (ap (λv, (λa, v (f a))) (eq_of_homotopy r) ⬝ q = p),
|
2016-02-29 20:11:17 +00:00
|
|
|
|
begin
|
|
|
|
|
intro r,
|
2016-01-23 19:15:59 +00:00
|
|
|
|
refine equiv.trans _ (eq_con_inv_equiv_con_eq q p
|
|
|
|
|
(ap (λv a, v (f a)) (eq_of_homotopy r))),
|
|
|
|
|
rewrite [-(ap (λv a, v (f a)) (apd10_eq_of_homotopy r))],
|
|
|
|
|
rewrite [-(apd10_ap_precompose_dependent f (eq_of_homotopy r))],
|
|
|
|
|
apply equiv.symm,
|
2016-02-29 20:11:17 +00:00
|
|
|
|
apply eq_equiv_fn_eq (@apd10 A (λa, P (f a)) (λa, g (f a)) (λa, h (f a)))
|
|
|
|
|
end,
|
2016-02-15 21:05:31 +00:00
|
|
|
|
apply equiv.trans (sigma.sigma_equiv_sigma_right e'), clear e',
|
2016-01-23 19:15:59 +00:00
|
|
|
|
apply equiv.trans (equiv.symm (sigma.sigma_equiv_sigma_left
|
|
|
|
|
eq_equiv_homotopy)),
|
|
|
|
|
apply equiv.symm, apply equiv.trans !fiber_eq_equiv,
|
2016-02-15 21:05:31 +00:00
|
|
|
|
apply sigma.sigma_equiv_sigma_right, intro r,
|
2016-02-29 20:11:17 +00:00
|
|
|
|
apply eq_equiv_eq_symm
|
|
|
|
|
end,
|
2016-01-23 19:15:59 +00:00
|
|
|
|
apply @is_trunc_equiv_closed _ _ k e, clear e,
|
2017-06-02 16:13:20 +00:00
|
|
|
|
apply IH (λb : B, (g b = h b)) (λb, @is_trunc_eq (P b) (n +2+ k) (HP b) (g b) (h b)) }
|
2016-01-23 19:15:59 +00:00
|
|
|
|
end
|
2016-02-26 22:00:28 +00:00
|
|
|
|
|
2016-01-23 19:15:59 +00:00
|
|
|
|
end
|
|
|
|
|
|
2015-11-05 19:37:46 +00:00
|
|
|
|
section
|
|
|
|
|
universe variables u v
|
2016-03-06 16:24:59 +00:00
|
|
|
|
parameters (n : ℕ₋₂) {A : Type.{u}} {B : Type.{v}} {h : A → B}
|
2015-11-05 19:37:46 +00:00
|
|
|
|
parameter sec : ΠP : B → trunctype.{max u v} n,
|
|
|
|
|
is_retraction (λs : (Πb : B, P b), λ a, s (h a))
|
|
|
|
|
|
|
|
|
|
private definition s := sec (λb, trunctype.mk' n (trunc n (fiber h b)))
|
|
|
|
|
|
|
|
|
|
include sec
|
|
|
|
|
|
|
|
|
|
-- the other half of Lemma 7.5.7
|
2016-03-06 16:24:59 +00:00
|
|
|
|
definition intro : is_conn_fun n h :=
|
2015-11-05 19:37:46 +00:00
|
|
|
|
begin
|
|
|
|
|
intro b,
|
|
|
|
|
apply is_contr.mk (@is_retraction.sect _ _ _ s (λa, tr (fiber.mk a idp)) b),
|
2016-02-16 01:59:38 +00:00
|
|
|
|
esimp, apply trunc.rec, apply fiber.rec, intros a p,
|
2015-11-05 19:37:46 +00:00
|
|
|
|
apply transport
|
|
|
|
|
(λz : (Σy, h a = y), @sect _ _ _ s (λa, tr (mk a idp)) (sigma.pr1 z) =
|
|
|
|
|
tr (fiber.mk a (sigma.pr2 z)))
|
|
|
|
|
(@center_eq _ (is_contr_sigma_eq (h a)) (sigma.mk b p)),
|
|
|
|
|
exact apd10 (@right_inverse _ _ _ s (λa, tr (fiber.mk a idp))) a
|
|
|
|
|
end
|
|
|
|
|
end
|
2016-03-06 16:24:59 +00:00
|
|
|
|
end is_conn_fun
|
2015-11-05 19:37:46 +00:00
|
|
|
|
|
|
|
|
|
-- Connectedness is related to maps to and from the unit type, first to
|
|
|
|
|
section
|
2016-02-26 22:00:28 +00:00
|
|
|
|
parameters (n : ℕ₋₂) (A : Type)
|
2015-11-05 19:37:46 +00:00
|
|
|
|
|
|
|
|
|
definition is_conn_of_map_to_unit
|
2016-03-06 16:24:59 +00:00
|
|
|
|
: is_conn_fun n (const A unit.star) → is_conn n A :=
|
2015-11-05 19:37:46 +00:00
|
|
|
|
begin
|
2016-03-06 16:24:59 +00:00
|
|
|
|
intro H, unfold is_conn_fun at H,
|
2016-04-26 00:11:34 +00:00
|
|
|
|
exact is_conn_equiv_closed n (fiber.fiber_star_equiv A) _,
|
2015-11-05 19:37:46 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-06-23 22:38:35 +00:00
|
|
|
|
definition is_conn_fun_to_unit_of_is_conn [H : is_conn n A] :
|
|
|
|
|
is_conn_fun n (const A unit.star) :=
|
|
|
|
|
begin
|
|
|
|
|
intro u, induction u,
|
|
|
|
|
exact is_conn_equiv_closed n (fiber.fiber_star_equiv A)⁻¹ᵉ _,
|
|
|
|
|
end
|
|
|
|
|
|
2015-11-05 19:37:46 +00:00
|
|
|
|
-- now maps from unit
|
2016-03-06 16:24:59 +00:00
|
|
|
|
definition is_conn_of_map_from_unit (a₀ : A) (H : is_conn_fun n (const unit a₀))
|
2015-11-05 19:37:46 +00:00
|
|
|
|
: is_conn n .+1 A :=
|
|
|
|
|
is_contr.mk (tr a₀)
|
|
|
|
|
begin
|
|
|
|
|
apply trunc.rec, intro a,
|
|
|
|
|
exact trunc.elim (λz : fiber (const unit a₀) a, ap tr (point_eq z))
|
|
|
|
|
(@center _ (H a))
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-06 16:24:59 +00:00
|
|
|
|
definition is_conn_fun_from_unit (a₀ : A) [H : is_conn n .+1 A]
|
|
|
|
|
: is_conn_fun n (const unit a₀) :=
|
2015-11-05 19:37:46 +00:00
|
|
|
|
begin
|
|
|
|
|
intro a,
|
|
|
|
|
apply is_conn_equiv_closed n (equiv.symm (fiber_const_equiv A a₀ a)),
|
|
|
|
|
apply @is_contr_equiv_closed _ _ (tr_eq_tr_equiv n a₀ a),
|
|
|
|
|
end
|
|
|
|
|
|
2015-09-13 18:58:11 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-01-23 19:15:59 +00:00
|
|
|
|
-- as special case we get elimination principles for pointed connected types
|
|
|
|
|
namespace is_conn
|
2016-02-15 23:23:28 +00:00
|
|
|
|
open pointed unit
|
2016-01-23 19:15:59 +00:00
|
|
|
|
section
|
2016-03-06 16:24:59 +00:00
|
|
|
|
parameters (n : ℕ₋₂) {A : Type*}
|
|
|
|
|
[H : is_conn n .+1 A] (P : A → Type) [Πa, is_trunc n (P a)]
|
2016-01-23 19:15:59 +00:00
|
|
|
|
|
|
|
|
|
include H
|
|
|
|
|
protected definition rec : is_equiv (λs : Πa : A, P a, s (Point A)) :=
|
|
|
|
|
@is_equiv_compose
|
|
|
|
|
(Πa : A, P a) (unit → P (Point A)) (P (Point A))
|
2016-06-23 22:38:35 +00:00
|
|
|
|
(λf, f unit.star) (λs x, s (Point A))
|
2016-03-06 16:24:59 +00:00
|
|
|
|
(is_conn_fun.rec n (is_conn_fun_from_unit n A (Point A)) P)
|
2016-03-01 04:37:03 +00:00
|
|
|
|
(to_is_equiv (arrow_unit_left (P (Point A))))
|
2016-01-23 19:15:59 +00:00
|
|
|
|
|
|
|
|
|
protected definition elim : P (Point A) → (Πa : A, P a) :=
|
|
|
|
|
@is_equiv.inv _ _ (λs, s (Point A)) rec
|
|
|
|
|
|
|
|
|
|
protected definition elim_β (p : P (Point A)) : elim p (Point A) = p :=
|
|
|
|
|
@is_equiv.right_inv _ _ (λs, s (Point A)) rec p
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
section
|
2016-03-06 16:24:59 +00:00
|
|
|
|
parameters (n k : ℕ₋₂) {A : Type*}
|
|
|
|
|
[H : is_conn n .+1 A] (P : A → Type) [Πa, is_trunc (n +2+ k) (P a)]
|
2016-01-23 19:15:59 +00:00
|
|
|
|
|
|
|
|
|
include H
|
|
|
|
|
proposition elim_general (p : P (Point A))
|
|
|
|
|
: is_trunc k (fiber (λs : (Πa : A, P a), s (Point A)) p) :=
|
|
|
|
|
@is_trunc_equiv_closed
|
|
|
|
|
(fiber (λs x, s (Point A)) (λx, p))
|
|
|
|
|
(fiber (λs, s (Point A)) p)
|
|
|
|
|
k
|
2016-04-22 19:12:25 +00:00
|
|
|
|
(equiv.symm (fiber.equiv_postcompose _ (arrow_unit_left (P (Point A))) _))
|
2016-03-06 16:24:59 +00:00
|
|
|
|
(is_conn_fun.elim_general n k (is_conn_fun_from_unit n A (Point A)) P (λx, p))
|
2016-01-23 19:15:59 +00:00
|
|
|
|
end
|
|
|
|
|
end is_conn
|
|
|
|
|
|
2015-09-13 18:58:11 +00:00
|
|
|
|
-- Lemma 7.5.2
|
|
|
|
|
definition minus_one_conn_of_surjective {A B : Type} (f : A → B)
|
2016-03-06 16:24:59 +00:00
|
|
|
|
: is_surjective f → is_conn_fun -1 f :=
|
2015-09-13 18:58:11 +00:00
|
|
|
|
begin
|
|
|
|
|
intro H, intro b,
|
2016-02-15 20:55:29 +00:00
|
|
|
|
exact @is_contr_of_inhabited_prop (∥fiber f b∥) (is_trunc_trunc -1 (fiber f b)) (H b),
|
2015-09-13 18:58:11 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition is_surjection_of_minus_one_conn {A B : Type} (f : A → B)
|
2016-03-06 16:24:59 +00:00
|
|
|
|
: is_conn_fun -1 f → is_surjective f :=
|
2015-09-13 18:58:11 +00:00
|
|
|
|
begin
|
|
|
|
|
intro H, intro b,
|
|
|
|
|
exact @center (∥fiber f b∥) (H b),
|
|
|
|
|
end
|
|
|
|
|
|
2015-09-27 17:30:47 +00:00
|
|
|
|
definition merely_of_minus_one_conn {A : Type} : is_conn -1 A → ∥A∥ :=
|
2015-09-13 18:58:11 +00:00
|
|
|
|
λH, @center (∥A∥) H
|
|
|
|
|
|
|
|
|
|
definition minus_one_conn_of_merely {A : Type} : ∥A∥ → is_conn -1 A :=
|
2016-02-15 20:55:29 +00:00
|
|
|
|
@is_contr_of_inhabited_prop (∥A∥) (is_trunc_trunc -1 A)
|
2015-09-13 18:58:11 +00:00
|
|
|
|
|
2015-09-27 17:30:47 +00:00
|
|
|
|
section
|
|
|
|
|
open arrow
|
|
|
|
|
|
|
|
|
|
variables {f g : arrow}
|
|
|
|
|
|
|
|
|
|
-- Lemma 7.5.4
|
|
|
|
|
definition retract_of_conn_is_conn [instance] (r : arrow_hom f g) [H : is_retraction r]
|
2016-03-06 16:24:59 +00:00
|
|
|
|
(n : ℕ₋₂) [K : is_conn_fun n f] : is_conn_fun n g :=
|
2015-09-27 17:30:47 +00:00
|
|
|
|
begin
|
|
|
|
|
intro b, unfold is_conn,
|
|
|
|
|
apply is_contr_retract (trunc_functor n (retraction_on_fiber r b)),
|
|
|
|
|
exact K (on_cod (arrow.is_retraction.sect r) b)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Corollary 7.5.5
|
2016-02-26 22:00:28 +00:00
|
|
|
|
definition is_conn_homotopy (n : ℕ₋₂) {A B : Type} {f g : A → B}
|
2016-03-06 16:24:59 +00:00
|
|
|
|
(p : f ~ g) (H : is_conn_fun n f) : is_conn_fun n g :=
|
2016-03-28 16:46:17 +00:00
|
|
|
|
@retract_of_conn_is_conn _ _
|
|
|
|
|
(arrow.arrow_hom_of_homotopy p) (arrow.is_retraction_arrow_hom_of_homotopy p) n H
|
2015-09-27 17:30:47 +00:00
|
|
|
|
|
2015-11-05 19:37:46 +00:00
|
|
|
|
-- all types are -2-connected
|
2016-03-06 00:35:12 +00:00
|
|
|
|
definition is_conn_minus_two (A : Type) : is_conn -2 A :=
|
2016-03-28 16:46:17 +00:00
|
|
|
|
_
|
|
|
|
|
|
2016-04-22 19:12:25 +00:00
|
|
|
|
-- merely inhabited types are -1-connected
|
|
|
|
|
definition is_conn_minus_one (A : Type) (a : ∥ A ∥) : is_conn -1 A :=
|
|
|
|
|
is_contr.mk a (is_prop.elim _)
|
|
|
|
|
|
2017-07-20 14:01:40 +00:00
|
|
|
|
definition is_conn_minus_one_pointed [instance] (A : Type*) : is_conn -1 A :=
|
|
|
|
|
is_conn_minus_one A (tr pt)
|
|
|
|
|
|
2016-04-22 19:12:25 +00:00
|
|
|
|
definition is_conn_trunc [instance] (A : Type) (n k : ℕ₋₂) [H : is_conn n A]
|
|
|
|
|
: is_conn n (trunc k A) :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_trunc_equiv_closed, apply trunc_trunc_equiv_trunc_trunc
|
|
|
|
|
end
|
|
|
|
|
|
2016-06-24 08:54:00 +00:00
|
|
|
|
definition is_conn_eq [instance] (n : ℕ₋₂) {A : Type} (a a' : A) [is_conn (n.+1) A] :
|
|
|
|
|
is_conn n (a = a') :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_trunc_equiv_closed, apply tr_eq_tr_equiv,
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition is_conn_loop [instance] (n : ℕ₋₂) (A : Type*) [is_conn (n.+1) A] : is_conn n (Ω A) :=
|
|
|
|
|
!is_conn_eq
|
|
|
|
|
|
2016-04-22 19:12:25 +00:00
|
|
|
|
open pointed
|
|
|
|
|
definition is_conn_ptrunc [instance] (A : Type*) (n k : ℕ₋₂) [H : is_conn n A]
|
|
|
|
|
: is_conn n (ptrunc k A) :=
|
|
|
|
|
is_conn_trunc A n k
|
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
-- the following trivial cases are solved by type class inference
|
|
|
|
|
definition is_conn_of_is_contr (k : ℕ₋₂) (A : Type) [is_contr A] : is_conn k A := _
|
|
|
|
|
definition is_conn_fun_of_is_equiv (k : ℕ₋₂) {A B : Type} (f : A → B) [is_equiv f] :
|
|
|
|
|
is_conn_fun k f :=
|
|
|
|
|
_
|
2015-11-05 19:37:46 +00:00
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
-- Lemma 7.5.14
|
2016-03-28 16:46:17 +00:00
|
|
|
|
theorem is_equiv_trunc_functor_of_is_conn_fun [instance] {A B : Type} (n : ℕ₋₂) (f : A → B)
|
2016-03-06 16:24:59 +00:00
|
|
|
|
[H : is_conn_fun n f] : is_equiv (trunc_functor n f) :=
|
2016-03-06 00:35:12 +00:00
|
|
|
|
begin
|
|
|
|
|
fapply adjointify,
|
|
|
|
|
{ intro b, induction b with b, exact trunc_functor n point (center (trunc n (fiber f b)))},
|
|
|
|
|
{ intro b, induction b with b, esimp, generalize center (trunc n (fiber f b)), intro v,
|
|
|
|
|
induction v with v, induction v with a p, esimp, exact ap tr p},
|
|
|
|
|
{ intro a, induction a with a, esimp, rewrite [center_eq (tr (fiber.mk a idp))]}
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-06 16:24:59 +00:00
|
|
|
|
theorem trunc_equiv_trunc_of_is_conn_fun {A B : Type} (n : ℕ₋₂) (f : A → B)
|
|
|
|
|
[H : is_conn_fun n f] : trunc n A ≃ trunc n B :=
|
|
|
|
|
equiv.mk (trunc_functor n f) (is_equiv_trunc_functor_of_is_conn_fun n f)
|
2016-03-06 00:35:12 +00:00
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
definition is_conn_fun_trunc_functor_of_le {n k : ℕ₋₂} {A B : Type} (f : A → B) (H : k ≤ n)
|
2016-03-08 05:16:45 +00:00
|
|
|
|
[H2 : is_conn_fun k f] : is_conn_fun k (trunc_functor n f) :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_conn_fun.intro,
|
|
|
|
|
intro P, have Πb, is_trunc n (P b), from (λb, is_trunc_of_le _ H),
|
|
|
|
|
fconstructor,
|
|
|
|
|
{ intro f' b,
|
|
|
|
|
induction b with b,
|
|
|
|
|
refine is_conn_fun.elim k H2 _ _ b, intro a, exact f' (tr a)},
|
|
|
|
|
{ intro f', apply eq_of_homotopy, intro a,
|
|
|
|
|
induction a with a, esimp, rewrite [is_conn_fun.elim_β]}
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
definition is_conn_fun_trunc_functor_of_ge {n k : ℕ₋₂} {A B : Type} (f : A → B) (H : n ≤ k)
|
|
|
|
|
[H2 : is_conn_fun k f] : is_conn_fun k (trunc_functor n f) :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_conn_fun_of_is_equiv,
|
|
|
|
|
apply is_equiv_trunc_functor_of_le f H
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- Exercise 7.18
|
|
|
|
|
definition is_conn_fun_trunc_functor {n k : ℕ₋₂} {A B : Type} (f : A → B)
|
|
|
|
|
[H2 : is_conn_fun k f] : is_conn_fun k (trunc_functor n f) :=
|
|
|
|
|
begin
|
|
|
|
|
eapply algebra.le_by_cases k n: intro H,
|
|
|
|
|
{ exact is_conn_fun_trunc_functor_of_le f H},
|
|
|
|
|
{ exact is_conn_fun_trunc_functor_of_ge f H}
|
|
|
|
|
end
|
|
|
|
|
|
2016-04-22 19:12:25 +00:00
|
|
|
|
open lift
|
|
|
|
|
definition is_conn_fun_lift_functor (n : ℕ₋₂) {A B : Type} (f : A → B) [is_conn_fun n f] :
|
|
|
|
|
is_conn_fun n (lift_functor f) :=
|
|
|
|
|
begin
|
|
|
|
|
intro b, cases b with b, apply is_trunc_equiv_closed_rev,
|
|
|
|
|
{ apply trunc_equiv_trunc, apply fiber_lift_functor}
|
|
|
|
|
end
|
|
|
|
|
|
2016-06-24 08:54:00 +00:00
|
|
|
|
open trunc_index
|
|
|
|
|
definition is_conn_fun_inf.mk_nat {A B : Type} {f : A → B} (H : Π(n : ℕ), is_conn_fun n f)
|
|
|
|
|
: is_conn_fun_inf f :=
|
|
|
|
|
begin
|
|
|
|
|
intro n,
|
|
|
|
|
cases n with n, { exact _},
|
|
|
|
|
cases n with n, { have -1 ≤ of_nat 0, from dec_star, apply is_conn_fun_of_le f this},
|
|
|
|
|
rewrite -of_nat_add_two, exact _
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition is_conn_inf.mk_nat {A : Type} (H : Π(n : ℕ), is_conn n A) : is_conn_inf A :=
|
|
|
|
|
begin
|
|
|
|
|
intro n,
|
|
|
|
|
cases n with n, { exact _},
|
|
|
|
|
cases n with n, { have -1 ≤ of_nat 0, from dec_star, apply is_conn_of_le A this},
|
|
|
|
|
rewrite -of_nat_add_two, exact _
|
|
|
|
|
end
|
2017-06-02 16:13:20 +00:00
|
|
|
|
|
|
|
|
|
definition is_conn_equiv_closed_rev (n : ℕ₋₂) {A B : Type} (f : A ≃ B) (H : is_conn n B) :
|
|
|
|
|
is_conn n A :=
|
|
|
|
|
is_conn_equiv_closed n f⁻¹ᵉ _
|
|
|
|
|
|
|
|
|
|
definition is_conn_succ_intro {n : ℕ₋₂} {A : Type} (a : trunc (n.+1) A)
|
|
|
|
|
(H2 : Π(a a' : A), is_conn n (a = a')) : is_conn (n.+1) A :=
|
|
|
|
|
begin
|
|
|
|
|
apply @is_contr_of_inhabited_prop,
|
|
|
|
|
{ apply is_trunc_succ_intro,
|
|
|
|
|
refine trunc.rec _, intro a, refine trunc.rec _, intro a',
|
|
|
|
|
apply is_contr_equiv_closed !tr_eq_tr_equiv⁻¹ᵉ },
|
|
|
|
|
exact a
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition is_conn_pathover (n : ℕ₋₂) {A : Type} {B : A → Type} {a a' : A} (p : a = a') (b : B a)
|
|
|
|
|
(b' : B a') [is_conn (n.+1) (B a')] : is_conn n (b =[p] b') :=
|
|
|
|
|
is_conn_equiv_closed_rev n !pathover_equiv_tr_eq _
|
|
|
|
|
|
|
|
|
|
open sigma
|
|
|
|
|
lemma is_conn_sigma [instance] {A : Type} (B : A → Type) (n : ℕ₋₂)
|
|
|
|
|
[HA : is_conn n A] [HB : Πa, is_conn n (B a)] : is_conn n (Σa, B a) :=
|
|
|
|
|
begin
|
|
|
|
|
revert A B HA HB, induction n with n IH: intro A B HA HB,
|
|
|
|
|
{ apply is_conn_minus_two },
|
|
|
|
|
apply is_conn_succ_intro,
|
|
|
|
|
{ induction center (trunc (n.+1) A) with a, induction center (trunc (n.+1) (B a)) with b,
|
|
|
|
|
exact tr ⟨a, b⟩ },
|
|
|
|
|
intro a a', refine is_conn_equiv_closed_rev n !sigma_eq_equiv _,
|
|
|
|
|
apply IH, apply is_conn_eq, intro p, apply is_conn_pathover
|
|
|
|
|
/- an alternative proof of the successor case -/
|
|
|
|
|
-- induction center (trunc (n.+1) A) with a₀,
|
|
|
|
|
-- induction center (trunc (n.+1) (B a₀)) with b₀,
|
|
|
|
|
-- apply is_contr.mk (tr ⟨a₀, b₀⟩),
|
|
|
|
|
-- intro ab, induction ab with ab, induction ab with a b,
|
|
|
|
|
-- induction tr_eq_tr_equiv n a₀ a !is_prop.elim with p, induction p,
|
|
|
|
|
-- induction tr_eq_tr_equiv n b₀ b !is_prop.elim with q, induction q,
|
|
|
|
|
-- reflexivity
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
lemma is_conn_prod [instance] (A B : Type) (n : ℕ₋₂) [is_conn n A] [is_conn n B] :
|
|
|
|
|
is_conn n (A × B) :=
|
|
|
|
|
is_conn_equiv_closed n !sigma.equiv_prod _
|
|
|
|
|
|
|
|
|
|
lemma is_conn_fun_of_is_conn {A B : Type} (n : ℕ₋₂) (f : A → B)
|
|
|
|
|
[HA : is_conn n A] [HB : is_conn (n.+1) B] : is_conn_fun n f :=
|
|
|
|
|
λb, is_conn_equiv_closed_rev n !fiber.sigma_char _
|
|
|
|
|
|
|
|
|
|
lemma is_conn_pfiber {A B : Type*} (n : ℕ₋₂) (f : A →* B)
|
|
|
|
|
[HA : is_conn n A] [HB : is_conn (n.+1) B] : is_conn n (pfiber f) :=
|
|
|
|
|
is_conn_fun_of_is_conn n f pt
|
|
|
|
|
|
|
|
|
|
definition is_conn_fun_trunc_elim_of_le {n k : ℕ₋₂} {A B : Type} [is_trunc n B] (f : A → B)
|
|
|
|
|
(H : k ≤ n) [H2 : is_conn_fun k f] : is_conn_fun k (trunc.elim f : trunc n A → B) :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_conn_fun.intro,
|
|
|
|
|
intro P, have Πb, is_trunc n (P b), from (λb, is_trunc_of_le _ H),
|
|
|
|
|
fconstructor,
|
|
|
|
|
{ intro f' b,
|
|
|
|
|
refine is_conn_fun.elim k H2 _ _ b, intro a, exact f' (tr a) },
|
|
|
|
|
{ intro f', apply eq_of_homotopy, intro a,
|
|
|
|
|
induction a with a, esimp, rewrite [is_conn_fun.elim_β] }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition is_conn_fun_trunc_elim_of_ge {n k : ℕ₋₂} {A B : Type} [is_trunc n B] (f : A → B)
|
|
|
|
|
(H : n ≤ k) [H2 : is_conn_fun k f] : is_conn_fun k (trunc.elim f : trunc n A → B) :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_conn_fun_of_is_equiv,
|
|
|
|
|
have H3 : is_equiv (trunc_functor k f), from !is_equiv_trunc_functor_of_is_conn_fun,
|
|
|
|
|
have H4 : is_equiv (trunc_functor n f), from is_equiv_trunc_functor_of_le _ H,
|
|
|
|
|
apply is_equiv_of_equiv_of_homotopy (equiv.mk (trunc_functor n f) _ ⬝e !trunc_equiv),
|
|
|
|
|
intro x, induction x, reflexivity
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition is_conn_fun_trunc_elim {n k : ℕ₋₂} {A B : Type} [is_trunc n B] (f : A → B)
|
|
|
|
|
[H2 : is_conn_fun k f] : is_conn_fun k (trunc.elim f : trunc n A → B) :=
|
|
|
|
|
begin
|
|
|
|
|
eapply algebra.le_by_cases k n: intro H,
|
|
|
|
|
{ exact is_conn_fun_trunc_elim_of_le f H },
|
|
|
|
|
{ exact is_conn_fun_trunc_elim_of_ge f H }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
lemma is_conn_fun_tr (n : ℕ₋₂) (A : Type) : is_conn_fun n (tr : A → trunc n A) :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_conn_fun.intro,
|
|
|
|
|
intro P,
|
|
|
|
|
fconstructor,
|
|
|
|
|
{ intro f' b, induction b with a, exact f' a },
|
|
|
|
|
{ intro f', reflexivity }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition is_contr_of_is_conn_of_is_trunc {n : ℕ₋₂} {A : Type} (H : is_trunc n A)
|
|
|
|
|
(K : is_conn n A) : is_contr A :=
|
|
|
|
|
is_contr_equiv_closed (trunc_equiv n A)
|
2018-08-19 11:51:12 +00:00
|
|
|
|
|
|
|
|
|
definition is_trunc_succ_succ_of_is_trunc_loop (n : ℕ₋₂) (A : Type*) (H : is_trunc (n.+1) (Ω A))
|
|
|
|
|
(H2 : is_conn 0 A) : is_trunc (n.+2) A :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_trunc_succ_of_is_trunc_loop, apply minus_one_le_succ,
|
|
|
|
|
refine is_conn.elim -1 _ _, exact H
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
lemma is_trunc_of_is_trunc_loopn (m n : ℕ) (A : Type*) (H : is_trunc n (Ω[m] A))
|
|
|
|
|
(H2 : is_conn (m.-1) A) : is_trunc (m + n) A :=
|
|
|
|
|
begin
|
|
|
|
|
revert A H H2; induction m with m IH: intro A H H2,
|
|
|
|
|
{ rewrite [nat.zero_add], exact H },
|
|
|
|
|
rewrite [succ_add],
|
|
|
|
|
apply is_trunc_succ_succ_of_is_trunc_loop,
|
|
|
|
|
{ apply IH,
|
|
|
|
|
{ apply is_trunc_equiv_closed _ !loopn_succ_in },
|
|
|
|
|
apply is_conn_loop },
|
|
|
|
|
exact is_conn_of_le _ (zero_le_of_nat m)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
lemma is_trunc_of_is_set_loopn (m : ℕ) (A : Type*) (H : is_set (Ω[m] A))
|
|
|
|
|
(H2 : is_conn (m.-1) A) : is_trunc m A :=
|
|
|
|
|
is_trunc_of_is_trunc_loopn m 0 A H H2
|
2016-06-24 08:54:00 +00:00
|
|
|
|
|
2016-02-08 11:07:53 +00:00
|
|
|
|
end is_conn
|
2016-11-23 22:59:13 +00:00
|
|
|
|
|
|
|
|
|
/-
|
|
|
|
|
(bundled) connected types, possibly also truncated or with a point
|
|
|
|
|
The notation is n-Type*[k] for k-connected n-truncated pointed types, and you can remove
|
|
|
|
|
`n-`, `[k]` or `*` in any combination to remove some conditions
|
|
|
|
|
-/
|
|
|
|
|
|
|
|
|
|
structure conntype (n : ℕ₋₂) : Type :=
|
|
|
|
|
(carrier : Type)
|
|
|
|
|
(struct : is_conn n carrier)
|
|
|
|
|
|
|
|
|
|
notation `Type[`:95 n:0 `]`:0 := conntype n
|
|
|
|
|
|
|
|
|
|
attribute conntype.carrier [coercion]
|
|
|
|
|
attribute conntype.struct [instance] [priority 1300]
|
|
|
|
|
|
|
|
|
|
section
|
|
|
|
|
universe variable u
|
|
|
|
|
structure pconntype (n : ℕ₋₂) extends conntype.{u} n, pType.{u}
|
|
|
|
|
|
|
|
|
|
notation `Type*[`:95 n:0 `]`:0 := pconntype n
|
|
|
|
|
|
|
|
|
|
/-
|
|
|
|
|
There are multiple coercions from pconntype to Type. Type class inference doesn't recognize
|
|
|
|
|
that all of them are definitionally equal (for performance reasons). One instance is
|
|
|
|
|
automatically generated, and we manually add the missing instances.
|
|
|
|
|
-/
|
|
|
|
|
|
|
|
|
|
definition is_conn_pconntype [instance] {n : ℕ₋₂} (X : Type*[n]) : is_conn n X :=
|
|
|
|
|
conntype.struct X
|
|
|
|
|
|
|
|
|
|
structure truncconntype (n k : ℕ₋₂) extends trunctype.{u} n,
|
|
|
|
|
conntype.{u} k renaming struct→conn_struct
|
|
|
|
|
|
|
|
|
|
notation n `-Type[`:95 k:0 `]`:0 := truncconntype n k
|
|
|
|
|
|
|
|
|
|
definition is_conn_truncconntype [instance] {n k : ℕ₋₂} (X : n-Type[k]) :
|
|
|
|
|
is_conn k (truncconntype._trans_of_to_trunctype X) :=
|
|
|
|
|
conntype.struct X
|
|
|
|
|
|
|
|
|
|
definition is_trunc_truncconntype [instance] {n k : ℕ₋₂} (X : n-Type[k]) : is_trunc n X :=
|
|
|
|
|
trunctype.struct X
|
|
|
|
|
|
|
|
|
|
structure ptruncconntype (n k : ℕ₋₂) extends ptrunctype.{u} n,
|
|
|
|
|
pconntype.{u} k renaming struct→conn_struct
|
|
|
|
|
|
|
|
|
|
notation n `-Type*[`:95 k:0 `]`:0 := ptruncconntype n k
|
|
|
|
|
|
|
|
|
|
attribute ptruncconntype._trans_of_to_pconntype ptruncconntype._trans_of_to_ptrunctype
|
|
|
|
|
ptruncconntype._trans_of_to_pconntype_1 ptruncconntype._trans_of_to_ptrunctype_1
|
|
|
|
|
ptruncconntype._trans_of_to_pconntype_2 ptruncconntype._trans_of_to_ptrunctype_2
|
|
|
|
|
ptruncconntype.to_pconntype ptruncconntype.to_ptrunctype
|
|
|
|
|
truncconntype._trans_of_to_conntype truncconntype._trans_of_to_trunctype
|
|
|
|
|
truncconntype.to_conntype truncconntype.to_trunctype [unfold 3]
|
|
|
|
|
attribute pconntype._trans_of_to_conntype pconntype._trans_of_to_pType
|
|
|
|
|
pconntype.to_pType pconntype.to_conntype [unfold 2]
|
|
|
|
|
|
|
|
|
|
definition is_conn_ptruncconntype [instance] {n k : ℕ₋₂} (X : n-Type*[k]) :
|
|
|
|
|
is_conn k (ptruncconntype._trans_of_to_ptrunctype X) :=
|
|
|
|
|
conntype.struct X
|
|
|
|
|
|
|
|
|
|
definition is_trunc_ptruncconntype [instance] {n k : ℕ₋₂} (X : n-Type*[k]) :
|
|
|
|
|
is_trunc n (ptruncconntype._trans_of_to_pconntype X) :=
|
|
|
|
|
trunctype.struct X
|
|
|
|
|
|
|
|
|
|
definition ptruncconntype_eq {n k : ℕ₋₂} {X Y : n-Type*[k]} (p : X ≃* Y) : X = Y :=
|
|
|
|
|
begin
|
|
|
|
|
induction X with X Xt Xp Xc, induction Y with Y Yt Yp Yc,
|
|
|
|
|
note q := pType_eq_elim (eq_of_pequiv p),
|
|
|
|
|
cases q with r s, esimp at *, induction r,
|
|
|
|
|
exact ap0111 (ptruncconntype.mk X) !is_prop.elim (eq_of_pathover_idp s) !is_prop.elim
|
|
|
|
|
end
|
|
|
|
|
end
|