2015-04-07 01:01:08 +00:00
|
|
|
|
/-
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
Declaration of the n-spheres
|
|
|
|
|
-/
|
|
|
|
|
|
2015-06-17 19:58:58 +00:00
|
|
|
|
import .susp types.trunc
|
2015-04-07 01:01:08 +00:00
|
|
|
|
|
2015-06-17 19:58:58 +00:00
|
|
|
|
open eq nat susp bool is_trunc unit pointed
|
2015-04-07 01:01:08 +00:00
|
|
|
|
|
2015-04-19 21:56:24 +00:00
|
|
|
|
/-
|
|
|
|
|
We can define spheres with the following possible indices:
|
|
|
|
|
- trunc_index (defining S^-2 = S^-1 = empty)
|
2015-09-13 18:58:11 +00:00
|
|
|
|
- nat (forgetting that S^-1 = empty)
|
2015-04-19 21:56:24 +00:00
|
|
|
|
- nat, but counting wrong (S^0 = empty, S^1 = bool, ...)
|
|
|
|
|
- some new type "integers >= -1"
|
|
|
|
|
We choose the last option here.
|
2015-04-07 01:01:08 +00:00
|
|
|
|
-/
|
|
|
|
|
|
|
|
|
|
/- Sphere levels -/
|
|
|
|
|
|
|
|
|
|
inductive sphere_index : Type₀ :=
|
|
|
|
|
| minus_one : sphere_index
|
|
|
|
|
| succ : sphere_index → sphere_index
|
|
|
|
|
|
2015-06-04 01:41:21 +00:00
|
|
|
|
namespace trunc_index
|
|
|
|
|
definition sub_one [reducible] (n : sphere_index) : trunc_index :=
|
|
|
|
|
sphere_index.rec_on n -2 (λ n k, k.+1)
|
|
|
|
|
postfix `.-1`:(max+1) := sub_one
|
|
|
|
|
end trunc_index
|
|
|
|
|
|
2015-04-07 01:01:08 +00:00
|
|
|
|
namespace sphere_index
|
|
|
|
|
/-
|
|
|
|
|
notation for sphere_index is -1, 0, 1, ...
|
|
|
|
|
from 0 and up this comes from a coercion from num to sphere_index (via nat)
|
|
|
|
|
-/
|
2015-12-09 05:02:05 +00:00
|
|
|
|
|
|
|
|
|
definition has_zero_sphere_index [instance] [reducible] : has_zero sphere_index :=
|
|
|
|
|
has_zero.mk (succ minus_one)
|
|
|
|
|
|
|
|
|
|
definition has_one_sphere_index [instance] [reducible] : has_one sphere_index :=
|
|
|
|
|
has_one.mk (succ (succ minus_one))
|
|
|
|
|
|
2015-04-07 01:01:08 +00:00
|
|
|
|
postfix `.+1`:(max+1) := sphere_index.succ
|
|
|
|
|
postfix `.+2`:(max+1) := λ(n : sphere_index), (n .+1 .+1)
|
|
|
|
|
notation `-1` := minus_one
|
2015-10-16 19:15:44 +00:00
|
|
|
|
notation `ℕ₋₁` := sphere_index
|
2015-04-07 01:01:08 +00:00
|
|
|
|
|
|
|
|
|
definition add (n m : sphere_index) : sphere_index :=
|
|
|
|
|
sphere_index.rec_on m n (λ k l, l .+1)
|
|
|
|
|
|
2015-05-05 22:05:07 +00:00
|
|
|
|
definition leq (n m : sphere_index) : Type₀ :=
|
2015-04-07 01:01:08 +00:00
|
|
|
|
sphere_index.rec_on n (λm, unit) (λ n p m, sphere_index.rec_on m (λ p, empty) (λ m q p, p m) p) m
|
|
|
|
|
|
|
|
|
|
infix `+1+`:65 := sphere_index.add
|
|
|
|
|
|
2015-12-09 05:02:05 +00:00
|
|
|
|
definition has_le_sphere_index [instance] [reducible] : has_le sphere_index :=
|
|
|
|
|
has_le.mk leq
|
2015-04-07 01:01:08 +00:00
|
|
|
|
|
2015-12-09 05:02:05 +00:00
|
|
|
|
definition succ_le_succ {n m : sphere_index} (H : n ≤ m) : n.+1 ≤ m.+1 := proof H qed
|
|
|
|
|
definition le_of_succ_le_succ {n m : sphere_index} (H : n.+1 ≤ m.+1) : n ≤ m := proof H qed
|
2015-04-07 01:01:08 +00:00
|
|
|
|
definition minus_two_le (n : sphere_index) : -1 ≤ n := star
|
|
|
|
|
definition empty_of_succ_le_minus_two {n : sphere_index} (H : n .+1 ≤ -1) : empty := H
|
|
|
|
|
|
|
|
|
|
definition of_nat [coercion] [reducible] (n : nat) : sphere_index :=
|
2015-06-04 01:41:21 +00:00
|
|
|
|
(nat.rec_on n -1 (λ n k, k.+1)).+1
|
2015-04-07 01:01:08 +00:00
|
|
|
|
|
|
|
|
|
definition trunc_index_of_sphere_index [coercion] [reducible] (n : sphere_index) : trunc_index :=
|
2015-06-04 01:41:21 +00:00
|
|
|
|
(sphere_index.rec_on n -2 (λ n k, k.+1)).+1
|
|
|
|
|
|
|
|
|
|
definition sub_one [reducible] (n : ℕ) : sphere_index :=
|
|
|
|
|
nat.rec_on n -1 (λ n k, k.+1)
|
|
|
|
|
|
|
|
|
|
postfix `.-1`:(max+1) := sub_one
|
|
|
|
|
|
|
|
|
|
open trunc_index
|
|
|
|
|
definition sub_two_eq_sub_one_sub_one (n : ℕ) : n.-2 = n.-1.-1 :=
|
|
|
|
|
nat.rec_on n idp (λn p, ap trunc_index.succ p)
|
2015-04-19 21:56:24 +00:00
|
|
|
|
|
2015-04-07 01:01:08 +00:00
|
|
|
|
end sphere_index
|
|
|
|
|
|
|
|
|
|
open sphere_index equiv
|
|
|
|
|
|
|
|
|
|
definition sphere : sphere_index → Type₀
|
|
|
|
|
| -1 := empty
|
2015-06-17 19:58:58 +00:00
|
|
|
|
| n.+1 := susp (sphere n)
|
2015-04-07 01:01:08 +00:00
|
|
|
|
|
|
|
|
|
namespace sphere
|
2015-06-04 01:41:21 +00:00
|
|
|
|
|
2015-06-17 19:58:58 +00:00
|
|
|
|
definition base {n : ℕ} : sphere n := north
|
2015-06-04 01:41:21 +00:00
|
|
|
|
definition pointed_sphere [instance] [constructor] (n : ℕ) : pointed (sphere n) :=
|
|
|
|
|
pointed.mk base
|
2016-02-15 21:05:31 +00:00
|
|
|
|
definition Sphere [constructor] (n : ℕ) : pType := pointed.mk' (sphere n)
|
2015-06-04 01:41:21 +00:00
|
|
|
|
|
2015-04-07 01:01:08 +00:00
|
|
|
|
namespace ops
|
2015-06-04 05:09:26 +00:00
|
|
|
|
abbreviation S := sphere
|
|
|
|
|
notation `S.`:max := Sphere
|
2015-04-07 01:01:08 +00:00
|
|
|
|
end ops
|
2015-06-04 01:41:21 +00:00
|
|
|
|
open sphere.ops
|
2015-04-07 01:01:08 +00:00
|
|
|
|
|
2015-06-04 05:09:26 +00:00
|
|
|
|
definition equator (n : ℕ) : map₊ (S. n) (Ω (S. (succ n))) :=
|
2015-06-17 19:58:58 +00:00
|
|
|
|
pmap.mk (λa, merid a ⬝ (merid base)⁻¹) !con.right_inv
|
2015-06-04 05:09:26 +00:00
|
|
|
|
|
|
|
|
|
definition surf {n : ℕ} : Ω[n] S. n :=
|
2015-11-13 22:17:02 +00:00
|
|
|
|
nat.rec_on n (proof base qed)
|
|
|
|
|
(begin intro m s, refine cast _ (apn m (equator m) s),
|
2016-02-15 21:05:31 +00:00
|
|
|
|
exact ap pType.carrier !loop_space_succ_eq_in⁻¹ end)
|
2015-11-13 22:17:02 +00:00
|
|
|
|
|
2015-06-04 05:09:26 +00:00
|
|
|
|
|
2015-06-23 16:47:52 +00:00
|
|
|
|
definition bool_of_sphere : S 0 → bool :=
|
2015-12-09 05:02:05 +00:00
|
|
|
|
proof susp.rec ff tt (λx, empty.elim x) qed
|
2015-04-07 01:01:08 +00:00
|
|
|
|
|
2015-06-23 16:47:52 +00:00
|
|
|
|
definition sphere_of_bool : bool → S 0
|
2015-12-09 05:02:05 +00:00
|
|
|
|
| ff := proof north qed
|
|
|
|
|
| tt := proof south qed
|
2015-04-07 01:01:08 +00:00
|
|
|
|
|
2015-06-04 01:41:21 +00:00
|
|
|
|
definition sphere_equiv_bool : S 0 ≃ bool :=
|
2015-04-07 01:01:08 +00:00
|
|
|
|
equiv.MK bool_of_sphere
|
|
|
|
|
sphere_of_bool
|
2015-04-27 21:34:55 +00:00
|
|
|
|
(λb, match b with | tt := idp | ff := idp end)
|
2015-12-09 05:02:05 +00:00
|
|
|
|
(λx, proof susp.rec_on x idp idp (empty.rec _) qed)
|
2015-04-07 01:01:08 +00:00
|
|
|
|
|
2015-06-04 01:41:21 +00:00
|
|
|
|
definition sphere_eq_bool : S 0 = bool :=
|
|
|
|
|
ua sphere_equiv_bool
|
|
|
|
|
|
|
|
|
|
definition sphere_eq_bool_pointed : S. 0 = Bool :=
|
2016-02-15 21:05:31 +00:00
|
|
|
|
pType_eq sphere_equiv_bool idp
|
2015-06-04 01:41:21 +00:00
|
|
|
|
|
2015-11-13 22:17:02 +00:00
|
|
|
|
-- TODO: the commented-out part makes the forward function below "apn _ surf"
|
2016-02-15 21:05:31 +00:00
|
|
|
|
definition pmap_sphere (A : pType) (n : ℕ) : map₊ (S. n) A ≃ Ω[n] A :=
|
2015-06-04 01:41:21 +00:00
|
|
|
|
begin
|
2015-11-13 22:17:02 +00:00
|
|
|
|
-- fapply equiv_change_fun,
|
|
|
|
|
-- {
|
|
|
|
|
revert A, induction n with n IH: intro A,
|
|
|
|
|
{ rewrite [sphere_eq_bool_pointed], apply pmap_bool_equiv},
|
|
|
|
|
{ refine susp_adjoint_loop (S. n) A ⬝e !IH ⬝e _, rewrite [loop_space_succ_eq_in]}
|
|
|
|
|
-- },
|
|
|
|
|
-- { intro f, exact apn n f surf},
|
|
|
|
|
-- { revert A, induction n with n IH: intro A f,
|
|
|
|
|
-- { exact sorry},
|
|
|
|
|
-- { exact sorry}}
|
|
|
|
|
end
|
2015-06-04 01:41:21 +00:00
|
|
|
|
|
2016-02-15 21:05:31 +00:00
|
|
|
|
protected definition elim {n : ℕ} {P : pType} (p : Ω[n] P) : map₊ (S. n) P :=
|
2015-06-17 19:58:58 +00:00
|
|
|
|
to_inv !pmap_sphere p
|
2015-06-04 05:09:26 +00:00
|
|
|
|
|
2016-02-15 21:05:31 +00:00
|
|
|
|
-- definition elim_surf {n : ℕ} {P : pType} (p : Ω[n] P) : apn n (sphere.elim p) surf = p :=
|
2015-06-23 16:47:52 +00:00
|
|
|
|
-- begin
|
|
|
|
|
-- induction n with n IH,
|
|
|
|
|
-- { esimp [apn,surf,sphere.elim,pmap_sphere], apply sorry},
|
|
|
|
|
-- { apply sorry}
|
|
|
|
|
-- end
|
2015-06-04 05:09:26 +00:00
|
|
|
|
|
2015-04-07 01:01:08 +00:00
|
|
|
|
end sphere
|
2015-06-04 01:41:21 +00:00
|
|
|
|
|
|
|
|
|
open sphere sphere.ops
|
|
|
|
|
|
|
|
|
|
structure weakly_constant [class] {A B : Type} (f : A → B) := --move
|
2015-06-17 19:58:58 +00:00
|
|
|
|
(is_weakly_constant : Πa a', f a = f a')
|
|
|
|
|
abbreviation wconst := @weakly_constant.is_weakly_constant
|
2015-06-04 01:41:21 +00:00
|
|
|
|
|
2015-06-17 19:58:58 +00:00
|
|
|
|
namespace is_trunc
|
2015-06-04 01:41:21 +00:00
|
|
|
|
open trunc_index
|
2015-06-04 05:09:26 +00:00
|
|
|
|
variables {n : ℕ} {A : Type}
|
2015-06-17 19:58:58 +00:00
|
|
|
|
definition is_trunc_of_pmap_sphere_constant
|
2015-06-04 01:41:21 +00:00
|
|
|
|
(H : Π(a : A) (f : map₊ (S. n) (pointed.Mk a)) (x : S n), f x = f base) : is_trunc (n.-2.+1) A :=
|
|
|
|
|
begin
|
|
|
|
|
apply iff.elim_right !is_trunc_iff_is_contr_loop,
|
|
|
|
|
intro a,
|
2015-06-17 19:58:58 +00:00
|
|
|
|
apply is_trunc_equiv_closed, apply pmap_sphere,
|
2015-06-04 01:41:21 +00:00
|
|
|
|
fapply is_contr.mk,
|
2015-06-17 19:58:58 +00:00
|
|
|
|
{ exact pmap.mk (λx, a) idp},
|
|
|
|
|
{ intro f, fapply pmap_eq,
|
2015-06-04 01:41:21 +00:00
|
|
|
|
{ intro x, esimp, refine !respect_pt⁻¹ ⬝ (!H ⬝ !H⁻¹)},
|
|
|
|
|
{ rewrite [▸*,con.right_inv,▸*,con.left_inv]}}
|
|
|
|
|
end
|
|
|
|
|
|
2015-06-04 05:09:26 +00:00
|
|
|
|
definition is_trunc_iff_map_sphere_constant
|
2015-06-04 01:41:21 +00:00
|
|
|
|
(H : Π(f : S n → A) (x : S n), f x = f base) : is_trunc (n.-2.+1) A :=
|
|
|
|
|
begin
|
2015-06-17 19:58:58 +00:00
|
|
|
|
apply is_trunc_of_pmap_sphere_constant,
|
2015-06-04 01:41:21 +00:00
|
|
|
|
intros, cases f with f p, esimp at *, apply H
|
|
|
|
|
end
|
|
|
|
|
|
2015-06-17 19:58:58 +00:00
|
|
|
|
definition pmap_sphere_constant_of_is_trunc' [H : is_trunc (n.-2.+1) A]
|
2015-06-04 05:09:26 +00:00
|
|
|
|
(a : A) (f : map₊ (S. n) (pointed.Mk a)) (x : S n) : f x = f base :=
|
|
|
|
|
begin
|
|
|
|
|
let H' := iff.elim_left (is_trunc_iff_is_contr_loop n A) H a,
|
2015-12-10 18:37:55 +00:00
|
|
|
|
note H'' := @is_trunc_equiv_closed_rev _ _ _ !pmap_sphere H',
|
2015-06-17 19:58:58 +00:00
|
|
|
|
assert p : (f = pmap.mk (λx, f base) (respect_pt f)),
|
2016-02-15 20:18:07 +00:00
|
|
|
|
apply is_prop.elim,
|
2016-02-15 19:40:25 +00:00
|
|
|
|
exact ap10 (ap pmap.to_fun p) x
|
2015-06-04 05:09:26 +00:00
|
|
|
|
end
|
|
|
|
|
|
2015-06-17 19:58:58 +00:00
|
|
|
|
definition pmap_sphere_constant_of_is_trunc [H : is_trunc (n.-2.+1) A]
|
|
|
|
|
(a : A) (f : map₊ (S. n) (pointed.Mk a)) (x y : S n) : f x = f y :=
|
|
|
|
|
let H := pmap_sphere_constant_of_is_trunc' a f in !H ⬝ !H⁻¹
|
|
|
|
|
|
2015-06-04 05:09:26 +00:00
|
|
|
|
definition map_sphere_constant_of_is_trunc [H : is_trunc (n.-2.+1) A]
|
2015-06-17 19:58:58 +00:00
|
|
|
|
(f : S n → A) (x y : S n) : f x = f y :=
|
|
|
|
|
pmap_sphere_constant_of_is_trunc (f base) (pmap.mk f idp) x y
|
|
|
|
|
|
|
|
|
|
definition map_sphere_constant_of_is_trunc_self [H : is_trunc (n.-2.+1) A]
|
|
|
|
|
(f : S n → A) (x : S n) : map_sphere_constant_of_is_trunc f x x = idp :=
|
|
|
|
|
!con.right_inv
|
2015-06-04 05:09:26 +00:00
|
|
|
|
|
2015-06-17 19:58:58 +00:00
|
|
|
|
end is_trunc
|