2015-02-21 00:30:32 +00:00
|
|
|
|
/-
|
|
|
|
|
Copyright (c) 2015 Jakob von Raumer. All rights reserved.
|
|
|
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
2015-04-29 00:48:39 +00:00
|
|
|
|
Authors: Floris van Doorn
|
2015-02-21 00:30:32 +00:00
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
Properties of trunc_index, is_trunc, trunctype, trunc, and the pointed versions of these
|
2015-02-21 00:30:32 +00:00
|
|
|
|
-/
|
|
|
|
|
|
2016-02-15 20:55:29 +00:00
|
|
|
|
-- NOTE: the fact that (is_trunc n A) is a mere proposition is proved in .prop_trunc
|
2015-04-29 00:48:39 +00:00
|
|
|
|
|
2016-03-28 20:33:33 +00:00
|
|
|
|
import .pointed ..function algebra.order types.nat.order
|
2015-04-29 00:48:39 +00:00
|
|
|
|
|
2016-02-15 19:40:25 +00:00
|
|
|
|
open eq sigma sigma.ops pi function equiv trunctype
|
2016-03-28 16:46:17 +00:00
|
|
|
|
is_equiv prod pointed nat is_trunc algebra sum
|
2015-02-21 00:30:32 +00:00
|
|
|
|
|
2016-03-08 05:16:45 +00:00
|
|
|
|
/- basic computation with ℕ₋₂, its operations and its order -/
|
2016-03-02 22:19:44 +00:00
|
|
|
|
namespace trunc_index
|
|
|
|
|
|
2016-03-02 23:36:46 +00:00
|
|
|
|
definition minus_one_le_succ (n : ℕ₋₂) : -1 ≤ n.+1 :=
|
2016-03-02 22:19:44 +00:00
|
|
|
|
succ_le_succ (minus_two_le n)
|
|
|
|
|
|
|
|
|
|
definition zero_le_of_nat (n : ℕ) : 0 ≤ of_nat n :=
|
|
|
|
|
succ_le_succ !minus_one_le_succ
|
|
|
|
|
|
|
|
|
|
open decidable
|
|
|
|
|
protected definition has_decidable_eq [instance] : Π(n m : ℕ₋₂), decidable (n = m)
|
|
|
|
|
| has_decidable_eq -2 -2 := inl rfl
|
|
|
|
|
| has_decidable_eq (n.+1) -2 := inr (by contradiction)
|
|
|
|
|
| has_decidable_eq -2 (m.+1) := inr (by contradiction)
|
|
|
|
|
| has_decidable_eq (n.+1) (m.+1) :=
|
|
|
|
|
match has_decidable_eq n m with
|
|
|
|
|
| inl xeqy := inl (by rewrite xeqy)
|
|
|
|
|
| inr xney := inr (λ h : succ n = succ m, by injection h with xeqy; exact absurd xeqy xney)
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-02 23:36:46 +00:00
|
|
|
|
definition not_succ_le_minus_two {n : ℕ₋₂} (H : n .+1 ≤ -2) : empty :=
|
2016-03-02 22:19:44 +00:00
|
|
|
|
by cases H
|
|
|
|
|
|
|
|
|
|
protected definition le_trans {n m k : ℕ₋₂} (H1 : n ≤ m) (H2 : m ≤ k) : n ≤ k :=
|
|
|
|
|
begin
|
|
|
|
|
induction H2 with k H2 IH,
|
|
|
|
|
{ exact H1},
|
|
|
|
|
{ exact le.step IH}
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-02 23:36:46 +00:00
|
|
|
|
definition le_of_succ_le_succ {n m : ℕ₋₂} (H : n.+1 ≤ m.+1) : n ≤ m :=
|
2016-03-02 22:19:44 +00:00
|
|
|
|
begin
|
|
|
|
|
cases H with m H',
|
|
|
|
|
{ apply le.tr_refl},
|
|
|
|
|
{ exact trunc_index.le_trans (le.step !le.tr_refl) H'}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
theorem not_succ_le_self {n : ℕ₋₂} : ¬n.+1 ≤ n :=
|
|
|
|
|
begin
|
|
|
|
|
induction n with n IH: intro H,
|
|
|
|
|
{ exact not_succ_le_minus_two H},
|
|
|
|
|
{ exact IH (le_of_succ_le_succ H)}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
protected definition le_antisymm {n m : ℕ₋₂} (H1 : n ≤ m) (H2 : m ≤ n) : n = m :=
|
|
|
|
|
begin
|
|
|
|
|
induction H2 with n H2 IH,
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ exfalso, apply @not_succ_le_self n, exact trunc_index.le_trans H1 H2}
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
protected definition le_succ {n m : ℕ₋₂} (H1 : n ≤ m) : n ≤ m.+1 :=
|
2016-03-02 22:19:44 +00:00
|
|
|
|
le.step H1
|
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
protected definition self_le_succ (n : ℕ₋₂) : n ≤ n.+1 :=
|
|
|
|
|
le.step (trunc_index.le.tr_refl n)
|
|
|
|
|
|
|
|
|
|
-- the order is total
|
|
|
|
|
protected theorem le_sum_le (n m : ℕ₋₂) : n ≤ m ⊎ m ≤ n :=
|
|
|
|
|
begin
|
|
|
|
|
induction m with m IH,
|
|
|
|
|
{ exact inr !minus_two_le},
|
|
|
|
|
{ cases IH with H H,
|
|
|
|
|
{ exact inl (trunc_index.le_succ H)},
|
|
|
|
|
{ cases H with n' H,
|
|
|
|
|
{ exact inl !trunc_index.self_le_succ},
|
|
|
|
|
{ exact inr (succ_le_succ H)}}}
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-02 22:19:44 +00:00
|
|
|
|
end trunc_index open trunc_index
|
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
definition linear_weak_order_trunc_index [trans_instance] [reducible] :
|
|
|
|
|
linear_weak_order trunc_index :=
|
|
|
|
|
linear_weak_order.mk le trunc_index.le.tr_refl @trunc_index.le_trans @trunc_index.le_antisymm
|
|
|
|
|
trunc_index.le_sum_le
|
2016-03-02 22:19:44 +00:00
|
|
|
|
|
|
|
|
|
namespace trunc_index
|
|
|
|
|
|
|
|
|
|
/- more theorems about truncation indices -/
|
|
|
|
|
|
|
|
|
|
definition zero_add (n : ℕ₋₂) : (0 : ℕ₋₂) + n = n :=
|
|
|
|
|
begin
|
|
|
|
|
cases n with n, reflexivity,
|
|
|
|
|
cases n with n, reflexivity,
|
|
|
|
|
induction n with n IH, reflexivity, exact ap succ IH
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition add_zero (n : ℕ₋₂) : n + (0 : ℕ₋₂) = n :=
|
|
|
|
|
by reflexivity
|
|
|
|
|
|
|
|
|
|
definition succ_add_nat (n : ℕ₋₂) (m : ℕ) : n.+1 + m = (n + m).+1 :=
|
|
|
|
|
by induction m with m IH; reflexivity; exact ap succ IH
|
|
|
|
|
|
|
|
|
|
definition nat_add_succ (n : ℕ) (m : ℕ₋₂) : n + m.+1 = (n + m).+1 :=
|
|
|
|
|
begin
|
|
|
|
|
cases m with m, reflexivity,
|
|
|
|
|
cases m with m, reflexivity,
|
|
|
|
|
induction m with m IH, reflexivity, exact ap succ IH
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition add_nat_succ (n : ℕ₋₂) (m : ℕ) : n + (nat.succ m) = (n + m).+1 :=
|
|
|
|
|
by reflexivity
|
|
|
|
|
|
|
|
|
|
definition nat_succ_add (n : ℕ) (m : ℕ₋₂) : (nat.succ n) + m = (n + m).+1 :=
|
|
|
|
|
begin
|
|
|
|
|
cases m with m, reflexivity,
|
|
|
|
|
cases m with m, reflexivity,
|
|
|
|
|
induction m with m IH, reflexivity, exact ap succ IH
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition sub_two_add_two (n : ℕ₋₂) : sub_two (add_two n) = n :=
|
|
|
|
|
begin
|
|
|
|
|
induction n with n IH,
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ exact ap succ IH}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition add_two_sub_two (n : ℕ) : add_two (sub_two n) = n :=
|
|
|
|
|
begin
|
|
|
|
|
induction n with n IH,
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ exact ap nat.succ IH}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition of_nat_add_plus_two_of_nat (n m : ℕ) : n +2+ m = of_nat (n + m + 2) :=
|
|
|
|
|
begin
|
|
|
|
|
induction m with m IH,
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ exact ap succ IH}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition of_nat_add_of_nat (n m : ℕ) : of_nat n + of_nat m = of_nat (n + m) :=
|
|
|
|
|
begin
|
|
|
|
|
induction m with m IH,
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ exact ap succ IH}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition succ_add_plus_two (n m : ℕ₋₂) : n.+1 +2+ m = (n +2+ m).+1 :=
|
|
|
|
|
begin
|
|
|
|
|
induction m with m IH,
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ exact ap succ IH}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition add_plus_two_succ (n m : ℕ₋₂) : n +2+ m.+1 = (n +2+ m).+1 :=
|
|
|
|
|
idp
|
|
|
|
|
|
|
|
|
|
definition add_succ_succ (n m : ℕ₋₂) : n + m.+2 = n +2+ m :=
|
|
|
|
|
idp
|
|
|
|
|
|
|
|
|
|
definition succ_add_succ (n m : ℕ₋₂) : n.+1 + m.+1 = n +2+ m :=
|
|
|
|
|
begin
|
|
|
|
|
cases m with m IH,
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ apply succ_add_plus_two}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition succ_succ_add (n m : ℕ₋₂) : n.+2 + m = n +2+ m :=
|
|
|
|
|
begin
|
|
|
|
|
cases m with m IH,
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ exact !succ_add_succ ⬝ !succ_add_plus_two}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition succ_sub_two (n : ℕ) : (nat.succ n).-2 = n.-2 .+1 := rfl
|
|
|
|
|
definition sub_two_succ_succ (n : ℕ) : n.-2.+1.+1 = n := rfl
|
|
|
|
|
definition succ_sub_two_succ (n : ℕ) : (nat.succ n).-2.+1 = n := rfl
|
|
|
|
|
|
|
|
|
|
definition of_nat_le_of_nat {n m : ℕ} (H : n ≤ m) : (of_nat n ≤ of_nat m) :=
|
|
|
|
|
begin
|
|
|
|
|
induction H with m H IH,
|
|
|
|
|
{ apply le.refl},
|
|
|
|
|
{ exact trunc_index.le_succ IH}
|
|
|
|
|
end
|
2016-02-25 00:43:50 +00:00
|
|
|
|
|
2016-03-02 22:19:44 +00:00
|
|
|
|
definition sub_two_le_sub_two {n m : ℕ} (H : n ≤ m) : n.-2 ≤ m.-2 :=
|
|
|
|
|
begin
|
|
|
|
|
induction H with m H IH,
|
|
|
|
|
{ apply le.refl},
|
|
|
|
|
{ exact trunc_index.le_succ IH}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition add_two_le_add_two {n m : ℕ₋₂} (H : n ≤ m) : add_two n ≤ add_two m :=
|
|
|
|
|
begin
|
|
|
|
|
induction H with m H IH,
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ constructor, exact IH},
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition le_of_sub_two_le_sub_two {n m : ℕ} (H : n.-2 ≤ m.-2) : n ≤ m :=
|
|
|
|
|
begin
|
|
|
|
|
rewrite [-add_two_sub_two n, -add_two_sub_two m],
|
|
|
|
|
exact add_two_le_add_two H,
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition le_of_of_nat_le_of_nat {n m : ℕ} (H : of_nat n ≤ of_nat m) : n ≤ m :=
|
|
|
|
|
begin
|
|
|
|
|
apply le_of_sub_two_le_sub_two,
|
|
|
|
|
exact le_of_succ_le_succ (le_of_succ_le_succ H)
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
protected theorem succ_le_of_not_le {n m : ℕ₋₂} (H : ¬ n ≤ m) : m.+1 ≤ n :=
|
|
|
|
|
begin
|
|
|
|
|
cases (le.total n m) with H2 H2,
|
|
|
|
|
{ exfalso, exact H H2},
|
|
|
|
|
{ cases H2 with n' H2',
|
|
|
|
|
{ exfalso, exact H !le.refl},
|
|
|
|
|
{ exact succ_le_succ H2'}}
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-02 22:19:44 +00:00
|
|
|
|
end trunc_index open trunc_index
|
|
|
|
|
|
|
|
|
|
namespace is_trunc
|
2016-02-25 00:43:50 +00:00
|
|
|
|
|
|
|
|
|
variables {A B : Type} {n : ℕ₋₂}
|
2015-02-21 00:30:32 +00:00
|
|
|
|
|
2016-03-08 05:16:45 +00:00
|
|
|
|
/- closure properties of truncatedness -/
|
2015-09-22 16:01:55 +00:00
|
|
|
|
theorem is_trunc_is_embedding_closed (f : A → B) [Hf : is_embedding f] [HB : is_trunc n B]
|
2015-04-29 00:48:39 +00:00
|
|
|
|
(Hn : -1 ≤ n) : is_trunc n A :=
|
2015-02-21 00:30:32 +00:00
|
|
|
|
begin
|
2015-07-29 12:17:16 +00:00
|
|
|
|
induction n with n,
|
2016-02-25 00:43:50 +00:00
|
|
|
|
{exfalso, exact not_succ_le_minus_two Hn},
|
2015-04-30 18:00:39 +00:00
|
|
|
|
{apply is_trunc_succ_intro, intro a a',
|
|
|
|
|
fapply @is_trunc_is_equiv_closed_rev _ _ n (ap f)}
|
2015-02-21 00:30:32 +00:00
|
|
|
|
end
|
|
|
|
|
|
2015-09-22 16:01:55 +00:00
|
|
|
|
theorem is_trunc_is_retraction_closed (f : A → B) [Hf : is_retraction f]
|
2016-02-25 00:43:50 +00:00
|
|
|
|
(n : ℕ₋₂) [HA : is_trunc n A] : is_trunc n B :=
|
2015-02-21 00:30:32 +00:00
|
|
|
|
begin
|
2015-04-30 18:00:39 +00:00
|
|
|
|
revert A B f Hf HA,
|
2015-07-29 12:17:16 +00:00
|
|
|
|
induction n with n IH,
|
|
|
|
|
{ intro A B f Hf HA, induction Hf with g ε, fapply is_contr.mk,
|
2015-04-30 18:00:39 +00:00
|
|
|
|
{ exact f (center A)},
|
2015-04-29 00:48:39 +00:00
|
|
|
|
{ intro b, apply concat,
|
|
|
|
|
{ apply (ap f), exact (center_eq (g b))},
|
|
|
|
|
{ apply ε}}},
|
2015-07-29 12:17:16 +00:00
|
|
|
|
{ intro A B f Hf HA, induction Hf with g ε,
|
2015-04-30 18:00:39 +00:00
|
|
|
|
apply is_trunc_succ_intro, intro b b',
|
2015-04-29 00:48:39 +00:00
|
|
|
|
fapply (IH (g b = g b')),
|
|
|
|
|
{ intro q, exact ((ε b)⁻¹ ⬝ ap f q ⬝ ε b')},
|
|
|
|
|
{ apply (is_retraction.mk (ap g)),
|
2015-07-29 12:17:16 +00:00
|
|
|
|
{ intro p, induction p, {rewrite [↑ap, con.left_inv]}}},
|
2015-04-29 00:48:39 +00:00
|
|
|
|
{ apply is_trunc_eq}}
|
2015-02-21 00:30:32 +00:00
|
|
|
|
end
|
|
|
|
|
|
2015-04-29 00:48:39 +00:00
|
|
|
|
definition is_embedding_to_fun (A B : Type) : is_embedding (@to_fun A B) :=
|
2015-09-10 22:32:52 +00:00
|
|
|
|
λf f', !is_equiv_ap_to_fun
|
2015-04-29 00:48:39 +00:00
|
|
|
|
|
2016-03-08 05:16:45 +00:00
|
|
|
|
/- theorems about trunctype -/
|
|
|
|
|
protected definition trunctype.sigma_char.{l} [constructor] (n : ℕ₋₂) :
|
|
|
|
|
(trunctype.{l} n) ≃ (Σ (A : Type.{l}), is_trunc n A) :=
|
|
|
|
|
begin
|
|
|
|
|
fapply equiv.MK,
|
|
|
|
|
{ intro A, exact (⟨carrier A, struct A⟩)},
|
|
|
|
|
{ intro S, exact (trunctype.mk S.1 S.2)},
|
|
|
|
|
{ intro S, induction S with S1 S2, reflexivity},
|
|
|
|
|
{ intro A, induction A with A1 A2, reflexivity},
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition trunctype_eq_equiv [constructor] (n : ℕ₋₂) (A B : n-Type) :
|
|
|
|
|
(A = B) ≃ (carrier A = carrier B) :=
|
|
|
|
|
calc
|
|
|
|
|
(A = B) ≃ (to_fun (trunctype.sigma_char n) A = to_fun (trunctype.sigma_char n) B)
|
|
|
|
|
: eq_equiv_fn_eq_of_equiv
|
|
|
|
|
... ≃ ((to_fun (trunctype.sigma_char n) A).1 = (to_fun (trunctype.sigma_char n) B).1)
|
|
|
|
|
: equiv.symm (!equiv_subtype)
|
|
|
|
|
... ≃ (carrier A = carrier B) : equiv.refl
|
|
|
|
|
|
2016-02-25 00:43:50 +00:00
|
|
|
|
theorem is_trunc_trunctype [instance] (n : ℕ₋₂) : is_trunc n.+1 (n-Type) :=
|
2015-04-29 00:48:39 +00:00
|
|
|
|
begin
|
2015-04-30 18:00:39 +00:00
|
|
|
|
apply is_trunc_succ_intro, intro X Y,
|
2016-03-08 05:16:45 +00:00
|
|
|
|
fapply is_trunc_equiv_closed_rev, { apply trunctype_eq_equiv},
|
|
|
|
|
fapply is_trunc_equiv_closed_rev, { apply eq_equiv_equiv},
|
2015-07-29 12:17:16 +00:00
|
|
|
|
induction n,
|
2016-02-25 00:43:50 +00:00
|
|
|
|
{ apply @is_contr_of_inhabited_prop,
|
|
|
|
|
{ apply is_trunc_is_embedding_closed,
|
|
|
|
|
{ apply is_embedding_to_fun} ,
|
|
|
|
|
{ reflexivity}},
|
|
|
|
|
{ apply equiv_of_is_contr_of_is_contr}},
|
|
|
|
|
{ apply is_trunc_is_embedding_closed,
|
|
|
|
|
{ apply is_embedding_to_fun},
|
|
|
|
|
{ apply minus_one_le_succ}}
|
2015-04-29 00:48:39 +00:00
|
|
|
|
end
|
2015-02-21 00:30:32 +00:00
|
|
|
|
|
2015-04-29 00:48:39 +00:00
|
|
|
|
/- theorems about decidable equality and axiom K -/
|
2016-02-15 20:18:07 +00:00
|
|
|
|
theorem is_set_of_axiom_K {A : Type} (K : Π{a : A} (p : a = a), p = idp) : is_set A :=
|
2016-03-06 00:35:12 +00:00
|
|
|
|
is_set.mk _ (λa b p q, eq.rec K q p)
|
2015-02-21 00:30:32 +00:00
|
|
|
|
|
2016-02-15 20:18:07 +00:00
|
|
|
|
theorem is_set_of_relation.{u} {A : Type.{u}} (R : A → A → Type.{u})
|
|
|
|
|
(mere : Π(a b : A), is_prop (R a b)) (refl : Π(a : A), R a a)
|
|
|
|
|
(imp : Π{a b : A}, R a b → a = b) : is_set A :=
|
|
|
|
|
is_set_of_axiom_K
|
2015-02-21 00:30:32 +00:00
|
|
|
|
(λa p,
|
2016-03-19 14:38:05 +00:00
|
|
|
|
have H2 : transport (λx, R a x → a = x) p (@imp a a) = @imp a a, from !apdt,
|
2015-02-21 00:30:32 +00:00
|
|
|
|
have H3 : Π(r : R a a), transport (λx, a = x) p (imp r)
|
|
|
|
|
= imp (transport (λx, R a x) p r), from
|
2015-02-26 18:19:54 +00:00
|
|
|
|
to_fun (equiv.symm !heq_pi) H2,
|
2015-02-21 00:30:32 +00:00
|
|
|
|
have H4 : imp (refl a) ⬝ p = imp (refl a), from
|
|
|
|
|
calc
|
2015-03-04 05:10:48 +00:00
|
|
|
|
imp (refl a) ⬝ p = transport (λx, a = x) p (imp (refl a)) : transport_eq_r
|
2015-02-21 00:30:32 +00:00
|
|
|
|
... = imp (transport (λx, R a x) p (refl a)) : H3
|
2016-02-15 20:18:07 +00:00
|
|
|
|
... = imp (refl a) : is_prop.elim,
|
2016-02-15 17:57:51 +00:00
|
|
|
|
cancel_left (imp (refl a)) H4)
|
2015-02-21 00:30:32 +00:00
|
|
|
|
|
|
|
|
|
definition relation_equiv_eq {A : Type} (R : A → A → Type)
|
2016-02-15 20:18:07 +00:00
|
|
|
|
(mere : Π(a b : A), is_prop (R a b)) (refl : Π(a : A), R a a)
|
2015-02-21 00:30:32 +00:00
|
|
|
|
(imp : Π{a b : A}, R a b → a = b) (a b : A) : R a b ≃ a = b :=
|
2016-03-06 00:35:12 +00:00
|
|
|
|
have is_set A, from is_set_of_relation R mere refl @imp,
|
|
|
|
|
equiv_of_is_prop imp (λp, p ▸ refl a)
|
2015-02-21 00:30:32 +00:00
|
|
|
|
|
2015-02-24 22:09:20 +00:00
|
|
|
|
local attribute not [reducible]
|
2016-02-15 20:18:07 +00:00
|
|
|
|
theorem is_set_of_double_neg_elim {A : Type} (H : Π(a b : A), ¬¬a = b → a = b)
|
|
|
|
|
: is_set A :=
|
|
|
|
|
is_set_of_relation (λa b, ¬¬a = b) _ (λa n, n idp) H
|
2015-02-21 00:30:32 +00:00
|
|
|
|
|
|
|
|
|
section
|
|
|
|
|
open decidable
|
2015-02-23 20:33:35 +00:00
|
|
|
|
--this is proven differently in init.hedberg
|
2016-02-15 20:18:07 +00:00
|
|
|
|
theorem is_set_of_decidable_eq (A : Type) [H : decidable_eq A] : is_set A :=
|
|
|
|
|
is_set_of_double_neg_elim (λa b, by_contradiction)
|
2015-02-21 00:30:32 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
theorem is_trunc_of_axiom_K_of_le {A : Type} {n : ℕ₋₂} (H : -1 ≤ n)
|
2015-02-21 00:30:32 +00:00
|
|
|
|
(K : Π(a : A), is_trunc n (a = a)) : is_trunc (n.+1) A :=
|
2016-02-25 00:43:50 +00:00
|
|
|
|
@is_trunc_succ_intro _ _ (λa b, is_trunc_of_imp_is_trunc_of_le H (λp, eq.rec_on p !K))
|
2015-02-21 00:30:32 +00:00
|
|
|
|
|
2015-09-22 16:01:55 +00:00
|
|
|
|
theorem is_trunc_succ_of_is_trunc_loop (Hn : -1 ≤ n) (Hp : Π(a : A), is_trunc n (a = a))
|
2015-06-04 05:12:05 +00:00
|
|
|
|
: is_trunc (n.+1) A :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_trunc_succ_intro, intros a a',
|
2016-02-25 00:43:50 +00:00
|
|
|
|
apply is_trunc_of_imp_is_trunc_of_le Hn, intro p,
|
2015-07-29 12:17:16 +00:00
|
|
|
|
induction p, apply Hp
|
2015-06-04 05:12:05 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-02-15 20:18:07 +00:00
|
|
|
|
theorem is_prop_iff_is_contr {A : Type} (a : A) :
|
|
|
|
|
is_prop A ↔ is_contr A :=
|
|
|
|
|
iff.intro (λH, is_contr.mk a (is_prop.elim a)) _
|
2015-11-13 22:17:02 +00:00
|
|
|
|
|
2015-09-22 16:01:55 +00:00
|
|
|
|
theorem is_trunc_succ_iff_is_trunc_loop (A : Type) (Hn : -1 ≤ n) :
|
2015-06-04 01:41:21 +00:00
|
|
|
|
is_trunc (n.+1) A ↔ Π(a : A), is_trunc n (a = a) :=
|
|
|
|
|
iff.intro _ (is_trunc_succ_of_is_trunc_loop Hn)
|
2015-11-18 23:08:38 +00:00
|
|
|
|
|
2015-09-22 16:01:55 +00:00
|
|
|
|
theorem is_trunc_iff_is_contr_loop_succ (n : ℕ) (A : Type)
|
2016-02-15 19:40:25 +00:00
|
|
|
|
: is_trunc n A ↔ Π(a : A), is_contr (Ω[succ n](pointed.Mk a)) :=
|
2015-06-04 01:41:21 +00:00
|
|
|
|
begin
|
|
|
|
|
revert A, induction n with n IH,
|
2016-02-15 23:23:28 +00:00
|
|
|
|
{ intro A, esimp [iterated_ploop_space], transitivity _,
|
2015-11-13 22:17:02 +00:00
|
|
|
|
{ apply is_trunc_succ_iff_is_trunc_loop, apply le.refl},
|
2016-02-15 20:18:07 +00:00
|
|
|
|
{ apply pi_iff_pi, intro a, esimp, apply is_prop_iff_is_contr, reflexivity}},
|
2016-02-15 23:23:28 +00:00
|
|
|
|
{ intro A, esimp [iterated_ploop_space],
|
2016-02-25 00:43:50 +00:00
|
|
|
|
transitivity _,
|
|
|
|
|
{ apply @is_trunc_succ_iff_is_trunc_loop @n, esimp, apply minus_one_le_succ},
|
2015-12-09 05:02:05 +00:00
|
|
|
|
apply pi_iff_pi, intro a, transitivity _, apply IH,
|
|
|
|
|
transitivity _, apply pi_iff_pi, intro p,
|
2015-11-13 22:17:02 +00:00
|
|
|
|
rewrite [iterated_loop_space_loop_irrel n p], apply iff.refl, esimp,
|
2015-12-09 05:02:05 +00:00
|
|
|
|
apply imp_iff, reflexivity}
|
2015-06-04 01:41:21 +00:00
|
|
|
|
end
|
2015-06-04 05:12:05 +00:00
|
|
|
|
|
2015-09-22 16:01:55 +00:00
|
|
|
|
theorem is_trunc_iff_is_contr_loop (n : ℕ) (A : Type)
|
2015-06-04 01:41:21 +00:00
|
|
|
|
: is_trunc (n.-2.+1) A ↔ (Π(a : A), is_contr (Ω[n](pointed.Mk a))) :=
|
2015-06-04 05:12:05 +00:00
|
|
|
|
begin
|
2015-07-29 12:17:16 +00:00
|
|
|
|
induction n with n,
|
2016-02-15 23:23:28 +00:00
|
|
|
|
{ esimp [sub_two,iterated_ploop_space], apply iff.intro,
|
2016-02-15 20:55:29 +00:00
|
|
|
|
intro H a, exact is_contr_of_inhabited_prop a,
|
2016-02-15 20:18:07 +00:00
|
|
|
|
intro H, apply is_prop_of_imp_is_contr, exact H},
|
2015-06-04 01:41:21 +00:00
|
|
|
|
{ apply is_trunc_iff_is_contr_loop_succ},
|
2015-06-04 05:12:05 +00:00
|
|
|
|
end
|
|
|
|
|
|
2015-11-18 23:08:38 +00:00
|
|
|
|
theorem is_contr_loop_of_is_trunc (n : ℕ) (A : Type*) [H : is_trunc (n.-2.+1) A] :
|
|
|
|
|
is_contr (Ω[n] A) :=
|
2016-01-03 20:39:32 +00:00
|
|
|
|
begin
|
|
|
|
|
induction A,
|
|
|
|
|
apply iff.mp !is_trunc_iff_is_contr_loop H
|
|
|
|
|
end
|
2015-11-18 23:08:38 +00:00
|
|
|
|
|
2016-03-01 04:37:03 +00:00
|
|
|
|
theorem is_trunc_loop_of_is_trunc (n : ℕ₋₂) (k : ℕ) (A : Type*) [H : is_trunc n A] :
|
|
|
|
|
is_trunc n (Ω[k] A) :=
|
|
|
|
|
begin
|
|
|
|
|
induction k with k IH,
|
|
|
|
|
{ exact H},
|
|
|
|
|
{ apply is_trunc_eq}
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-02 22:19:44 +00:00
|
|
|
|
end is_trunc open is_trunc
|
2015-02-26 18:19:54 +00:00
|
|
|
|
|
2015-04-29 00:48:39 +00:00
|
|
|
|
namespace trunc
|
2016-03-06 00:35:12 +00:00
|
|
|
|
universe variable u
|
|
|
|
|
variable {A : Type.{u}}
|
2015-04-29 00:48:39 +00:00
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
/- characterization of equality in truncated types -/
|
|
|
|
|
protected definition code [unfold 3 4] (n : ℕ₋₂) (aa aa' : trunc n.+1 A) : trunctype.{u} n :=
|
|
|
|
|
by induction aa with a; induction aa' with a'; exact trunctype.mk' n (trunc n (a = a'))
|
2015-04-29 00:48:39 +00:00
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
protected definition encode [unfold 3 5] {n : ℕ₋₂} {aa aa' : trunc n.+1 A}
|
|
|
|
|
: aa = aa' → trunc.code n aa aa' :=
|
2015-05-16 00:23:34 +00:00
|
|
|
|
begin
|
2016-03-06 00:35:12 +00:00
|
|
|
|
intro p, induction p, induction aa with a, esimp, exact (tr idp)
|
2015-05-16 00:23:34 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
protected definition decode {n : ℕ₋₂} (aa aa' : trunc n.+1 A) : trunc.code n aa aa' → aa = aa' :=
|
2015-05-16 00:23:34 +00:00
|
|
|
|
begin
|
2015-12-11 22:13:57 +00:00
|
|
|
|
induction aa' with a', induction aa with a,
|
|
|
|
|
esimp [trunc.code, trunc.rec_on], intro x,
|
|
|
|
|
induction x with p, exact ap tr p,
|
2015-05-16 00:23:34 +00:00
|
|
|
|
end
|
2015-05-07 02:48:11 +00:00
|
|
|
|
|
2016-02-25 00:43:50 +00:00
|
|
|
|
definition trunc_eq_equiv [constructor] (n : ℕ₋₂) (aa aa' : trunc n.+1 A)
|
2015-05-19 05:35:18 +00:00
|
|
|
|
: aa = aa' ≃ trunc.code n aa aa' :=
|
2015-02-26 18:19:54 +00:00
|
|
|
|
begin
|
|
|
|
|
fapply equiv.MK,
|
2015-05-19 05:35:18 +00:00
|
|
|
|
{ apply trunc.encode},
|
|
|
|
|
{ apply trunc.decode},
|
2015-05-01 22:07:28 +00:00
|
|
|
|
{ eapply (trunc.rec_on aa'), eapply (trunc.rec_on aa),
|
2015-05-19 05:35:18 +00:00
|
|
|
|
intro a a' x, esimp [trunc.code, trunc.rec_on] at x,
|
2015-07-29 12:17:16 +00:00
|
|
|
|
refine (@trunc.rec_on n _ _ x _ _),
|
|
|
|
|
intro x, apply is_trunc_eq,
|
|
|
|
|
intro p, induction p, reflexivity},
|
|
|
|
|
{ intro p, induction p, apply (trunc.rec_on aa), intro a, exact idp},
|
2015-02-26 18:19:54 +00:00
|
|
|
|
end
|
|
|
|
|
|
2016-02-25 00:43:50 +00:00
|
|
|
|
definition tr_eq_tr_equiv [constructor] (n : ℕ₋₂) (a a' : A)
|
2015-04-29 00:48:39 +00:00
|
|
|
|
: (tr a = tr a' :> trunc n.+1 A) ≃ trunc n (a = a') :=
|
|
|
|
|
!trunc_eq_equiv
|
|
|
|
|
|
2016-03-08 05:16:45 +00:00
|
|
|
|
/- encode preserves concatenation -/
|
2016-03-06 00:35:12 +00:00
|
|
|
|
definition trunc_functor2 [unfold 6 7] {n : ℕ₋₂} {A B C : Type} (f : A → B → C)
|
|
|
|
|
(x : trunc n A) (y : trunc n B) : trunc n C :=
|
|
|
|
|
by induction x with a; induction y with b; exact tr (f a b)
|
|
|
|
|
|
|
|
|
|
definition trunc_concat [unfold 6 7] {n : ℕ₋₂} {A : Type} {a₁ a₂ a₃ : A}
|
|
|
|
|
(p : trunc n (a₁ = a₂)) (q : trunc n (a₂ = a₃)) : trunc n (a₁ = a₃) :=
|
|
|
|
|
trunc_functor2 concat p q
|
|
|
|
|
|
|
|
|
|
definition code_mul {n : ℕ₋₂} {aa₁ aa₂ aa₃ : trunc n.+1 A}
|
|
|
|
|
(g : trunc.code n aa₁ aa₂) (h : trunc.code n aa₂ aa₃) : trunc.code n aa₁ aa₃ :=
|
|
|
|
|
begin
|
|
|
|
|
induction aa₁ with a₁, induction aa₂ with a₂, induction aa₃ with a₃,
|
2016-03-08 05:16:45 +00:00
|
|
|
|
esimp at *, apply trunc_concat g h,
|
2016-03-06 00:35:12 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition encode_con' {n : ℕ₋₂} {aa₁ aa₂ aa₃ : trunc n.+1 A} (p : aa₁ = aa₂) (q : aa₂ = aa₃)
|
|
|
|
|
: trunc.encode (p ⬝ q) = code_mul (trunc.encode p) (trunc.encode q) :=
|
|
|
|
|
begin
|
|
|
|
|
induction p, induction q, induction aa₁ with a₁, reflexivity
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition encode_con {n : ℕ₋₂} {a₁ a₂ a₃ : A} (p : tr a₁ = tr a₂ :> trunc (n.+1) A)
|
|
|
|
|
(q : tr a₂ = tr a₃ :> trunc (n.+1) A)
|
|
|
|
|
: trunc.encode (p ⬝ q) = trunc_concat (trunc.encode p) (trunc.encode q) :=
|
|
|
|
|
encode_con' p q
|
|
|
|
|
|
2016-03-08 05:16:45 +00:00
|
|
|
|
/- the principle of unique choice -/
|
|
|
|
|
definition unique_choice {P : A → Type} [H : Πa, is_prop (P a)] (f : Πa, ∥ P a ∥) (a : A)
|
|
|
|
|
: P a :=
|
|
|
|
|
!trunc_equiv (f a)
|
|
|
|
|
|
|
|
|
|
/- transport over a truncated family -/
|
|
|
|
|
definition trunc_transport {a a' : A} {P : A → Type} (p : a = a') (n : ℕ₋₂) (x : P a)
|
|
|
|
|
: transport (λa, trunc n (P a)) p (tr x) = tr (p ▸ x) :=
|
|
|
|
|
by induction p; reflexivity
|
|
|
|
|
|
|
|
|
|
/- pathover over a truncated family -/
|
|
|
|
|
definition trunc_pathover {A : Type} {B : A → Type} {n : ℕ₋₂} {a a' : A} {p : a = a'}
|
|
|
|
|
{b : B a} {b' : B a'} (q : b =[p] b') : @tr n _ b =[p] @tr n _ b' :=
|
|
|
|
|
by induction q; constructor
|
|
|
|
|
|
|
|
|
|
/- truncations preserve truncatedness -/
|
2015-04-29 00:48:39 +00:00
|
|
|
|
definition is_trunc_trunc_of_is_trunc [instance] [priority 500] (A : Type)
|
2016-02-25 00:43:50 +00:00
|
|
|
|
(n m : ℕ₋₂) [H : is_trunc n A] : is_trunc n (trunc m A) :=
|
2015-04-29 00:48:39 +00:00
|
|
|
|
begin
|
2015-05-01 22:07:28 +00:00
|
|
|
|
revert A m H, eapply (trunc_index.rec_on n),
|
2015-04-30 18:00:39 +00:00
|
|
|
|
{ clear n, intro A m H, apply is_contr_equiv_closed,
|
2016-02-25 00:43:50 +00:00
|
|
|
|
{ apply equiv.symm, apply trunc_equiv, apply (@is_trunc_of_le _ -2), apply minus_two_le} },
|
2015-07-29 12:17:16 +00:00
|
|
|
|
{ clear n, intro n IH A m H, induction m with m,
|
2016-02-25 00:43:50 +00:00
|
|
|
|
{ apply (@is_trunc_of_le _ -2), apply minus_two_le},
|
2015-04-30 18:00:39 +00:00
|
|
|
|
{ apply is_trunc_succ_intro, intro aa aa',
|
2016-02-15 20:18:07 +00:00
|
|
|
|
apply (@trunc.rec_on _ _ _ aa (λy, !is_trunc_succ_of_is_prop)),
|
|
|
|
|
eapply (@trunc.rec_on _ _ _ aa' (λy, !is_trunc_succ_of_is_prop)),
|
2015-04-30 18:00:39 +00:00
|
|
|
|
intro a a', apply (is_trunc_equiv_closed_rev),
|
2015-04-29 00:48:39 +00:00
|
|
|
|
{ apply tr_eq_tr_equiv},
|
|
|
|
|
{ exact (IH _ _ _)}}}
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
/- equivalences between truncated types (see also hit.trunc) -/
|
2016-03-28 16:46:17 +00:00
|
|
|
|
definition trunc_trunc_equiv_left [constructor] (A : Type) {n m : ℕ₋₂} (H : n ≤ m)
|
2016-02-25 00:43:50 +00:00
|
|
|
|
: trunc n (trunc m A) ≃ trunc n A :=
|
|
|
|
|
begin
|
|
|
|
|
note H2 := is_trunc_of_le (trunc n A) H,
|
|
|
|
|
fapply equiv.MK,
|
|
|
|
|
{ intro x, induction x with x, induction x with x, exact tr x},
|
|
|
|
|
{ intro x, induction x with x, exact tr (tr x)},
|
|
|
|
|
{ intro x, induction x with x, reflexivity},
|
|
|
|
|
{ intro x, induction x with x, induction x with x, reflexivity}
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
definition trunc_trunc_equiv_right [constructor] (A : Type) {n m : ℕ₋₂} (H : n ≤ m)
|
2016-02-25 00:43:50 +00:00
|
|
|
|
: trunc m (trunc n A) ≃ trunc n A :=
|
|
|
|
|
begin
|
|
|
|
|
apply trunc_equiv,
|
|
|
|
|
exact is_trunc_of_le _ H,
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
definition trunc_equiv_trunc_of_le {n m : ℕ₋₂} {A B : Type} (H : n ≤ m)
|
|
|
|
|
(f : trunc m A ≃ trunc m B) : trunc n A ≃ trunc n B :=
|
2016-03-28 16:46:17 +00:00
|
|
|
|
(trunc_trunc_equiv_left A H)⁻¹ᵉ ⬝e trunc_equiv_trunc n f ⬝e trunc_trunc_equiv_left B H
|
2016-03-06 00:35:12 +00:00
|
|
|
|
|
|
|
|
|
definition trunc_trunc_equiv_trunc_trunc [constructor] (n m : ℕ₋₂) (A : Type)
|
|
|
|
|
: trunc n (trunc m A) ≃ trunc m (trunc n A) :=
|
|
|
|
|
begin
|
|
|
|
|
fapply equiv.MK: intro x; induction x with x; induction x with x,
|
|
|
|
|
{ exact tr (tr x)},
|
|
|
|
|
{ exact tr (tr x)},
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ reflexivity}
|
|
|
|
|
end
|
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
theorem is_trunc_trunc_of_le (A : Type)
|
|
|
|
|
(n : ℕ₋₂) {m k : ℕ₋₂} (H : m ≤ k) [is_trunc n (trunc k A)] : is_trunc n (trunc m A) :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_trunc_equiv_closed,
|
|
|
|
|
{ apply trunc_trunc_equiv_left, exact H},
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition trunc_functor_homotopy_of_le {n k : ℕ₋₂} {A B : Type} (f : A → B) (H : n ≤ k) :
|
|
|
|
|
to_fun (trunc_trunc_equiv_left B H) ∘
|
|
|
|
|
trunc_functor n (trunc_functor k f) ∘
|
|
|
|
|
to_fun (trunc_trunc_equiv_left A H)⁻¹ᵉ ~
|
|
|
|
|
trunc_functor n f :=
|
|
|
|
|
begin
|
|
|
|
|
intro x, induction x with x, reflexivity
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition is_equiv_trunc_functor_of_le {n k : ℕ₋₂} {A B : Type} (f : A → B) (H : n ≤ k)
|
|
|
|
|
[is_equiv (trunc_functor k f)] : is_equiv (trunc_functor n f) :=
|
|
|
|
|
is_equiv_of_equiv_of_homotopy (trunc_equiv_trunc_of_le H (equiv.mk (trunc_functor k f) _))
|
|
|
|
|
(trunc_functor_homotopy_of_le f H)
|
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
/- trunc_functor preserves surjectivity -/
|
|
|
|
|
|
|
|
|
|
definition is_surjective_trunc_functor {A B : Type} (n : ℕ₋₂) (f : A → B) [H : is_surjective f]
|
|
|
|
|
: is_surjective (trunc_functor n f) :=
|
|
|
|
|
begin
|
|
|
|
|
cases n with n: intro b,
|
|
|
|
|
{ exact tr (fiber.mk !center !is_prop.elim)},
|
|
|
|
|
{ refine @trunc.rec _ _ _ _ _ b, {intro x, exact is_trunc_of_le _ !minus_one_le_succ},
|
|
|
|
|
clear b, intro b, induction H b with v, induction v with a p,
|
|
|
|
|
exact tr (fiber.mk (tr a) (ap tr p))}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
/- the image of a map is the (-1)-truncated fiber -/
|
2016-02-16 01:59:38 +00:00
|
|
|
|
definition image [constructor] {A B : Type} (f : A → B) (b : B) : Prop := ∥ fiber f b ∥
|
|
|
|
|
|
|
|
|
|
definition image.mk [constructor] {A B : Type} {f : A → B} {b : B} (a : A) (p : f a = b)
|
|
|
|
|
: image f b :=
|
|
|
|
|
tr (fiber.mk a p)
|
2016-02-15 19:40:25 +00:00
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
/- truncation of pointed types and its functorial action -/
|
2016-02-25 00:43:50 +00:00
|
|
|
|
definition ptrunc [constructor] (n : ℕ₋₂) (X : Type*) : n-Type* :=
|
2016-02-16 01:59:38 +00:00
|
|
|
|
ptrunctype.mk (trunc n X) _ (tr pt)
|
2016-02-15 19:40:25 +00:00
|
|
|
|
|
|
|
|
|
definition ptrunc_functor [constructor] {X Y : Type*} (n : ℕ₋₂) (f : X →* Y)
|
|
|
|
|
: ptrunc n X →* ptrunc n Y :=
|
|
|
|
|
pmap.mk (trunc_functor n f) (ap tr (respect_pt f))
|
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
definition ptrunc_pequiv_ptrunc [constructor] (n : ℕ₋₂) {X Y : Type*} (H : X ≃* Y)
|
2016-03-01 04:37:03 +00:00
|
|
|
|
: ptrunc n X ≃* ptrunc n Y :=
|
|
|
|
|
pequiv_of_equiv (trunc_equiv_trunc n H) (ap tr (respect_pt H))
|
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
definition ptrunc_pequiv [constructor] (n : ℕ₋₂) (X : Type*) (H : is_trunc n X)
|
|
|
|
|
: ptrunc n X ≃* X :=
|
|
|
|
|
pequiv_of_equiv (trunc_equiv n X) idp
|
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
definition ptrunc_ptrunc_pequiv_left [constructor] (A : Type*) {n m : ℕ₋₂} (H : n ≤ m)
|
2016-03-06 00:35:12 +00:00
|
|
|
|
: ptrunc n (ptrunc m A) ≃* ptrunc n A :=
|
2016-03-28 16:46:17 +00:00
|
|
|
|
pequiv_of_equiv (trunc_trunc_equiv_left A H) idp
|
2016-03-06 00:35:12 +00:00
|
|
|
|
|
2016-03-28 16:46:17 +00:00
|
|
|
|
definition ptrunc_ptrunc_pequiv_right [constructor] (A : Type*) {n m : ℕ₋₂} (H : n ≤ m)
|
2016-03-06 00:35:12 +00:00
|
|
|
|
: ptrunc m (ptrunc n A) ≃* ptrunc n A :=
|
2016-03-28 16:46:17 +00:00
|
|
|
|
pequiv_of_equiv (trunc_trunc_equiv_right A H) idp
|
2016-03-06 00:35:12 +00:00
|
|
|
|
|
|
|
|
|
definition ptrunc_pequiv_ptrunc_of_le {n m : ℕ₋₂} {A B : Type*} (H : n ≤ m)
|
|
|
|
|
(f : ptrunc m A ≃* ptrunc m B) : ptrunc n A ≃* ptrunc n B :=
|
2016-03-28 16:46:17 +00:00
|
|
|
|
(ptrunc_ptrunc_pequiv_left A H)⁻¹ᵉ* ⬝e*
|
2016-03-06 00:35:12 +00:00
|
|
|
|
ptrunc_pequiv_ptrunc n f ⬝e*
|
2016-03-28 16:46:17 +00:00
|
|
|
|
ptrunc_ptrunc_pequiv_left B H
|
2016-03-06 00:35:12 +00:00
|
|
|
|
|
|
|
|
|
definition ptrunc_ptrunc_pequiv_ptrunc_ptrunc [constructor] (n m : ℕ₋₂) (A : Type*)
|
|
|
|
|
: ptrunc n (ptrunc m A) ≃ ptrunc m (ptrunc n A) :=
|
|
|
|
|
pequiv_of_equiv (trunc_trunc_equiv_trunc_trunc n m A) idp
|
|
|
|
|
|
2016-02-25 00:43:50 +00:00
|
|
|
|
definition loop_ptrunc_pequiv [constructor] (n : ℕ₋₂) (A : Type*) :
|
|
|
|
|
Ω (ptrunc (n+1) A) ≃* ptrunc n (Ω A) :=
|
|
|
|
|
pequiv_of_equiv !tr_eq_tr_equiv idp
|
|
|
|
|
|
2016-03-06 00:35:12 +00:00
|
|
|
|
definition loop_ptrunc_pequiv_con {n : ℕ₋₂} {A : Type*} (p q : Ω (ptrunc (n+1) A)) :
|
|
|
|
|
loop_ptrunc_pequiv n A (p ⬝ q) =
|
|
|
|
|
trunc_concat (loop_ptrunc_pequiv n A p) (loop_ptrunc_pequiv n A q) :=
|
|
|
|
|
encode_con p q
|
|
|
|
|
|
|
|
|
|
definition iterated_loop_ptrunc_pequiv (n : ℕ₋₂) (k : ℕ) (A : Type*) :
|
2016-02-25 00:43:50 +00:00
|
|
|
|
Ω[k] (ptrunc (n+k) A) ≃* ptrunc n (Ω[k] A) :=
|
|
|
|
|
begin
|
|
|
|
|
revert n, induction k with k IH: intro n,
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
{ refine _ ⬝e* loop_ptrunc_pequiv n (Ω[k] A),
|
|
|
|
|
rewrite [iterated_ploop_space_succ], apply loop_pequiv_loop,
|
|
|
|
|
refine _ ⬝e* IH (n.+1),
|
|
|
|
|
rewrite succ_add_nat}
|
|
|
|
|
end
|
2015-11-21 03:32:35 +00:00
|
|
|
|
|
2016-03-01 04:37:03 +00:00
|
|
|
|
definition ptrunc_functor_pcompose [constructor] {X Y Z : Type*} (n : ℕ₋₂) (g : Y →* Z)
|
|
|
|
|
(f : X →* Y) : ptrunc_functor n (g ∘* f) ~* ptrunc_functor n g ∘* ptrunc_functor n f :=
|
|
|
|
|
begin
|
|
|
|
|
fapply phomotopy.mk,
|
|
|
|
|
{ apply trunc_functor_compose},
|
|
|
|
|
{ esimp, refine !idp_con ⬝ _, refine whisker_right !ap_compose'⁻¹ᵖ _ ⬝ _,
|
|
|
|
|
esimp, refine whisker_right (ap_compose' tr g _) _ ⬝ _, exact !ap_con⁻¹},
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition ptrunc_functor_pid [constructor] (X : Type*) (n : ℕ₋₂) :
|
|
|
|
|
ptrunc_functor n (pid X) ~* pid (ptrunc n X) :=
|
|
|
|
|
begin
|
|
|
|
|
fapply phomotopy.mk,
|
|
|
|
|
{ apply trunc_functor_id},
|
|
|
|
|
{ reflexivity},
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition ptrunc_functor_pcast [constructor] {X Y : Type*} (n : ℕ₋₂) (p : X = Y) :
|
|
|
|
|
ptrunc_functor n (pcast p) ~* pcast (ap (ptrunc n) p) :=
|
|
|
|
|
begin
|
|
|
|
|
fapply phomotopy.mk,
|
|
|
|
|
{ intro x, esimp, refine !trunc_functor_cast ⬝ _, refine ap010 cast _ x,
|
|
|
|
|
refine !ap_compose'⁻¹ ⬝ !ap_compose'},
|
|
|
|
|
{ induction p, reflexivity},
|
|
|
|
|
end
|
|
|
|
|
|
2015-04-29 00:48:39 +00:00
|
|
|
|
end trunc open trunc
|
|
|
|
|
|
|
|
|
|
namespace function
|
|
|
|
|
variables {A B : Type}
|
|
|
|
|
definition is_surjective_of_is_equiv [instance] (f : A → B) [H : is_equiv f] : is_surjective f :=
|
2016-03-01 04:37:03 +00:00
|
|
|
|
λb, begin esimp, apply center end
|
2015-02-26 18:19:54 +00:00
|
|
|
|
|
2015-09-22 16:01:55 +00:00
|
|
|
|
definition is_equiv_equiv_is_embedding_times_is_surjective [constructor] (f : A → B)
|
2015-04-29 00:48:39 +00:00
|
|
|
|
: is_equiv f ≃ (is_embedding f × is_surjective f) :=
|
2016-02-15 20:18:07 +00:00
|
|
|
|
equiv_of_is_prop (λH, (_, _))
|
2015-04-29 00:48:39 +00:00
|
|
|
|
(λP, prod.rec_on P (λH₁ H₂, !is_equiv_of_is_surjective_of_is_embedding))
|
2015-02-26 18:19:54 +00:00
|
|
|
|
|
2015-04-29 00:48:39 +00:00
|
|
|
|
end function
|