{-# OPTIONS --safe --postfix-projections #-}
module Cubical.Data.FinSet.Binary.Large where
open import Cubical.Functions.Embedding
open import Cubical.Functions.Involution
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Univalence
open import Cubical.Data.Bool
open import Cubical.Data.Sigma
open import Cubical.HITs.PropositionalTruncation
private
variable
ℓ : Level
isBinary : Type ℓ → Type ℓ
isBinary B = ∥ Bool ≃ B ∥₁
Binary : ∀ ℓ → Type _
Binary ℓ = Σ (Type ℓ) isBinary
isBinary→isSet : ∀{B : Type ℓ} → isBinary B → isSet B
isBinary→isSet {B} = rec isPropIsSet λ eqv → isOfHLevelRespectEquiv 2 eqv isSetBool
private
Σ≡Prop²
: ∀{ℓ ℓ'} {A : Type ℓ} {B : A → Type ℓ'}
→ {w x : Σ A B}
→ isOfHLevelDep 1 B
→ (p q : w ≡ x)
→ cong fst p ≡ cong fst q
→ p ≡ q
Σ≡Prop² _ _ _ r i j .fst = r i j
Σ≡Prop² {B = B} {w} {x} Bprp p q r i j .snd
= isPropDep→isSetDep Bprp (w .snd) (x .snd) (cong snd p) (cong snd q) r i j
BinaryEmbedding : isEmbedding (λ(B : Binary ℓ) → map-snd isBinary→isSet B)
BinaryEmbedding w x = isoToIsEquiv theIso
where
open Iso
f = map-snd isBinary→isSet
theIso : Iso (w ≡ x) (f w ≡ f x)
theIso .fun = cong f
theIso .inv p i .fst = p i .fst
theIso .inv p i .snd
= ∥∥-isPropDep (Bool ≃_) (w .snd) (x .snd) (λ i → p i .fst) i
theIso .rightInv p
= Σ≡Prop² (isOfHLevel→isOfHLevelDep 1 (λ _ → isPropIsSet)) _ p refl
theIso .leftInv p
= Σ≡Prop² (∥∥-isPropDep (Bool ≃_)) _ p refl
Base : Binary _
Base .fst = Bool
Base .snd = ∣ idEquiv Bool ∣₁
Loop : Base ≡ Base
Loop i .fst = notEq i
Loop i .snd = ∥∥-isPropDep (Bool ≃_) (Base .snd) (Base .snd) notEq i
private
notEq² : Square notEq refl refl notEq
notEq² = involPath² {f = not} notnot
Loop² : Square Loop refl refl Loop
Loop² i j .fst = notEq² i j
Loop² i j .snd
= isPropDep→isSetDep' (∥∥-isPropDep (Bool ≃_))
notEq² (cong snd Loop) refl refl (cong snd Loop) i j
isGroupoidBinary : isGroupoid (Binary ℓ)
isGroupoidBinary
= Embedding-into-hLevel→hLevel 2
(map-snd isBinary→isSet , BinaryEmbedding)
(isOfHLevelTypeOfHLevel 2)
record BinStructure (B : Type ℓ) : Type ℓ where
field
base : B
loop : base ≡ base
loop² : Square loop refl refl loop
trunc : isGroupoid B
structure₀ : BinStructure (Binary ℓ-zero)
structure₀ .BinStructure.base = Base
structure₀ .BinStructure.loop = Loop
structure₀ .BinStructure.loop² = Loop²
structure₀ .BinStructure.trunc = isGroupoidBinary
module Parameterized (B : Type ℓ) where
Baseᴾ : Bool ≃ B → Binary ℓ
Baseᴾ P = B , ∣ P ∣₁
Loopᴾ : (P Q : Bool ≃ B) → Baseᴾ P ≡ Baseᴾ Q
Loopᴾ P Q i = λ where
.fst → ua first i
.snd → ∥∥-isPropDep (Bool ≃_) ∣ P ∣₁ ∣ Q ∣₁ (ua first) i
where
first : B ≃ B
first = compEquiv (invEquiv P) Q
Loopᴾ² : (P Q R : Bool ≃ B) → Square (Loopᴾ P Q) (Loopᴾ P R) refl (Loopᴾ Q R)
Loopᴾ² P Q R i = Σ≡Prop (λ _ → squash₁) (S i)
where
PQ : B ≃ B
PQ = compEquiv (invEquiv P) Q
PR : B ≃ B
PR = compEquiv (invEquiv P) R
QR : B ≃ B
QR = compEquiv (invEquiv Q) R
Q-Q : Bool ≃ Bool
Q-Q = compEquiv Q (invEquiv Q)
PQRE : compEquiv PQ QR ≡ PR
PQRE = compEquiv PQ QR
≡[ i ]⟨ compEquiv-assoc (invEquiv P) Q QR (~ i) ⟩
compEquiv (invEquiv P) (compEquiv Q QR)
≡[ i ]⟨ compEquiv (invEquiv P) (compEquiv-assoc Q (invEquiv Q) R i) ⟩
compEquiv (invEquiv P) (compEquiv Q-Q R)
≡[ i ]⟨ compEquiv (invEquiv P) (compEquiv (invEquiv-is-rinv Q i) R) ⟩
compEquiv (invEquiv P) (compEquiv (idEquiv _) R)
≡[ i ]⟨ compEquiv (invEquiv P) (compEquivIdEquiv R i) ⟩
PR ∎
PQR : ua PQ ∙ ua QR ≡ ua PR
PQR = ua PQ ∙ ua QR
≡[ i ]⟨ uaCompEquiv PQ QR (~ i) ⟩
ua (compEquiv PQ QR)
≡⟨ cong ua PQRE ⟩
ua PR ∎
S : Square (ua PQ) (ua PR) refl (ua QR)
S i j
= hcomp (λ k → λ where
(j = i0) → B
(i = i0) → compPath-filler (ua PQ) (ua QR) (~ k) j
(i = i1) → ua PR j
(j = i1) → ua QR (i ∨ ~ k))
(PQR i j)