{-# OPTIONS --safe --postfix-projections #-} module Cubical.Data.FinSet.Binary.Small.Properties where open import Cubical.Foundations.Equiv open import Cubical.Foundations.Function open import Cubical.Foundations.HLevels open import Cubical.Foundations.Isomorphism open import Cubical.Foundations.Prelude open import Cubical.Foundations.Transport open import Cubical.Foundations.Univalence open import Cubical.Functions.Embedding open import Cubical.Functions.Involution open import Cubical.Data.Sigma open import Cubical.HITs.PropositionalTruncation open import Cubical.Data.FinSet.Binary.Small.Base open import Cubical.Data.Bool import Cubical.Data.FinSet.Binary.Large as FS open FS using (isBinary) open import Cubical.Foundations.Univalence.Universe Binary El un (λ _ → refl) private variable ℓ : Level B : Type ℓ isBinaryEl : ∀ b → isBinary (El b) isBinaryEl ℕ₂ = ∣ idEquiv Bool ∣₁ isBinaryEl (un b c e i) = squash₁ (transp (λ j → ∥ Bool ≃ ua e (i ∧ j) ∥₁) (~ i) (isBinaryEl b)) (transp (λ j → ∥ Bool ≃ ua e (i ∨ ~ j) ∥₁) i (isBinaryEl c)) i isBinaryEl' : ∀ ℓ b → isBinary (Lift {j = ℓ} (El b)) isBinaryEl' ℓ ℕ₂ = ∣ LiftEquiv ∣₁ isBinaryEl' ℓ (un b c e i) = squash₁ (transp (λ j → ∥ Bool ≃ Lift {j = ℓ} (ua e (i ∧ j)) ∥₁) (~ i) (isBinaryEl' ℓ b)) (transp (λ j → ∥ Bool ≃ Lift {j = ℓ} (ua e (i ∨ ~ j)) ∥₁) i (isBinaryEl' ℓ c)) i isPropIsSetEl : isOfHLevelDep 1 (λ b → isSet (El b)) isPropIsSetEl = isOfHLevel→isOfHLevelDep 1 (λ b → isPropIsSet) isSetEl : ∀ b → isSet (El b) isSetEl ℕ₂ = isSetBool isSetEl (un b c e i) = isPropIsSetEl (isSetEl b) (isSetEl c) (un b c e) i isGroupoidBinary : isGroupoid Binary isGroupoidBinary b c = isOfHLevelRetract 2 fun inv leftInv sub where open Iso (pathIso b c) sub : isSet (El b ≡ El c) sub = isOfHLevel≡ 2 (isSetEl b) (isSetEl c) module Reflection where bigger : Binary → FS.Binary _ bigger b = El b , isBinaryEl b open Iso lemma : ∀(B : Type₀) → ∥ Bool ≃ B ∥₁ → Σ[ b ∈ Binary ] El b ≃ B lemma B = rec Sprp (_,_ ℕ₂) where Fprp : isProp (fiber El B) Fprp = isEmbedding→hasPropFibers isEmbeddingEl B Sprp : isProp (Σ[ b ∈ Binary ] El b ≃ B) Sprp = isOfHLevelRetract 1 (map-snd ua) (map-snd pathToEquiv) (λ{ (A , e) → ΣPathP (refl , pathToEquiv-ua e) }) Fprp smaller : FS.Binary ℓ-zero → Binary smaller (B , tp) = lemma B tp .fst bigger-smaller : ∀ p → bigger (smaller p) ≡ p bigger-smaller (B , tp) = ΣPathP (b≡B , ∥∥-isPropDep (λ B → Bool ≃ B) (isBinaryEl b) tp b≡B) where b = smaller (B , tp) b≡B = ua (lemma B tp .snd) smaller-bigger : ∀ b → smaller (bigger b) ≡ b smaller-bigger b = equivIso _ _ .inv (lemma (El b) (isBinaryEl b) .snd) reflectIso : Iso Binary (FS.Binary ℓ-zero) reflectIso .fun = bigger reflectIso .inv = smaller reflectIso .rightInv = bigger-smaller reflectIso .leftInv = smaller-bigger reflect : Binary ≃ FS.Binary ℓ-zero reflect = isoToEquiv Reflection.reflectIso structureᵤ : FS.BinStructure Binary structureᵤ = λ where .base → bs .base .lower .loop i → bs .loop i .lower .loop² i j → bs .loop² i j .lower .trunc → isGroupoidBinary where open FS.BinStructure path : Lift Binary ≡ FS.Binary _ path = ua (compEquiv (invEquiv LiftEquiv) reflect) bs : FS.BinStructure (Lift Binary) bs = subst⁻ FS.BinStructure path FS.structure₀