{-# OPTIONS --without-K --safe #-}
module Util.Relation.Binary.LogicalEquivalence where
open import Relation.Binary using (IsEquivalence ; Setoid)
open import Util.Prelude
private
variable
α β γ : Level
A B C : Set α
infix 4 _↔_
record _↔_ (A : Set α) (B : Set β) : Set (α ⊔ℓ β) where
field
forth : A → B
back : B → A
open _↔_ public
↔-refl : A ↔ A
↔-refl .forth = id
↔-refl .back = id
↔-reflexive : A ≡ B → A ↔ B
↔-reflexive refl = ↔-refl
↔-sym : A ↔ B → B ↔ A
↔-sym A↔B .forth = A↔B .back
↔-sym A↔B .back = A↔B .forth
↔-trans : A ↔ B → B ↔ C → A ↔ C
↔-trans A↔B B↔C .forth = B↔C .forth ∘ A↔B .forth
↔-trans A↔B B↔C .back = A↔B .back ∘ B↔C .back
↔-isEquivalence : IsEquivalence (_↔_ {α})
↔-isEquivalence = record
{ refl = ↔-refl
; sym = ↔-sym
; trans = ↔-trans
}
↔-setoid : ∀ α → Setoid (lsuc α) α
↔-setoid α .Setoid.Carrier = Set α
↔-setoid α .Setoid._≈_ = _↔_
↔-setoid α .Setoid.isEquivalence = ↔-isEquivalence