module Equality where

open import Logic

data _≡_ {X : Set} : X → X → Ω where
  reflexivity : {x : X} → x ≡ x

infix  30 _≡_

two-things-equal-to-a-third-are-equal : {X : Set} →
             ∀{x y z : X} → x ≡ y → x ≡ z → y ≡ z

two-things-equal-to-a-third-are-equal reflexivity reflexivity = reflexivity


transitivity : {X : Set} → {x y z : X} →  x ≡ y  →  y ≡ z  →  x ≡ z
transitivity reflexivity reflexivity = reflexivity


symmetry : {X : Set} → {x y : X} → x ≡ y → y ≡ x
symmetry reflexivity = reflexivity


compositionality : {X Y : Set} → ∀(f : X → Y) → {x₀ x₁ : X} →

  x₀ ≡ x₁ →  f x₀ ≡ f x₁

compositionality f reflexivity = reflexivity


predicate-compositionality : {X : Set} (A : X → Ω) {x y : X} →

  x ≡ y → A x → A y

predicate-compositionality A reflexivity a = a


binary-predicate-compositionality :

   {X Y : Set} {A : X → Y → Ω} {x x' : X} {y y' : Y} →

   x ≡ x' → y ≡ y' → A x y → A x' y'

binary-predicate-compositionality reflexivity reflexivity a = a


set-compositionality : {I : Set} (X : I → Set) → {i j : I} → i ≡ j → X i → X j
set-compositionality X reflexivity x = x