1
------------------------------------------------------------------------
2
-- Equivalence (coinhabitance)
3
------------------------------------------------------------------------
5
{-# OPTIONS --universe-polymorphism #-}
7
module Function.Equivalence where
9
open import Function using (flip)
10
open import Function.Equality as F
11
using (_⟶_; _⟨$⟩_) renaming (_∘_ to _⟪∘⟫_)
13
open import Relation.Binary
14
import Relation.Binary.PropositionalEquality as P
16
-- Setoid equivalence.
18
record Equivalent {f₁ f₂ t₁ t₂}
19
(From : Setoid f₁ f₂) (To : Setoid t₁ t₂) :
20
Set (f₁ ⊔ f₂ ⊔ t₁ ⊔ t₂) where
29
_⇔_ : ∀ {f t} → Set f → Set t → Set _
30
From ⇔ To = Equivalent (P.setoid From) (P.setoid To)
32
equivalent : ∀ {f t} {From : Set f} {To : Set t} →
33
(From → To) → (To → From) → From ⇔ To
34
equivalent to from = record { to = P.→-to-⟶ to; from = P.→-to-⟶ from }
36
------------------------------------------------------------------------
39
map : ∀ {f₁ f₂ t₁ t₂} {From : Setoid f₁ f₂} {To : Setoid t₁ t₂}
41
{From′ : Setoid f₁′ f₂′} {To′ : Setoid t₁′ t₂′} →
42
((From ⟶ To) → (From′ ⟶ To′)) →
43
((To ⟶ From) → (To′ ⟶ From′)) →
44
Equivalent From To → Equivalent From′ To′
45
map t f eq = record { to = t to; from = f from }
46
where open Equivalent eq
48
zip : ∀ {f₁₁ f₂₁ t₁₁ t₂₁}
49
{From₁ : Setoid f₁₁ f₂₁} {To₁ : Setoid t₁₁ t₂₁}
51
{From₂ : Setoid f₁₂ f₂₂} {To₂ : Setoid t₁₂ t₂₂}
52
{f₁ f₂ t₁ t₂} {From : Setoid f₁ f₂} {To : Setoid t₁ t₂} →
53
((From₁ ⟶ To₁) → (From₂ ⟶ To₂) → (From ⟶ To)) →
54
((To₁ ⟶ From₁) → (To₂ ⟶ From₂) → (To ⟶ From)) →
55
Equivalent From₁ To₁ → Equivalent From₂ To₂ → Equivalent From To
57
record { to = t (to eq₁) (to eq₂); from = f (from eq₁) (from eq₂) }
60
------------------------------------------------------------------------
61
-- Equivalent is an equivalence relation
63
-- Identity and composition (reflexivity and transitivity).
65
id : ∀ {s₁ s₂} → Reflexive (Equivalent {s₁} {s₂})
73
_∘_ : ∀ {f₁ f₂ m₁ m₂ t₁ t₂} →
74
TransFlip (Equivalent {f₁} {f₂} {m₁} {m₂})
75
(Equivalent {m₁} {m₂} {t₁} {t₂})
76
(Equivalent {f₁} {f₂} {t₁} {t₂})
79
; from = from g ⟪∘⟫ from f
80
} where open Equivalent
84
sym : ∀ {f₁ f₂ t₁ t₂} →
85
Sym (Equivalent {f₁} {f₂} {t₁} {t₂}) (Equivalent {t₁} {t₂} {f₁} {f₂})
89
} where open Equivalent eq
91
-- For fixed universe levels we can construct setoids.
93
setoid : (s₁ s₂ : Level) → Setoid (suc (s₁ ⊔ s₂)) (s₁ ⊔ s₂)
95
{ Carrier = Setoid s₁ s₂
97
; isEquivalence = record {refl = id; sym = sym; trans = flip _∘_}
100
⇔-setoid : (ℓ : Level) → Setoid (suc ℓ) ℓ
104
; isEquivalence = record {refl = id; sym = sym; trans = flip _∘_}