Alice Laroche , 26th September 2023
\begin{code}
{-# OPTIONS --safe --without-K --exact-split #-}
open import MLTT.Spartan
open import UF.Base
open import UF.DiscreteAndSeparated
open import UF.Embeddings
open import UF.Sets
open import UF.Subsingletons
open import UF.Univalence
open import W.Type
module Iterative.Finite
(ua : Univalence)
(𝓤 : Universe)
where
open import Iterative.Multisets 𝓤
open import Iterative.Multisets-Addendum ua 𝓤
open import Iterative.Sets ua 𝓤
open import Iterative.Sets-Addendum ua 𝓤
open import Iterative.Ordinals ua 𝓤
𝟘ⱽ-is-transitive-iset : is-transitive-iset 𝟘ⱽ
𝟘ⱽ-is-transitive-iset v₁ v₂ v₁⁅𝟘ⱽ = 𝟘-elim (pr₁ v₁⁅𝟘ⱽ)
𝟘ⱽ-has-transitive-members : has-transitive-members 𝟘ⱽ
𝟘ⱽ-has-transitive-members v₁ v₁⁅𝟘ⱽ = 𝟘-elim (pr₁ v₁⁅𝟘ⱽ)
𝟘ⱽ-is-iordinal : is-iterative-ordinal 𝟘ⱽ
𝟘ⱽ-is-iordinal = 𝟘ⱽ-is-transitive-iset , 𝟘ⱽ-has-transitive-members
𝟘ᴼ : 𝕆
𝟘ᴼ = 𝟘ⱽ , 𝟘ⱽ-is-iordinal
𝟙ⱽ-is-transitive-iset : is-transitive-iset 𝟙ⱽ
𝟙ⱽ-is-transitive-iset v₁ v₂ (⋆ , p) (b , q) =
⋆ , 𝟘-elim (transport (𝕄-root) (p ⁻¹) b)
𝟙ⱽ-has-transitive-members : has-transitive-members 𝟙ⱽ
𝟙ⱽ-has-transitive-members v₁ (⋆ , p) = II
where
I : 𝟘ⱽ = v₁
I = to-subtype-= being-iset-is-prop p
II : is-transitive-iset v₁
II = transport is-transitive-iset I 𝟘ⱽ-is-transitive-iset
𝟙ⱽ-is-iordinal : is-iterative-ordinal 𝟙ⱽ
𝟙ⱽ-is-iordinal = 𝟙ⱽ-is-transitive-iset , 𝟙ⱽ-has-transitive-members
𝟙ᴼ : 𝕆
𝟙ᴼ = 𝟙ⱽ , 𝟙ⱽ-is-iordinal
⁅-is-irreflexive : (M : 𝕄) → ¬ (M ⁅ M)
⁅-is-irreflexive (ssup X φ) (x , eq) =
⁅-is-irreflexive (φ x) (y , eq')
where
y : 𝕄-root (φ x)
y = transport⁻¹ 𝕄-root eq x
eq' : 𝕄-forest (φ x) y = φ x
eq' = transportd 𝕄-root (λ -₁ -₂ → 𝕄-forest -₁ -₂ = -₁) x (eq ⁻¹) eq
succᴹ : 𝕄 → 𝕄
succᴹ M = ssup (𝕄-root M + 𝟙 {𝓤}) (cases (𝕄-forest M) (λ ⋆ → M))
ℕ-to-𝕄 : ℕ → 𝕄
ℕ-to-𝕄 0 = 𝟘ᴹ
ℕ-to-𝕄 (succ n) = succᴹ (ℕ-to-𝕄 n)
succᴹ-preserves-iset : (M : 𝕄)
→ is-iterative-set M
→ is-iterative-set (succᴹ M)
succᴹ-preserves-iset M is-iset = III , IV
where
I : is-h-isolated M
I = isets-are-h-isolated M is-iset
II : is-embedding (λ _ → M)
II = global-point-is-embedding (λ _ → M) I
III : is-embedding (𝕄-forest (succᴹ M))
III = disjoint-cases-embedding _ _
(𝕄-forest-is-embedding M is-iset)
II
(λ x ⋆ eq → ⁅-is-irreflexive M (x , eq))
IV : (x : 𝕄-root (succᴹ M)) → is-iterative-set (𝕄-forest (succᴹ M) x)
IV = dep-cases (𝕄-subtrees-are-iterative M is-iset) (λ ⋆ → is-iset)
ℕ-to-𝕄-gives-iset : (n : ℕ) → is-iterative-set (ℕ-to-𝕄 n)
ℕ-to-𝕄-gives-iset zero = 𝟘ᴹ-is-iset
ℕ-to-𝕄-gives-iset (succ n) = succᴹ-preserves-iset
(ℕ-to-𝕄 n)
(ℕ-to-𝕄-gives-iset n)
succⱽ : 𝕍 → 𝕍
succⱽ (M , M-is-iset) = succᴹ M , succᴹ-preserves-iset M M-is-iset
ℕ-to-𝕍 : ℕ → 𝕍
ℕ-to-𝕍 n = ℕ-to-𝕄 n , ℕ-to-𝕄-gives-iset n
succⱽ-preserves-∈ : (A B : 𝕍) → A ∈ B → A ∈ succⱽ B
succⱽ-preserves-∈ A B (x , p) = inl x , p
succⱽ-preserves-transitivity : (A : 𝕍)
→ is-transitive-iset A
→ is-transitive-iset (succⱽ A)
succⱽ-preserves-transitivity A is-tiset B C B∈succA C∈B = II
where
I : B ∈ succⱽ A → C ∈ A
I (inr ⋆ , p) = transport⁻¹ _ p C∈B
I (inl x , p) = is-tiset B C (x , p) C∈B
II : C ∈ succⱽ A
II = succⱽ-preserves-∈ C A (I B∈succA)
succⱽ-preserves-members-transitivity : (A : 𝕍)
→ is-iterative-ordinal A
→ has-transitive-members (succⱽ A)
succⱽ-preserves-members-transitivity A is-iord B t = II t
where
I : underlying-mset A = underlying-mset B → A = B
I p = to-subtype-= being-iset-is-prop p
II : B ∈ succⱽ A → is-transitive-iset B
II (inr ⋆ , p) =
transport is-transitive-iset (I p) (iordinals-are-transitive A is-iord)
II (inl x , p) =
members-of-iordinals-are-transitive A is-iord B (x , p)
succⱽ-preserves-iordinal : (A : 𝕍)
→ is-iterative-ordinal A
→ is-iterative-ordinal (succⱽ A)
succⱽ-preserves-iordinal A is-iord = I , II
where
I : is-transitive-iset (succⱽ A)
I = succⱽ-preserves-transitivity A (iordinals-are-transitive A is-iord)
II : has-transitive-members (succⱽ A)
II = succⱽ-preserves-members-transitivity A is-iord
ℕ-to-𝕍-gives-iordinal : (n : ℕ) → is-iterative-ordinal (ℕ-to-𝕍 n)
ℕ-to-𝕍-gives-iordinal zero = 𝟘ⱽ-is-iordinal
ℕ-to-𝕍-gives-iordinal (succ n) =
succⱽ-preserves-iordinal (ℕ-to-𝕍 n) (ℕ-to-𝕍-gives-iordinal n)
ℕ-to-𝕆 : ℕ → 𝕆
ℕ-to-𝕆 n = ℕ-to-𝕍 n , ℕ-to-𝕍-gives-iordinal n
\end{code}