{-# OPTIONS --cubical-compatible #-} module Terra.Data.Equality where open import Terra.Data.Level private variable ℓ ℓ′ : Level data _≡_ {T : Set ℓ} : T -> T -> Set ℓ where refl : {x : T} -> x ≡ x infix 4 _≡_ {-# BUILTIN EQUALITY _≡_ #-} ≡-elim : {A : Set ℓ} {B : A -> A -> Set ℓ′} {x y : A} -> (x ≡ y) -> ((x : A) -> B x x) -> B x y ≡-elim {x = x} refl f = f x sym : {A : Set ℓ} {x y : A} -> x ≡ y -> y ≡ x sym refl = refl cong : { A : Set ℓ} -> {B : Set ℓ′} -> {x₁ x₂ : A} -> (f : A -> B) -> x₁ ≡ x₂ -> f x₁ ≡ f x₂ cong f refl = refl _<≡>_ : {A : Set ℓ} {B : Set ℓ′} {x y : A} -> {f g : A -> B} -> f ≡ g -> x ≡ y -> f x ≡ g y refl <≡> refl = refl infixl 5 _<≡>_ pure≡ : {A : Set ℓ} (x : A) -> x ≡ x pure≡ x = refl _→←_ : {A : Set ℓ} {x y z : A} -> x ≡ y -> y ≡ z -> x ≡ z refl →← refl = refl infixl 5 _→←_ transp : {A B : Set ℓ} -> A ≡ B -> A -> B transp refl x = x subst : {A : Set ℓ} (B : A -> Set ℓ′) {x y : A} (eq : x ≡ y) -> B x -> B y subst B refl x = x case≡_of_ : {A : Set ℓ} {B : Set ℓ′} -> (x : A) -> ((y : A) -> x ≡ y -> B) -> B case≡ s of f = f s refl _∎ : {T : Set ℓ} (l : T) -> l ≡ l _∎ v = refl _≡⟨⟩_ : {T : Set ℓ} -> {b : T} -> (a : T) -> a ≡ b -> a ≡ b l ≡⟨⟩ r = r _≡⟨_⟩_ : {T : Set ℓ} -> {b c : T} -> (a : T) -> a ≡ b -> b ≡ c -> a ≡ c _≡⟨_⟩_ {c = c} l j r = j →← r infix 3 _∎ infixr 2 _≡⟨⟩_ _≡⟨_⟩_