module Library.Equality where

open import Library.Logic

infix 4 _==_ _!=_

data _==_ {A : Set} (x : A) : A -> Set where
  refl : x == x

_!=_ : {A : Set} -> A -> A -> Set
x != y = ¬ (x == y)

{-# BUILTIN EQUALITY _==_ #-}

symm : {A : Set} {x y : A} -> x == y -> y == x
symm refl = refl

tran : {A : Set} {x y z : A} -> x == y -> y == z -> x == z
tran refl refl = refl

cong : {A B : Set} (f : A -> B) {x y : A} -> x == y -> f x == f y
cong _ refl = refl

cong2 : {A B C : Set} (f : A -> B -> C) {x y : A} {u v : B} -> x == y -> u == v -> f x u == f y v
cong2 _ refl refl = refl

subst : {A : Set} (P : A -> Set) {x y : A} -> x == y -> P x -> P y
subst _ refl p = p