module Data.Partial.Total where
private variable
: Level
ℓ ℓ' ℓ'' : Type ℓ A B C X Y
Total partial elements🔗
: ∀ {ℓ} {X : Type ℓ} ⦃ u : Underlying X ⦄ → X → Type _
↯⁺ = Σ[ a ∈ ↯ ⌞ A ⌟ ] ⌞ a ⌟ ↯⁺ A
instance
: To-part (↯⁺ A) A
fat-to-part = record { to-part = fst }
fat-to-part
: Map (eff ↯⁺)
↯⁺-Map .Map.map f (x , hx) = part-map f x , hx
↯⁺-Map
: Idiom (eff ↯⁺)
↯⁺-Idiom .Idiom.Map-idiom = ↯⁺-Map
↯⁺-Idiom .Idiom.pure x = always x , tt
↯⁺-Idiom .Idiom._<*>_ (f , hf) (x , hx) = part-ap f x , hf , hx
↯⁺-Idiom
: ⦃ _ : Extensional (↯ A) ℓ ⦄ → Extensional (↯⁺ A) ℓ
Extensional-↯⁺ = embedding→extensional (fst , Subset-proj-embedding (λ _ → hlevel 1)) e
Extensional-↯⁺ ⦃ e ⦄
abstract
: ∀ {A : Type ℓ} {n} ⦃ _ : 2 ≤ n ⦄ ⦃ _ : H-Level A n ⦄ → H-Level (↯⁺ A) n
H-Level-↯⁺ {n = suc (suc n)} ⦃ s≤s (s≤s p) ⦄ = hlevel-instance $
H-Level-↯⁺ (1 + n) (Subset-proj-embedding λ _ → hlevel 1) (hlevel (2 + n))
embedding→is-hlevel
{-# OVERLAPPING H-Level-↯⁺ #-}
: ↯⁺ A → A
from-total (a , ha) = a .elt ha
from-total
: is-equiv (from-total {A = A})
from-total-is-equiv = is-iso→is-equiv (iso pure (λ _ → refl) λ (x , a) → Σ-prop-path! (sym (is-always x a))) from-total-is-equiv
private module def where
record ℙ⁺ (A : Type ℓ) : Type ℓ where
field
: ↯ A → Ω
mem : ∀ {a} → ⌞ mem a ⌟ → ⌞ a ⌟ defined
private unquoteDecl eqv = declare-record-iso eqv (quote def.ℙ⁺)
: ∀ {ℓ} {X : Type ℓ} ⦃ u : Underlying X ⦄ → X → Type _
ℙ⁺ = def.ℙ⁺ ⌞ X ⌟
ℙ⁺ X
open def using (module ℙ⁺) public
open def.ℙ⁺ public
{-# DISPLAY def.ℙ⁺ X = ℙ⁺ X #-}
open is-iso
instance
: ⦃ _ : To-part X A ⦄ → Membership X (def.ℙ⁺ A) _
Membership-ℙ⁺ = record { _∈_ = λ a p → ⌞ p .mem (to-part a) ⌟ } where open To-part ⦃ ... ⦄
Membership-ℙ⁺
: ∀ {ℓr} ⦃ _ : Extensional (↯ A → Ω) ℓr ⦄ → Extensional (def.ℙ⁺ A) ℓr
Extensional-ℙ⁺ = injection→extensional! (λ p → Iso.injective eqv (Σ-prop-path! p)) e
Extensional-ℙ⁺ ⦃ e ⦄
: ∀ {n} → H-Level (def.ℙ⁺ A) (2 + n)
H-Level-ℙ⁺ = basic-instance 2 (Iso→is-hlevel 2 eqv (hlevel 2)) H-Level-ℙ⁺
: ℙ A → ℙ⁺ A
from-total-predicate .mem x = el (Σ[ hx ∈ x ] x .elt hx ∈ P) (hlevel 1)
from-total-predicate P .defined (hx , _) = hx
from-total-predicate P
: is-equiv (from-total-predicate {A = A})
from-total-predicate-is-equiv = is-iso→is-equiv λ where
from-total-predicate-is-equiv .inv P a → P .mem (always a)
.rinv P → ext λ a → Ω-ua (rec! (λ ha → subst (_∈ P) (sym (is-always a ha)))) λ pa → P .defined pa , subst (_∈ P) (is-always a _) pa
.linv P → ext λ a → Ω-ua snd (tt ,_)
: ↯⁺ A → ℙ⁺ A
singleton⁺ .mem y = elΩ (x .fst ≡ y)
singleton⁺ x .defined = rec! λ p → subst ⌞_⌟ p (x .snd) singleton⁺ x