{-# OPTIONS --safe #-} module Cubical.HITs.Delooping.Two.Properties where open import Cubical.Functions.Involution open import Cubical.Foundations.Equiv open import Cubical.Foundations.Function open import Cubical.Foundations.Isomorphism open import Cubical.Foundations.HLevels open import Cubical.Foundations.Prelude open import Cubical.Foundations.Univalence open import Cubical.Data.Bool open import Cubical.Data.Empty open import Cubical.Data.Unit open import Cubical.HITs.Delooping.Two.Base open import Cubical.HITs.PropositionalTruncation private variable ℓ : Level module Embed where isPropDepIsSet : isOfHLevelDep {ℓ' = ℓ} 1 isSet isPropDepIsSet = isOfHLevel→isOfHLevelDep 1 (λ _ → isPropIsSet) notSet : PathP (λ i → isSet (notEq i)) isSetBool isSetBool notSet = isPropDepIsSet isSetBool isSetBool notEq notNot² : Square notEq refl refl notEq notNot² = involPath² notnot notNotSet : SquareP (λ i j → isSet (notNot² i j)) notSet refl refl notSet notNotSet = isPropDep→isSetDep' isPropDepIsSet (involPath² notnot) notSet refl refl notSet Code : Bℤ₂ → hSet ℓ-zero Code = Elim.rec (Bool , isSetBool) (λ i → notEq i , notSet i) (λ i j → λ where .fst → notNot² i j .snd → notNotSet i j) (isOfHLevelTypeOfHLevel 2) El : Bℤ₂ → Type₀ El b = Code b .fst module BINARY where open import Cubical.Data.FinSet.Binary.Large sem : Bℤ₂ → Binary _ sem = Elim.rec Base Loop Loop² isGroupoidBinary loop? : Bool → base ≡ base loop? false = refl loop? true = loop Loop²-coh : (a b c : Bool) → Type₀ Loop²-coh false false false = Unit Loop²-coh false true true = Unit Loop²-coh true false true = Unit Loop²-coh true true false = Unit Loop²-coh _ _ _ = ⊥ rf : Bool ≡ Bool → Bool rf P = transport P false Loop²-coh-lemma₀ : ∀(p q r : Bool) → r ⊕ p ≡ q → Loop²-coh p q r Loop²-coh-lemma₀ false false false sq = _ Loop²-coh-lemma₀ false true true sq = _ Loop²-coh-lemma₀ true false true sq = _ Loop²-coh-lemma₀ true true false sq = _ Loop²-coh-lemma₀ false true false = false≢true Loop²-coh-lemma₀ false false true = true≢false Loop²-coh-lemma₀ true false false = true≢false Loop²-coh-lemma₀ true true true = false≢true Loop²-coh-lemma : ∀(P Q R : Bool ≡ Bool) → Square P Q refl R → Loop²-coh (rf P) (rf Q) (rf R) Loop²-coh-lemma P Q R sq = Loop²-coh-lemma₀ p q r eqn where p = rf P q = rf Q r = rf R open BoolReflection cmp : P ∙ R ≡ Q cmp i j = hcomp (λ k → λ where (i = i0) → compPath-filler P R k j (i = i1) → Q j (j = i0) → Bool (j = i1) → R (i ∨ k)) (sq i j) rcmp : ⊕-Path (r ⊕ p) ≡ ⊕-Path q rcmp = ⊕-Path (r ⊕ p) ≡[ i ]⟨ ⊕-comp p r (~ i) ⟩ ⊕-Path p ∙ ⊕-Path r ≡[ i ]⟨ ⊕-complete P (~ i) ∙ ⊕-complete R (~ i) ⟩ P ∙ R ≡⟨ cmp ⟩ Q ≡⟨ ⊕-complete Q ⟩ ⊕-Path q ∎ open Iso eqn : r ⊕ p ≡ q eqn = transport (λ i → reflectIso .leftInv (r ⊕ p) i ≡ reflectIso .leftInv q i) (cong (reflectIso .inv) rcmp) loop²? : ∀ p q r → Loop²-coh p q r → Square (loop? p) (loop? q) refl (loop? r) loop²? false false false _ = refl loop²? false true true _ = λ i j → loop (i ∧ j) loop²? true false true _ = loop² loop²? true true false _ = refl module _ (B : Type₀) where based : (P : Bool ≃ B) → Bℤ₂ based _ = base pull₀ : (P Q : Bool ≃ B) → Bool ≡ Bool pull₀ P Q i = hcomp (λ k → λ where (i = i0) → ua P (~ k) (i = i1) → ua Q (~ k)) B pull₁ : (P Q : Bool ≃ B) → Square (ua P) (ua Q) (pull₀ P Q) refl pull₁ P Q i j = hcomp (λ k → λ where (i = i0) → ua P (~ k ∨ j) (i = i1) → ua Q (~ k ∨ j) (j = i1) → B) B pull₂ : (P Q R : Bool ≃ B) → Square (pull₀ P Q) (pull₀ P R) refl (pull₀ Q R) pull₂ P Q R i j = hcomp (λ k → λ where (j = i0) → ua P (~ k) (i = i0) (j = i1) → ua Q (~ k) (i = i1) (j = i1) → ua R (~ k)) B pull₃ : (P Q R : Bool ≃ B) → Cube (pull₁ P Q) (pull₁ P R) (λ _ → ua P) (pull₁ Q R) (pull₂ P Q R) (λ _ _ → B) pull₃ P Q R i j k = hcomp (λ τ → λ where (j = i0) → ua P (~ τ ∨ k) (i = i0) (j = i1) → ua Q (~ τ ∨ k) (i = i1) (j = i1) → ua R (~ τ ∨ k) (k = i1) → B) B looped : (P Q : Bool ≃ B) → based P ≡ based Q looped P Q = loop? b where b : Bool b = rf (pull₀ P Q) looped² : (P Q R : Bool ≃ B) → Square (looped P Q) (looped P R) refl (looped Q R) looped² P Q R = loop²? pq pr qr pqr where pq = rf (pull₀ P Q) pr = rf (pull₀ P R) qr = rf (pull₀ Q R) pqr : Loop²-coh pq pr qr pqr = Loop²-coh-lemma (pull₀ P Q) (pull₀ P R) (pull₀ Q R) (pull₂ P Q R) syn : Binary _ → Bℤ₂ syn (B , tP) = rec→Gpd trunc (based B) 3k tP where open 3-Constant 3k : 3-Constant (based B) 3k .link = looped B 3k .coh₁ = looped² B