{-# OPTIONS --without-K #-}
module sets.nat.struct where
open import sum
open import equality
open import function
open import container.core
open import container.w
open import sets.empty
open import sets.unit
open import sets.nat.core
open import sets.fin
open import sets.vec.dependent
open import hott.level
ℕ-c : Container _ _ _
ℕ-c = record
{ I = ⊤
; A = λ _ → Fin 2
; B = ⊥ ∷∷ ⊤ ∷∷ ⟦⟧
; r = λ _ → tt }
open Container ℕ-c
ℕ-algebra-iso : (⊤ ⊎ ℕ) ≅ ℕ
ℕ-algebra-iso = record
{ to = λ { (inj₁ _) → zero ; (inj₂ n) → suc n }
; from = λ { zero → inj₁ tt ; (suc n) → inj₂ n }
; iso₁ = λ { (inj₁ _) → refl ; (inj₂ n) → refl }
; iso₂ = λ { zero → refl ; (suc n) → refl } }
private
inℕ : F (λ _ → ℕ) tt → ℕ
inℕ (zero , u) = 0
inℕ (suc zero , u) = suc (u tt)
inℕ (suc (suc ()) , u)
ℕ-struct-iso : ℕ ≅ W ℕ-c tt
ℕ-struct-iso = iso f g α β
where
f : ℕ → W ℕ-c tt
f 0 = sup (# 0) (λ ())
f (suc n) = sup (# 1) (λ _ → f n)
g : W ℕ-c tt → ℕ
g = fold ℕ-c (λ i → inℕ) tt
α : (n : ℕ) → g (f n) ≡ n
α zero = refl
α (suc n) = ap suc (α n)
β : (n : W ℕ-c tt) → f (g n) ≡ n
β (sup zero u) = ap (sup zero) (funext λ ())
β (sup (suc zero) u) = ap (sup (# 1)) (funext (λ x → β (u tt)))
β (sup (suc (suc ())) u)
private
F-struct-iso : ∀ {i}(X : ⊤ → Set i) → F X tt ≅ (⊤ ⊎ X tt)
F-struct-iso X = begin
( Σ (A tt) λ a → B a → X tt )
≅⟨ sym≅ (⊎-Σ-iso (λ a → B a → X tt)) ⟩
( (⊥ → X tt) ⊎ (⊤ → X tt) )
≅⟨ ⊎-ap-iso (contr-⊤-iso ⊥-initial) Π-left-unit ⟩
( ⊤ ⊎ X tt )
∎
where open ≅-Reasoning
ℕ-initial : ∀ {i} (X : ℕ → Set i)
→ (x₀ : X 0)(f : ∀ n → X n → X (suc n))
→ contr ( Σ ((n : ℕ) → X n) λ x
→ (x₀ ≡ x 0)
× (∀ n → f n (x n) ≡ x (suc n)) )
ℕ-initial X x₀ f = iso-level ℕ-alg-iso (W-section-contr ℕ-c 𝓧)
where
ψ : ∀ x → ((b : B (proj₁ x)) → X (proj₂ x b)) → X (inℕ x)
ψ (zero , u) v = x₀
ψ (suc zero , u) v = f (u tt) (v tt)
ψ (suc (suc ()) , u) v
P : ∀ i (n : W ℕ-c i) → Set _
P i n = X (invert ℕ-struct-iso n)
θ : ∀ i x → ((b : B (proj₁ x)) → P tt (proj₂ x b)) → P i (inW ℕ-c i x)
θ i (a , u) v = ψ (a , invert ℕ-struct-iso ∘' u) v
𝓧 : AlgFib ℕ-c _
𝓧 = P , θ
ℕ-alg-iso : AlgSection ℕ-c 𝓧 ≅
( Σ ((n : ℕ) → X n) λ x
→ (x₀ ≡ x 0)
× (∀ n → f n (x n) ≡ x (suc n)) )
ℕ-alg-iso = begin
AlgSection ℕ-c 𝓧
≅⟨ ( Σ-ap-iso Π-left-unit λ g → iso≡ Π-left-unit) ⟩
( Σ ((w : W ℕ-c tt) → P tt w) λ g
→ ( _≡_ {A = (x : F (W ℕ-c) tt) → P tt (inW ℕ-c tt x)}
(λ x → θ tt x (λ b → g (proj₂ x b)))
(λ x → g (inW ℕ-c tt x)) ) )
≅⟨ sym≅ ( Σ-ap-iso (Π-ap-iso ℕ-struct-iso λ _ → refl≅) λ g
→ iso≡ (Π-ap-iso (sym≅ (F-ap-iso (λ i → sym≅ ℕ-struct-iso) tt)) λ x
→ refl≅ ) ) ⟩
( Σ ((n : ℕ) → X n) λ g
→ ( _≡_ {A = (x : F (λ _ → ℕ) tt) → X (inℕ x)}
(λ x → ψ x (λ b → g (proj₂ x b)))
(λ x → g (inℕ x)) ) )
≅⟨ ( Σ-ap-iso refl≅ λ g
→ iso≡ (Π-ap-iso (F-struct-iso (λ _ → ℕ)) λ _ → refl≅) ) ⟩
( let φ = invert (F-struct-iso (λ _ → ℕ))
in Σ ((n : ℕ) → X n) λ g
→ ( _≡_ {A = (x : ⊤ ⊎ ℕ) → X (inℕ (φ x))}
(λ x → ψ (φ x) (λ b → g (proj₂ (φ x) b)))
(λ x → g (inℕ (φ x))) ) )
≅⟨ ( Σ-ap-iso refl≅ λ x → iso≡ ⊎-universal ) ⟩
( Σ ((n : ℕ) → X n) λ x
→ ( _≡_ {A = (⊤ → X 0) × ((n : ℕ) → X (suc n))}
((λ _ → x₀) , (λ n → f n (x n)))
((λ _ → x 0) , (λ n → x (suc n))) ) )
≅⟨ ( Σ-ap-iso refl≅ λ x → sym≅ ×-split-iso ) ⟩
( Σ ((n : ℕ) → X n) λ x
→ (_≡_ {A = ⊤ → X 0} (λ _ → x₀) (λ _ → x 0))
× (_≡_ {A = (n : ℕ) → X (suc n)} (λ n → f n (x n)) (λ n → x (suc n))) )
≅⟨ ( Σ-ap-iso refl≅ λ x → ×-ap-iso (iso≡ Π-left-unit) (sym≅ strong-funext-iso) ) ⟩
( Σ ((n : ℕ) → X n) λ x
→ (x₀ ≡ x 0)
× (∀ n → f n (x n) ≡ x (suc n)) )
∎
where
open ≅-Reasoning
ℕ-initial-simple : ∀ {i} {X : Set i} (x₀ : X)
→ contr ( Σ (ℕ → X) λ x
→ (x₀ ≡ x 0)
× (∀ n → x n ≡ x (suc n)) )
ℕ-initial-simple {X = X} x₀
= ((λ _ → x₀) , refl , λ _ → refl)
, (λ u → contr⇒prop (ℕ-initial (λ _ → X) x₀ (λ _ x → x)) _ u)
ℕ-elim-shift : ∀ {i}{X : ℕ → Set i}
→ ((n : ℕ) → X n)
≅ ( (X 0) × ((n : ℕ) → X (suc n)) )
ℕ-elim-shift {i}{X} = begin
((n : ℕ) → X n)
≅⟨ (Π-ap-iso (sym≅ ℕ-algebra-iso) λ _ → refl≅) ⟩
((n : ⊤ ⊎ ℕ) → X (apply ℕ-algebra-iso n))
≅⟨ ⊎-universal ⟩
((⊤ → X 0) × ((n : ℕ) → X (suc n)))
≅⟨ ×-ap-iso Π-left-unit refl≅ ⟩
(X 0 × ((n : ℕ) → X (suc n)))
∎
where
open ≅-Reasoning