{-# OPTIONS --without-K #-}
module Logical-equivalence where
open import Prelude as P hiding (id) renaming (_∘_ to _⊚_)
infix 0 _⇔_
record _⇔_ {f t} (From : Set f) (To : Set t) : Set (f ⊔ t) where
field
to : From → To
from : To → From
id : ∀ {a} {A : Set a} → A ⇔ A
id = record
{ to = P.id
; from = P.id
}
inverse : ∀ {a b} {A : Set a} {B : Set b} → A ⇔ B → B ⇔ A
inverse A⇔B = record
{ to = from
; from = to
} where open _⇔_ A⇔B
infixr 9 _∘_
_∘_ : ∀ {a b c} {A : Set a} {B : Set b} {C : Set c} →
B ⇔ C → A ⇔ B → A ⇔ C
f ∘ g = record
{ to = to f ⊚ to g
; from = from g ⊚ from f
} where open _⇔_
infix 0 finally-⇔
infixr 0 _⇔⟨_⟩_
_⇔⟨_⟩_ : ∀ {a b c} (A : Set a) {B : Set b} {C : Set c} →
A ⇔ B → B ⇔ C → A ⇔ C
_ ⇔⟨ A⇔B ⟩ B⇔C = B⇔C ∘ A⇔B
finally-⇔ : ∀ {a b} (A : Set a) (B : Set b) → A ⇔ B → A ⇔ B
finally-⇔ _ _ A⇔B = A⇔B
syntax finally-⇔ A B A⇔B = A ⇔⟨ A⇔B ⟩□ B □
Dec-preserves : {A B : Set} → A ⇔ B → Dec A ⇔ Dec B
Dec-preserves A⇔B = record
{ to = lemma A⇔B
; from = lemma (inverse A⇔B)
}
where
lemma : {A B : Set} → A ⇔ B → Dec A → Dec B
lemma A⇔B = ⊎-map to (λ ¬A → ¬A ⊚ from)
where open _⇔_ A⇔B