module Data.Set.Truncation whereSet truncationπ
Exactly analogously to the construction of propositional truncations, we can construct the set truncation of a type, reflecting it onto the subcategory of sets. Just like the propositional truncation is constructed by attaching enough lines to a type to hide away all information other than βis the type inhabitedβ, the set truncation is constructed by attaching enough square to kill off all homotopy groups.
data β₯_β₯β {β} (A : Type β) : Type β where
inc : A β β₯ A β₯β
squash : is-set β₯ A β₯βWe begin by defining the induction principle. The (family of) type(s)
we map into must be a set, as required by the squash constructor.
β₯-β₯β-elim
: β {β β'} {A : Type β} {B : β₯ A β₯β β Type β'}
β (β x β is-set (B x))
β (β x β B (inc x))
β β x β B x
β₯-β₯β-elim Bset binc (inc x) = binc x
β₯-β₯β-elim Bset binc (squash x y p q i j) =
is-setβsquarep (Ξ» i j β Bset (squash x y p q i j))
(Ξ» _ β g x) (Ξ» i β g (p i)) (Ξ» i β g (q i)) (Ξ» i β g y) i j
where g = β₯-β₯β-elim Bset binc
β₯-β₯β-rec
: β {β β'} {A : Type β} {B : Type β'} β is-set B
β (A β B) β β₯ A β₯β β B
β₯-β₯β-rec bset f (inc x) = f x
β₯-β₯β-rec bset f (squash x y p q i j) =
bset (go x) (go y) (Ξ» i β go (p i)) (Ξ» i β go (q i)) i j
where go = β₯-β₯β-rec bset finstance
Inductive-β₯β₯β
: β {β β' βm} {A : Type β} {P : β₯ A β₯β β Type β'} β¦ i : Inductive (β x β P (inc x)) βm β¦
β β¦ _ : β {x} β H-Level (P x) 2 β¦
β Inductive (β x β P x) βm
Inductive-β₯β₯β β¦ i β¦ = record
{ methods = i .Inductive.methods
; from = Ξ» f β β₯-β₯β-elim (Ξ» x β hlevel 2) (i .Inductive.from f)
}The most interesting result is that, since the sets form a reflective subcategory of
types, the set-truncation is an idempotent monad. Indeed, as required,
the counit inc is an
equivalence:
β₯-β₯β-idempotent : β {β} {A : Type β} β is-set A
β is-equiv (inc {A = A})
β₯-β₯β-idempotent {A = A} aset = is-isoβis-equiv (iso proj incβproj Ξ» _ β refl)
module β₯-β₯β-idempotent where
proj : β₯ A β₯β β A
proj (inc x) = x
proj (squash x y p q i j) =
aset (proj x) (proj y) (Ξ» i β proj (p i)) (Ξ» i β proj (q i)) i j
incβproj : (x : β₯ A β₯β) β inc (proj x) β‘ x
incβproj = β₯-β₯β-elim (Ξ» _ β is-propβis-set (squash _ _)) Ξ» _ β reflThe other definitions are entirely routine. We define functorial
actions of β₯_β₯β directly,
rather than using the eliminator, to avoid using is-setβsquarep.
β₯-β₯β-map : β {β β'} {A : Type β} {B : Type β'}
β (A β B) β β₯ A β₯β β β₯ B β₯β
β₯-β₯β-map f (inc x) = inc (f x)
β₯-β₯β-map f (squash x y p q i j) =
squash (β₯-β₯β-map f x) (β₯-β₯β-map f y)
(Ξ» i β β₯-β₯β-map f (p i))
(Ξ» i β β₯-β₯β-map f (q i))
i j
β₯-β₯β-mapβ : β {β β' β''} {A : Type β} {B : Type β'} {C : Type β''}
β (A β B β C) β β₯ A β₯β β β₯ B β₯β β β₯ C β₯β
β₯-β₯β-mapβ f (inc x) (inc y) = inc (f x y)
β₯-β₯β-mapβ f (squash x y p q i j) b =
squash (β₯-β₯β-mapβ f x b) (β₯-β₯β-mapβ f y b)
(Ξ» i β β₯-β₯β-mapβ f (p i) b)
(Ξ» i β β₯-β₯β-mapβ f (q i) b)
i j
β₯-β₯β-mapβ f a (squash x y p q i j) =
squash (β₯-β₯β-mapβ f a x) (β₯-β₯β-mapβ f a y)
(Ξ» i β β₯-β₯β-mapβ f a (p i))
(Ξ» i β β₯-β₯β-mapβ f a (q i))
i jPaths in the set truncationπ
β₯-β₯β-path-equiv
: β {β} {A : Type β} {x y : A}
β (β₯_β₯β.inc x β‘ β₯_β₯β.inc y) β β₯ x β‘ y β₯
β₯-β₯β-path-equiv {A = A} =
prop-ext (squash _ _) squash (encode _ _) (decode _ (inc _))
where
code : β x (y : β₯ A β₯β) β Prop _
code x = β₯-β₯β-elim (Ξ» y β hlevel 2) Ξ» y β el β₯ x β‘ y β₯ squash
encode : β x y β inc x β‘ y β β£ code x y β£
encode x y p = J (Ξ» y p β β£ code x y β£) (inc refl) p
decode : β x y β β£ code x y β£ β inc x β‘ y
decode x = β₯-β₯β-elim
(Ξ» _ β fun-is-hlevel 2 (is-propβis-set (squash _ _)))
Ξ» _ β β₯-β₯-rec (squash _ _) (ap inc)
module β₯-β₯β-path {β} {A : Type β} {x} {y}
= Equiv (β₯-β₯β-path-equiv {A = A} {x} {y})instance
H-Level-β₯-β₯β : β {β} {A : Type β} {n : Nat} β H-Level β₯ A β₯β (2 + n)
H-Level-β₯-β₯β {n = n} = basic-instance 2 squash
Map-β₯β₯β : Map (eff β₯_β₯β)
Map-β₯β₯β .Map.map = β₯-β₯β-map
Idiom-β₯β₯β : Idiom (eff β₯_β₯β)
Idiom-β₯β₯β .Idiom.pure = inc
Idiom-β₯β₯β .Idiom._<*>_ {A = A} {B = B} = go where
go : β₯ (A β B) β₯β β β₯ A β₯β β β₯ B β₯β
go (inc f) (inc x) = inc (f x)
go (inc f) (squash x y p q i j) = squash (go (inc f) x) (go (inc f) y) (Ξ» i β go (inc f) (p i)) (Ξ» i β go (inc f) (q i)) i j
go (squash f g p q i j) y = squash (go f y) (go g y) (Ξ» i β go (p i) y) (Ξ» i β go (q i) y) i j
Bind-β₯β₯β : Bind (eff β₯_β₯β)
Bind-β₯β₯β .Bind._>>=_ {A = A} {B = B} = go where
go : β₯ A β₯β β (A β β₯ B β₯β) β β₯ B β₯β
go (inc x) f = f x
go (squash x y p q i j) f = squash (go x f) (go y f) (Ξ» i β go (p i) f) (Ξ» i β go (q i) f) i j
is-contrββ₯-β₯β-is-contr : β {β} {A : Type β} β is-contr A β is-contr β₯ A β₯β
is-contrββ₯-β₯β-is-contr h = Equivβis-hlevel 0 ((_ , β₯-β₯β-idempotent (is-contrβis-set h)) eβ»ΒΉ) h
is-propββ₯-β₯β-is-prop : β {β} {A : Type β} β is-prop A β is-prop β₯ A β₯β
is-propββ₯-β₯β-is-prop h = Equivβis-hlevel 1 ((_ , β₯-β₯β-idempotent (is-propβis-set h)) eβ»ΒΉ) h
β₯-β₯β-ap : β {β β'} {A : Type β} {B : Type β'} β A β B β β₯ A β₯β β β₯ B β₯β
β₯-β₯β-ap e .fst = β₯-β₯β-map (e .fst)
β₯-β₯β-ap e .snd = is-isoβis-equiv Ξ» where
.is-iso.from β β₯-β₯β-map (Equiv.from e)
.is-iso.rinv β elim! Ξ» x β ap inc (Equiv.Ξ΅ e x)
.is-iso.linv β elim! Ξ» x β ap inc (Equiv.Ξ· e x)
instance
β₯-β₯β-homogeneous : β {β} {A : Type β} β β¦ _ : Homogeneous A β¦ β Homogeneous β₯ A β₯β
β₯-β₯β-homogeneous {A = A} β¦ h β¦ {x} {y} =
β₯-β₯β-elim {B = Ξ» x β β y β (β₯ A β₯β , x) β‘ (β₯ A β₯β , y)}
(Ξ» _ β Ξ -is-hlevel 2 Ξ» _ β Typeβ-path-is-hlevel 1)
(Ξ» x β β₯-β₯β-elim
(Ξ» _ β Typeβ-path-is-hlevel 1)
(Ξ» y β let e , pt = pathβequivβ h
in uaβ (β₯-β₯β-ap e , ap β₯_β₯β.inc pt)))
x y