{-# OPTIONS --safe #-}
module HITs.SetQuotients where
open import Cubical.HITs.SetQuotients
using (eq/; squash/; [_]; _/_)
renaming (rec to rec/; elimProp to elimProp/; elim to elim/; effective to effective/)
public
open import Level
open import Cubical.Foundations.Everything using (isSet; isSetΠ; isProp; isPropΠ; isPropΠ2; Lift; lower; lift; isOfHLevelLift)
open import Path
open import Data.Sigma
import Cubical.Relation.Binary.Base
open Cubical.Relation.Binary.Base.BinaryRelation using (isPropValued; isEquivRel) public
private variable R S T : A → A → Type b
rec2/ : isSet C
→ (f : A → B → C)
→ (∀ a b c → R a b → f a c ≡ f b c)
→ (∀ a b c → S b c → f a b ≡ f a c)
→ A / R → B / S → C
rec2/ set f feql feqr =
rec/ (isSetΠ (λ _ → set))
(λ a → rec/ set (f a) (feqr a))
(λ a b r → funExt (elimProp/ (λ _ → set _ _) (λ c → feql a b c r)))
elimProp2/ : {P : A / R → B / S → Type c}
→ (∀ x y → isProp (P x y))
→ (∀ a b → P [ a ] [ b ])
→ ∀ x y → P x y
elimProp2/ prop f =
elimProp/ (λ x → isPropΠ (prop x)) λ a →
elimProp/ (prop [ a ]) (f a)
elimProp3/ : ∀ {ℓ} {P : A / R → B / S → C / T → Type ℓ}
→ (∀ x y z → isProp (P x y z))
→ (∀ a b c → P [ a ] [ b ] [ c ])
→ ∀ x y z → P x y z
elimProp3/ prop f =
elimProp/ (λ x → isPropΠ2 (prop x)) λ a →
elimProp2/ (prop [ a ]) (f a)
elimProp/-with : ∀ {a b ℓ ℓ'} {A : Type a} {R : A → A → Type b} {D : A / R → Type ℓ}
→ {P : (q : A / R) → D q → Type ℓ'}
→ (∀ (q : A / R) → (d : D q) → isProp (P q d))
→ (∀ (x : A) → (d : D [ x ]) → P [ x ] d)
→ ∀ (q : A / R) → (d : D q) → P q d
elimProp/-with {a = a} {b = b} {D = D} {P = P} prop f q d =
lower (elimProp/ {B = λ q → Lift {j = a ℓ⊔ b} ((d : D q) → P q d)}
(λ x → isOfHLevelLift 1 (isPropΠ (prop x)))
(λ a → lift (f a)) q) d
open import Function
open import HITs.PropositionalTruncation
open import HLevels
module _ {A : Type a} {_~_ : A → A → Type b} where
[]-surj : Surjective ([_] {A = A} {R = _~_})
[]-surj =
elim/
(λ _ → isProp→isSet squash)
(λ x → ∣ x , refl ∣ )
λ x y r →
J (λ z p → ∀ pr → PathP (λ i → ∥ Fibre [_] (p i) ∥) ∣ x , refl ∣ ∣ y , pr ∣)
(λ _ → squash _ _)
(eq/ _ _ r)
refl
open import Data.Unit
open import Isomorphism
Canon : (A : Type a) {B : Type b} → (A → B) → Type _
Canon A f = A / λ x y → f x ≡ f y
canon : isSet B → (f : A → B) → Canon A f → B
canon set f = rec/ set f λ _ _ → id
/⊤⇔∥∥ : A / (λ _ _ → ⊤) ⇔ ∥ A ∥
/⊤⇔∥∥ .fun = rec/ (isProp→isSet squash) ∣_∣ λ _ _ _ → squash _ _
/⊤⇔∥∥ .inv = ∥rec∥ (elimProp2/ squash/ λ x y → eq/ x y tt) [_]
/⊤⇔∥∥ .rightInv x = squash _ _
/⊤⇔∥∥ .leftInv = elimProp/ (λ _ → squash/ _ _) λ _ → refl