{-# OPTIONS --cubical #-} open import ContainersPlus open import MndContainer as MC open MC.MndContainer open IsMndContainer open import MndDistributiveLaw as MDL open MDL.MndDistributiveLaw open import Level renaming (suc to lsuc ; zero to lzero) open import Function open import Cubical.Foundations.Prelude hiding (_◁_) open import Cubical.Foundations.Isomorphism open import Cubical.Foundations.Transport open import Cubical.Data.Nat open import Cubical.Data.Fin open import Cubical.Data.Sigma renaming (fst to π₁ ; snd to π₂) open import Cubical.Data.Sum open import Cubical.Data.Empty renaming (rec to rec⊥ ; rec* to rec⊥*) open import Cubical.Relation.Nullary module NoGoTheorem where ConstantShape : (ℓs ℓp : Level) (S : Set ℓs) (P : S → Set ℓp) (s : S) → Set (lsuc ℓp) ConstantShape _ _ S P s = P s ≡ ⊥* record S3Property (ℓs ℓp : Level) (S : Set ℓs) (P : S → Set ℓp) (Aₘ : MndContainer _ _ (S ◁ P)) (s : S) (f : P s → S) : Set (lsuc (ℓs ⊔ ℓp)) where field posInhabited : NonEmpty (P s) decEq : Discrete (P s) s3Shape : (p : P s) → σ Aₘ s (λ p' → case (ι Aₘ) (f p') (decEq p' p)) ≡ ι Aₘ s3Pos : (p : P s) → PathP (λ i → P (s3Shape p i) → P s) (λ p' → pr₁ Aₘ _ _ p') (λ p' → p) open S3Property compositeS3 : (ℓs ℓp : Level) (S : Set ℓs) (P : S → Set ℓp) (Aₘ : MndContainer _ _ (S ◁ P)) (s : S) (f : P s → S) (s3 : S3Property _ _ S P Aₘ s f) (T : Set ℓs) (Q : T → Set ℓp) (Bₘ : MndContainer _ _ (T ◁ Q)) (distr : MndDistributiveLaw _ _ S P T Q Aₘ Bₘ) (t : T) (p : P s) → u₁ distr s (λ p' → case t (ι Bₘ) (decEq s3 p' p)) ≡ t compositeS3 ℓs ℓp S P Aₘ s f s3 T Q Bₘ distr t p = step₁ ∙ step₂ ∙ step₃ ∙ step₄ ∙ step₅ ∙ unit-ιA-shape₁ distr t where step₁ : u₁ distr s (λ p' → case t (ι Bₘ) (decEq s3 p' p)) ≡ u₁ distr s (λ p' → case (u₁ distr (ι Aₘ) (λ _ → t)) (u₁ distr (f p') (λ _ → ι Bₘ)) (decEq s3 p' p)) step₁ i = u₁ distr s (λ p' → case (unit-ιA-shape₁ distr t (~ i)) (unit-ιB-shape₁ distr (f p') (~ i)) (decEq s3 p' p)) step₂ : u₁ distr s (λ p' → case (u₁ distr (ι Aₘ) (λ _ → t)) (u₁ distr (f p') (λ _ → ι Bₘ)) (decEq s3 p' p)) ≡ u₁ distr s (λ p' → u₁ distr (case (ι Aₘ) (f p') (decEq s3 p' p)) (const (case t (ι Bₘ) (decEq s3 p' p))) ) step₂ i = u₁ distr s (λ p' → (decLem₁ (decEq s3) (ι Aₘ) (f p') (const t) (const (ι Bₘ)) (u₁ distr) p' p ∙ cong (u₁ distr (case (ι Aₘ) (f p') (decEq s3 p' p))) (decLem₂ (decEq s3) _ _ _ _ p' p) ) i ) step₃ : u₁ distr s (λ p' → u₁ distr (case (ι Aₘ) (f p') (decEq s3 p' p)) (const (case t (ι Bₘ) (decEq s3 p' p))) ) ≡ u₁ distr (σ Aₘ s (λ p' → case (ι Aₘ) (f p') (decEq s3 p' p))) (λ p' → case t (ι Bₘ) (decEq s3 (pr₁ Aₘ _ _ p') p)) step₃ i = mul-A-shape₁ distr s (λ p' → case (ι Aₘ) (f p') (decEq s3 p' p)) (λ p₁ _ → case t (ι Bₘ) (decEq s3 p₁ p)) (~ i) step₄ : u₁ distr (σ Aₘ s (λ p' → case (ι Aₘ) (f p') (decEq s3 p' p))) (λ p' → case t (ι Bₘ) (decEq s3 (pr₁ Aₘ _ _ p') p)) ≡ u₁ distr (ι Aₘ) (λ p' → case t (ι Bₘ) (decEq s3 p p)) step₄ i = u₁ distr (s3Shape s3 p i) (λ p' → case t (ι Bₘ) (decEq s3 (s3Pos s3 p i p') p)) step₅ : u₁ distr (ι Aₘ) (λ p' → case t (ι Bₘ) (decEq s3 p p)) ≡ u₁ distr (ι Aₘ) (const t) step₅ i = u₁ distr (ι Aₘ) (λ p' → case t (ι Bₘ) (snd (decRefl (decEq s3) p) i)) module _ (ℓs ℓp : Level) (S : Set ℓs) (P : S → Set ℓp) (Aₘ : MndContainer _ _ (S ◁ P)) (s : S) (f : P s → S) (s3 : S3Property _ _ S P Aₘ s f) (T : Set ℓs) (Q : T → Set ℓp) (Bₘ : MndContainer _ _ (T ◁ Q)) (distr : MndDistributiveLaw _ _ S P T Q Aₘ Bₘ) where step₁ : (t t' : T) (constt : ConstantShape _ _ _ Q t) (p p' : P s) → σ Bₘ t (const (ι Bₘ)) ≡ σ Bₘ (u₁ distr s (λ y → case t (ι Bₘ) (decEq s3 y p))) (λ y → u₁ distr (u₂ distr s (λ z → case t (ι Bₘ) (decEq s3 z p)) y) (λ z → case t' (ι Bₘ) (decEq s3 (v₁ distr y z) p')) ) step₁ t t' constt p p' i = σ Bₘ (compositeS3 ℓs ℓp S P Aₘ s f s3 T Q Bₘ distr t p (~ i)) (toPathP {A = λ i → Q (compositeS3 ℓs ℓp S P Aₘ s f s3 T Q Bₘ distr t p (~ i)) → T} {x = const (ι Bₘ)} {y = λ y → u₁ distr (u₂ distr s (λ z → case t (ι Bₘ) (decEq s3 z p)) y) (λ z → case t' (ι Bₘ) (decEq s3 (v₁ distr y z) p')) } (transpFun {B = Q} _ _ (sym (compositeS3 ℓs ℓp S P Aₘ s f s3 T Q Bₘ distr t p)) (const (ι Bₘ)) ∙ funExt (λ x → rec⊥* (transport constt (subst⁻ Q (sym (compositeS3 ℓs ℓp S P Aₘ s f s3 T Q Bₘ distr t p)) x))) ) i ) step₂ : (t t' : T) (p p' : P s) → σ Bₘ (u₁ distr s (λ y → case t (ι Bₘ) (decEq s3 y p))) (λ y → u₁ distr (u₂ distr s (λ z → case t (ι Bₘ) (decEq s3 z p)) y) (λ z → case t' (ι Bₘ) (decEq s3 (v₁ distr y z) p')) ) ≡ u₁ distr s (λ y → σ Bₘ (case t (ι Bₘ) (decEq s3 y p)) (const (case t' (ι Bₘ) (decEq s3 y p')))) step₂ t t' p p' = sym (mul-B-shape₁ distr _ _ _) step₃Aux : (t t' : T) (p p' : P s) (pdist : ¬ (p ≡ p')) (y : P s) → σ Bₘ (case t (ι Bₘ) (decEq s3 y p)) (const (case t' (ι Bₘ) (decEq s3 y p'))) ≡ case t (case t' (ι Bₘ) (decEq s3 y p')) (decEq s3 y p) step₃Aux t t' p p' pdist y with decEq s3 y p | decEq s3 y p' ... | (yes e) | (yes e') = rec⊥ (pdist (sym e ∙ e')) ... | (yes e) | (no e') = unit-r (isMndContainer Bₘ) t ... | (no e) | (yes e') = unit-l (isMndContainer Bₘ) t' ... | (no e) | (no e') = unit-r (isMndContainer Bₘ) (ι Bₘ) step₃ : (t t' : T) (p p' : P s) (pdist : ¬ (p ≡ p')) → u₁ distr s (λ y → σ Bₘ (case t (ι Bₘ) (decEq s3 y p)) (const (case t' (ι Bₘ) (decEq s3 y p')))) ≡ u₁ distr s (λ y → case t (case t' (ι Bₘ) (decEq s3 y p')) (decEq s3 y p)) step₃ t t' p p' pdist i = u₁ distr s (λ y → step₃Aux t t' p p' pdist y i) mainLem : (t t' : T) (constt : ConstantShape _ _ _ Q t) (p p' : P s) (pdist : ¬ (p ≡ p')) → t ≡ u₁ distr s (λ y → case t (case t' (ι Bₘ) (decEq s3 y p')) (decEq s3 y p)) mainLem t t' constt p p' pdist = sym (unit-r (isMndContainer Bₘ) t) ∙ step₁ t t' constt p p' ∙ step₂ t t' p p' ∙ step₃ t t' p p' pdist noGoTheorem : (t t' : T) (tdist : ¬ (t ≡ t')) (constt : ConstantShape _ _ _ Q t) (constt' : ConstantShape _ _ _ Q t') (p p' : P s) (pdist : ¬ (p ≡ p')) → ⊥ noGoTheorem t t' tdist constt constt' p p' pdist = tdist (mainLem t t' constt p p' pdist ∙ aux ∙ sym (mainLem t' t constt' p' p (pdist ∘ sym)) ) where aux : u₁ distr s (λ y → case t (case t' (ι Bₘ) (decEq s3 y p')) (decEq s3 y p)) ≡ u₁ distr s (λ y → case t' (case t (ι Bₘ) (decEq s3 y p)) (decEq s3 y p')) aux i = u₁ distr s (λ y → decLem₃ (decEq s3) t t' (ι Bₘ) p p' y pdist i)