@@ -10,13 +10,18 @@ This file contains:
1010
1111- Ganea's theorem
1212
13+ - eliminator and recursor for join
14+ - Join is contractible if either side is contractible
15+ - Join is prop if both sides are prop
16+
1317-}
1418
1519
1620module Cubical.HITs.Join.Properties where
1721
1822open import Cubical.Foundations.Prelude
1923open import Cubical.Foundations.Equiv
24+ open import Cubical.Foundations.HLevels
2025open import Cubical.Foundations.Isomorphism
2126open import Cubical.Foundations.GroupoidLaws
2227open import Cubical.Foundations.Function
@@ -27,13 +32,13 @@ open import Cubical.Data.Sigma renaming (fst to proj₁; snd to proj₂)
2732open import Cubical.Data.Unit
2833
2934open import Cubical.HITs.Join.Base
30- open import Cubical.HITs.Pushout
35+ open import Cubical.HITs.Pushout hiding (elimProp)
3136
3237open import Cubical.Homotopy.Loopspace
3338
3439private
3540 variable
36- ℓ ℓ' : Level
41+ ℓ ℓ' ℓ'' : Level
3742
3843-- the inclusion maps are null-homotopic
3944join-inl-null : {X : Pointed ℓ} {Y : Pointed ℓ'} (x : typ X)
@@ -711,3 +716,48 @@ module _ {A : Pointed ℓ} {B : Pointed ℓ'} (f : A →∙ B) where
711716 inv GaneaIso = join→GaneaFib
712717 sec GaneaIso = join→GaneaFib→join
713718 ret GaneaIso = GaneaFib→join→GaneaFib
719+
720+ -- Characterizing when Join isContr, isProp
721+ module _ {A : Type ℓ}{B : Type ℓ'} where
722+ elim : {C : join A B → Type ℓ''}
723+ → (l : (a : A) → C (inl a))
724+ → (r : (b : B) → C (inr b))
725+ → (p : ∀ a b → PathP (λ i → C (push a b i)) (l a) (r b))
726+ → ∀ j → C j
727+ elim l r p (inl a) = l a
728+ elim l r p (inr b) = r b
729+ elim l r p (push a b i) = p a b i
730+
731+ elimProp : {C : join A B → Type ℓ''} (isPropC : ∀ j → isProp (C j))
732+ → (l : (a : A) → C (inl a))
733+ → (r : (b : B) → C (inr b))
734+ → ∀ j → C j
735+ elimProp isPropC l r = elim l r (λ a b →
736+ isProp→PathP (λ i → isPropC (push a b i)) (l a) (r b))
737+
738+ isContrJoinL : isContr A → isContr (join A B)
739+ isContrJoinL isContrA .proj₁ = inl (isContrA .proj₁)
740+ isContrJoinL isContrA .proj₂ (inl a) = cong inl (isContrA .proj₂ a)
741+ isContrJoinL isContrA .proj₂ (inr b) = push (isContrA .proj₁) b
742+ isContrJoinL isContrA .proj₂ (push a b i) j = hcomp (λ where
743+ k (i = i0) → inl (isContrA .proj₂ a (~ k ∨ j))
744+ k (i = i1) → push (isContrA .snd a (~ k)) b j
745+ k (j = i0) → inl (isContrA .proj₂ a (~ k))
746+ k (j = i1) → push a b i)
747+ (push a b (i ∧ j))
748+ isContrJoinR : isContr B → isContr (join A B)
749+ isContrJoinR isContrB .proj₁ = inr (isContrB .proj₁)
750+ isContrJoinR isContrB .snd (inl a) = sym $ push a (isContrB .proj₁)
751+ isContrJoinR isContrB .snd (inr b) = cong inr (isContrB .proj₂ b)
752+ isContrJoinR isContrB .snd (push a b i) j = hcomp (λ where
753+ k (i = i0) → push a (isContrB .snd b (~ k)) (~ j)
754+ k (i = i1) → inr (isContrB .snd b (~ k ∨ j))
755+ k (j = i0) → inr (isContrB .snd b (~ k))
756+ k (j = i1) → push a b i)
757+ (push a b (i ∨ (~ j)))
758+
759+ isPropJoin : isProp A → isProp B → isProp (join A B)
760+ isPropJoin isPropA isPropB = isContrIfInhabited→isProp (elimProp
761+ (λ _ → isPropIsContr)
762+ (λ a → isContrJoinL (inhProp→isContr a isPropA))
763+ (λ b → isContrJoinR (inhProp→isContr b isPropB)))
0 commit comments