    ------------------------------------------------------------------------
    -- The Agda standard library
    --
    -- Propositional equality
    --
    -- This file contains some core definitions which are re-exported by
    -- Relation.Binary.PropositionalEquality.
    ------------------------------------------------------------------------

    {-# OPTIONS --cubical-compatible --safe #-}

    module Relation.Binary.PropositionalEquality.Core where

    open import Data.Product.Base using (_,_)
    open import Function.Base using (_∘_)
    open import Level using (Level; _⊔_)
    open import Relation.Binary.Core using (Rel; REL)
    open import Relation.Binary.Definitions
      using (Symmetric; Transitive; Substitutive
            ; _Respects_; _Respectsˡ_; _Respectsʳ_; _Respects₂_)
    open import Relation.Nullary.Negation.Core using (¬_)

    private
      variable
        a b ℓ : Level
        A B C : Set a

    ------------------------------------------------------------------------
    -- Propositional equality

    open import Agda.Builtin.Equality public

    infix 4 _≢_
    _≢_ : {A : Set a} → Rel A a
    x ≢ y = ¬ x ≡ y

    ------------------------------------------------------------------------
    -- Pointwise equality

    infix 4 _≗_

    _≗_ : (f g : A → B) → Set _
    _≗_ {A = A} {B = B} f g = ∀ x → f x ≡ g x

    ------------------------------------------------------------------------
    -- A variant of `refl` where the argument is explicit

    pattern erefl x = refl {x = x}

    ------------------------------------------------------------------------
    -- Congruence lemmas

    cong : ∀ (f : A → B) {x y} → x ≡ y → f x ≡ f y
    cong f refl = refl

    cong′ : ∀ {f : A → B} x → f x ≡ f x
    cong′ _ = refl

    icong : ∀ {f : A → B} {x y} → x ≡ y → f x ≡ f y
    icong = cong _

    icong′ : ∀ {f : A → B} x → f x ≡ f x
    icong′ _ = refl

    cong₂ : ∀ (f : A → B → C) {x y u v} → x ≡ y → u ≡ v → f x u ≡ f y v
    cong₂ f refl refl = refl

    cong-app : ∀ {A : Set a} {B : A → Set b} {f g : (x : A) → B x} →
               f ≡ g → (x : A) → f x ≡ g x
    cong-app refl x = refl

    ------------------------------------------------------------------------
    -- Properties of _≡_

    sym : Symmetric {A = A} _≡_
    sym refl = refl

    trans : Transitive {A = A} _≡_
    trans refl eq = eq

    subst : Substitutive {A = A} _≡_ ℓ
    subst P refl p = p

    subst₂ : ∀ (_∼_ : REL A B ℓ) {x y u v} → x ≡ y → u ≡ v → x ∼ u → y ∼ v
    subst₂ _ refl refl p = p

    resp : ∀ (P : A → Set ℓ) → P Respects _≡_
    resp P refl p = p

    respˡ : ∀ (∼ : Rel A ℓ) → ∼ Respectsˡ _≡_
    respˡ _∼_ refl x∼y = x∼y

    respʳ : ∀ (∼ : Rel A ℓ) → ∼ Respectsʳ _≡_
    respʳ _∼_ refl x∼y = x∼y

    resp₂ : ∀ (∼ : Rel A ℓ) → ∼ Respects₂ _≡_
    resp₂ _∼_ = respʳ _∼_ , respˡ _∼_

    ------------------------------------------------------------------------
    -- Properties of _≢_

    ≢-sym : Symmetric {A = A} _≢_
    ≢-sym x≢y =  x≢y ∘ sym