open import Realizability.ApplicativeStructure
open import Realizability.CombinatoryAlgebra
open import Realizability.PropResizing
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Structure using (⟨_⟩; str)
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Univalence
open import Cubical.Foundations.Powerset
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Path
open import Cubical.Functions.FunExtEquiv
open import Cubical.Relation.Binary
open import Cubical.Data.Sigma
open import Cubical.Data.FinData
open import Cubical.Data.Vec
open import Cubical.Reflection.RecordEquiv
open import Cubical.HITs.PropositionalTruncation as PT hiding (map)
open import Cubical.HITs.PropositionalTruncation.Monad
open import Cubical.HITs.SetQuotients as SQ
open import Cubical.Categories.Category
open import Cubical.Categories.Functor hiding (Id)
module Realizability.PERs.ResizedPER
{ℓ} {A : Type ℓ} (ca : CombinatoryAlgebra A) (resizing : hPropResizing ℓ) where
open import Realizability.Assembly.Base ca
open import Realizability.Assembly.Morphism ca
open import Realizability.PERs.PER ca
open import Realizability.Modest.Base ca
open CombinatoryAlgebra ca
open Combinators ca renaming (i to Id; ia≡a to Ida≡a)
smallHProp = resizing .fst
hProp≃smallHProp = resizing .snd
smallHProp≃hProp = invEquiv hProp≃smallHProp
isSetSmallHProp : isSet smallHProp
isSetSmallHProp = isOfHLevelRespectEquiv 2 hProp≃smallHProp isSetHProp
hPropIsoSmallHProp : Iso (hProp ℓ) smallHProp
hPropIsoSmallHProp = equivToIso hProp≃smallHProp
shrink : hProp ℓ → smallHProp
shrink = Iso.fun hPropIsoSmallHProp
enlarge : smallHProp → hProp ℓ
enlarge = Iso.inv hPropIsoSmallHProp
enlarge⋆shrink≡id : section shrink enlarge
enlarge⋆shrink≡id = Iso.rightInv hPropIsoSmallHProp
shrink⋆enlarge≡id : retract shrink enlarge
shrink⋆enlarge≡id = Iso.leftInv hPropIsoSmallHProp
extractType : smallHProp → Type ℓ
extractType p = ⟨ enlarge p ⟩
isPropExtractType : ∀ p → isProp (extractType p)
isPropExtractType p = str (enlarge p)
extractFromShrunk : ∀ p isPropP → extractType (shrink (p , isPropP)) ≡ p
extractFromShrunk p isPropP =
extractType (shrink (p , isPropP))
≡⟨ refl ⟩
⟨ enlarge (shrink (p , isPropP)) ⟩
≡⟨ cong ⟨_⟩ (shrink⋆enlarge≡id (p , isPropP)) ⟩
p
∎
shrinkFromExtracted : ∀ p → shrink (extractType p , isPropExtractType p) ≡ p
shrinkFromExtracted p =
shrink (extractType p , isPropExtractType p)
≡⟨ refl ⟩
shrink (enlarge p)
≡⟨ enlarge⋆shrink≡id p ⟩
p
∎
record ResizedPER : Type ℓ where
no-eta-equality
constructor makeResizedPER
field
relation : A → A → smallHProp
isSymmetric : ∀ a b → extractType (relation a b) → extractType (relation b a)
isTransitive : ∀ a b c → extractType (relation a b) → extractType (relation b c) → extractType (relation a c)
open ResizedPER
unquoteDecl ResizedPERIsoΣ = declareRecordIsoΣ ResizedPERIsoΣ (quote ResizedPER)
ResizedPERΣ : Type ℓ
ResizedPERΣ =
Σ[ relation ∈ (A → A → smallHProp) ]
(∀ a b → extractType (relation a b) → extractType (relation b a)) ×
(∀ a b c → extractType (relation a b) → extractType (relation b c) → extractType (relation a c))
isSetResizedPERΣ : isSet ResizedPERΣ
isSetResizedPERΣ =
isSetΣ
(isSet→ (isSet→ isSetSmallHProp))
(λ relation → isProp→isSet (isProp× (isPropΠ3 λ _ _ _ → isPropExtractType _) (isPropΠ5 λ _ _ _ _ _ → isPropExtractType _)))
isSetResizedPER : isSet ResizedPER
isSetResizedPER = isOfHLevelRetractFromIso 2 ResizedPERIsoΣ isSetResizedPERΣ
ResizedPER≡Iso : ∀ (R S : ResizedPER) → Iso (R ≡ S) (∀ a b → R .relation a b ≡ S .relation a b)
Iso.fun (ResizedPER≡Iso R S) R≡S a b i = (R≡S i) .relation a b
relation (Iso.inv (ResizedPER≡Iso R S) pointwise i) a b = pointwise a b i
isSymmetric (Iso.inv (ResizedPER≡Iso R S) pointwise i) =
isProp→PathP
{B = λ j → (a b : A) → extractType (pointwise a b j) → extractType (pointwise b a j)}
(λ j → isPropΠ3 λ _ _ _ → isPropExtractType _)
(isSymmetric R)
(isSymmetric S) i
isTransitive (Iso.inv (ResizedPER≡Iso R S) pointwise i) =
isProp→PathP
{B = λ j → (a b c : A) → extractType (pointwise a b j) → extractType (pointwise b c j) → extractType (pointwise a c j)}
(λ j → isPropΠ5 λ _ _ _ _ _ → isPropExtractType _)
(R .isTransitive)
(S .isTransitive)
i
Iso.rightInv (ResizedPER≡Iso R S) pointwise = refl
Iso.leftInv (ResizedPER≡Iso R S) R≡S = isSetResizedPER R S _ _
ResizedPER≡ : ∀ (R S : ResizedPER) → (∀ a b → R .relation a b ≡ S .relation a b) → R ≡ S
ResizedPER≡ R S pointwise = Iso.inv (ResizedPER≡Iso R S) pointwise
ResizedPERIsoPER : Iso ResizedPER PER
PER.relation (Iso.fun ResizedPERIsoPER resized) a b = extractType (resized .relation a b)
PER.isPropValued (Iso.fun ResizedPERIsoPER resized) a b = isPropExtractType _
fst (PER.isPER (Iso.fun ResizedPERIsoPER resized)) a b a~b = resized .isSymmetric a b a~b
snd (PER.isPER (Iso.fun ResizedPERIsoPER resized)) a b c a~b b~c = resized .isTransitive a b c a~b b~c
relation (Iso.inv ResizedPERIsoPER per) a b = shrink (per .PER.relation a b , per .PER.isPropValued a b)
isSymmetric (Iso.inv ResizedPERIsoPER per) a b a~[resized]b = b~[resized]a where
a~b : per .PER.relation a b
a~b = transport (extractFromShrunk _ _) a~[resized]b
b~a : per .PER.relation b a
b~a = per .PER.isPER .fst a b a~b
b~[resized]a : extractType (shrink (per .PER.relation b a , per .PER.isPropValued b a))
b~[resized]a = transport (sym (extractFromShrunk _ _)) b~a
isTransitive (Iso.inv ResizedPERIsoPER per) a b c a~[resized]b b~[resized]c = a~[resized]c where
a~b : per .PER.relation a b
a~b = transport (extractFromShrunk _ _) a~[resized]b
b~c : per .PER.relation b c
b~c = transport (extractFromShrunk _ _) b~[resized]c
a~c : per .PER.relation a c
a~c = per .PER.isPER .snd a b c a~b b~c
a~[resized]c : extractType (shrink (per .PER.relation a c , per .PER.isPropValued a c))
a~[resized]c = transport (sym (extractFromShrunk _ _)) a~c
Iso.rightInv ResizedPERIsoPER per =
PER≡ _ _
(funExt₂
λ a b →
extractFromShrunk (per .PER.relation a b) (per .PER.isPropValued a b))
Iso.leftInv ResizedPERIsoPER resizedPer =
ResizedPER≡ _ _
λ a b → shrinkFromExtracted (resizedPer .relation a b)
opaque
shrinkPER : PER → ResizedPER
shrinkPER = ResizedPERIsoPER .Iso.inv
opaque
enlargePER : ResizedPER → PER
enlargePER = ResizedPERIsoPER .Iso.fun
opaque
unfolding shrinkPER
unfolding enlargePER
shrinkPER⋆enlargePER≡id : ∀ resized → shrinkPER (enlargePER resized) ≡ resized
shrinkPER⋆enlargePER≡id resized = ResizedPERIsoPER .Iso.leftInv resized
opaque
unfolding shrinkPER
unfolding enlargePER
enlargePER⋆shrinkPER≡id : ∀ per → enlargePER (shrinkPER per) ≡ per
enlargePER⋆shrinkPER≡id per = ResizedPERIsoPER .Iso.rightInv per
ResizedPER≃PER : ResizedPER ≃ PER
ResizedPER≃PER = isoToEquiv ResizedPERIsoPER
opaque
transportFromSmall : ∀ {ℓ'} {P : ResizedPER → Type ℓ'} → (∀ per → P (shrinkPER per)) → ∀ resized → P resized
transportFromSmall {ℓ'} {P} small resized = subst P (shrinkPER⋆enlargePER≡id resized) (small (enlargePER resized))
opaque
transportFromLarge : ∀ {ℓ'} {P : PER → Type ℓ'} → (∀ resized → P (enlargePER resized)) → ∀ per → P per
transportFromLarge {ℓ'} {P} large per = subst P (enlargePER⋆shrinkPER≡id per) (large (shrinkPER per))