{-# OPTIONS --safe #-} module Data.Sigma.Properties where open import Cubical.Data.Sigma.Properties using (Σ≡Prop; discreteΣ; PathPΣ; ΣPathP) renaming (Σ-swap-Iso to ⇔-Σ-swap; Σ-assoc-Iso to ⇔-Σ-assoc) public open import Function open import Level open import Data.Sigma open import Isomorphism open import Path open import Cubical.Foundations.Everything using (substRefl; subst-filler) open import HLevels Π⟨Σ⟩ : (A : Type a) → (P : A → Type p) → Type (a ℓ⊔ p) Π⟨Σ⟩ A P = Σ[ f ⦂ (A → Σ A P) ] × ∀ x → f x .fst ≡ x module _ {P : A → Type p} (set : isSet A) where Π⇔Σ : ((x : A) → P x) ⇔ Π⟨Σ⟩ A P Π⇔Σ .fun f .fst x .fst = x Π⇔Σ .fun f .fst x .snd = f x Π⇔Σ .fun f .snd _ = refl Π⇔Σ .inv (f , p) x = subst P (p x) (f x .snd) Π⇔Σ .leftInv f = funExt λ x → substRefl {B = P} (f x) Π⇔Σ .rightInv (f , p) = Σ≡Prop (λ _ → isPropΠ λ _ → set _ _) (sym (funExt λ x → cong₂ _,_ (p x) (subst-filler P (p x) (f x .snd)))) ∃!Prop : isSet A → ((x : A) → isProp (P x)) → isProp (∃! P) ∃!Prop set prop (x , Px , !x) (y , Py , !y) = Σ≡Prop (λ x′ → isProp× (prop x′) (isPropΠ λ y′ → isProp→ (set x′ y′))) (!x y Py)