module Cubical.Relation.Binary.Properties where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Univalence
open import Cubical.Foundations.Function
open import Cubical.Foundations.HLevels
open import Cubical.Functions.FunExtEquiv
open import Cubical.Data.Sigma
open import Cubical.Relation.Binary.Base
open import Cubical.Relation.Nullary
private
variable
ℓ ℓ' : Level
A B : Type ℓ
-- Theorem 7.2.2 in the HoTT Book
module _ (R : Rel A A ℓ') where
open BinaryRelation R
reflPropRelImpliesIdentity→isSet : isRefl
→ isPropValued
→ impliesIdentity
→ isSet A
reflPropRelImpliesIdentity→isSet Rrefl Rprop R→≡ = Collapsible≡→isSet λ where
x y .fst p → R→≡ (subst (R x) p (Rrefl x))
x y .snd p q → cong R→≡ (Rprop _ _ _ _)
reflPropRelImpliesIdentity→isUnivalent : isRefl
→ isPropValued
→ impliesIdentity
→ isUnivalent
reflPropRelImpliesIdentity→isUnivalent Rrefl Rprop R→≡ x y =
propBiimpl→Equiv (Rprop x y) (Aset x y) R→≡ (λ p → subst (R x) p (Rrefl x)) where
Aset : isSet A
Aset = reflPropRelImpliesIdentity→isSet Rrefl Rprop R→≡
-- Pulling back a relation along a function.
-- This can for example be used when restricting an equivalence relation to a subset:
-- _~'_ = on fst _~_
module _
(f : A → B)
(R : Rel B B ℓ)
where
open BinaryRelation
pulledbackRel : Rel A A ℓ
pulledbackRel x y = R (f x) (f y)
isReflPulledbackRel : isRefl R → isRefl pulledbackRel
isReflPulledbackRel isReflR a = isReflR (f a)
isSymPulledbackRel : isSym R → isSym pulledbackRel
isSymPulledbackRel isSymR a a' = isSymR (f a) (f a')
isTransPulledbackRel : isTrans R → isTrans pulledbackRel
isTransPulledbackRel isTransR a a' a'' = isTransR (f a) (f a') (f a'')
open isEquivRel
isEquivRelPulledbackRel : isEquivRel R → isEquivRel pulledbackRel
reflexive (isEquivRelPulledbackRel isEquivRelR) = isReflPulledbackRel (reflexive isEquivRelR)
symmetric (isEquivRelPulledbackRel isEquivRelR) = isSymPulledbackRel (symmetric isEquivRelR)
transitive (isEquivRelPulledbackRel isEquivRelR) = isTransPulledbackRel (transitive isEquivRelR)
module _ {A B : Type ℓ} (e : A ≃ B) {_∼_ : Rel A A ℓ'} {_∻_ : Rel B B ℓ'}
(_h_ : ∀ x y → (x ∼ y) ≃ ((fst e x) ∻ (fst e y))) where
RelPathP : PathP (λ i → ua e i → ua e i → Type _)
_∼_ _∻_
RelPathP i x y = Glue (ua-unglue e i x ∻ ua-unglue e i y)
λ { (i = i0) → _ , x h y
; (i = i1) → _ , idEquiv _ }
module _ {ℓ''} {B : Type ℓ} {_∻_ : B → B → Type ℓ'} where
JRelPathP-Goal : Type _
JRelPathP-Goal = ∀ (A : Type ℓ) (e : A ≃ B) (_~_ : A → A → Type ℓ')
→ (_h_ : ∀ x y → x ~ y ≃ (fst e x ∻ fst e y)) → Type ℓ''
EquivJRel : (Goal : JRelPathP-Goal)
→ (Goal _ (idEquiv _) _∻_ λ _ _ → idEquiv _ )
→ ∀ {A} e _~_ _h_ → Goal A e _~_ _h_
EquivJRel Goal g {A} = EquivJ (λ A e → ∀ _~_ _h_ → Goal A e _~_ _h_)
λ _~_ _h_ → subst (uncurry (Goal B (idEquiv B)))
((isPropRetract
(map-snd (λ r → funExt₂ λ x y → sym (ua (r x y))))
(map-snd (λ r x y → pathToEquiv λ i → r (~ i) x y))
(λ (o , r) → cong (o ,_) (funExt₂ λ x y → equivEq
(funExt λ _ → transportRefl _)))
(isPropSingl {a = _∻_})) _ _) g