{-# OPTIONS --cubical-compatible --safe #-}
module PropositionalEquality where
open import Relation.Nullary
using (Dec ; yes ; no ; ¬_)
open import Agda.Builtin.Equality public
sym : ∀ {ℓ} {A : Set ℓ} {x y : A}
→ x ≡ y → y ≡ x
sym refl = refl
infixr 20 _∙_
_∙_ : ∀ {ℓ} {A : Set ℓ} {x y z : A}
→ x ≡ y → y ≡ z → x ≡ z
refl ∙ refl = refl
subst : ∀ {ℓ ℓ'} {A : Set ℓ} (P : A → Set ℓ') {x y : A}
→ x ≡ y → P x → P y
subst P refl p = p
cong : ∀ {ℓ ℓ'} {A : Set ℓ} {B : Set ℓ'} {x y : A}
→ (f : A → B) → x ≡ y → f x ≡ f y
cong f refl = refl
cong₂ : ∀ {ℓ ℓ' ℓ″} {A : Set ℓ} {B : Set ℓ'} {C : Set ℓ″}
→ {x y : A} {u v : B}
→ (f : A → B → C) → x ≡ y → u ≡ v → f x u ≡ f y v
cong₂ f refl refl = refl
J : ∀ {ℓ ℓ'} {A : Set ℓ} {x y : A}
→ (P : ∀ y → x ≡ y → Set ℓ')
→ P x refl → (p : x ≡ y) → P y p
J P d refl = d
lCancel : ∀ {ℓ} {A : Set ℓ} {x y : A}
→ (p : x ≡ y) → sym p ∙ p ≡ refl
lCancel refl = refl
isProp isSet : ∀ {ℓ} → Set ℓ → Set ℓ
isProp A = (x y : A) → x ≡ y
isSet A = (x y : A) → isProp (x ≡ y)
Discrete : ∀ {ℓ} → Set ℓ → Set ℓ
Discrete A = (x y : A) → Dec (x ≡ y)