{-# OPTIONS --cubical --safe --prop #-} module Relation.Binary.Equivalence.PropTruncated where open import Agda.Primitive using (Prop) open import Prelude open import Relation.Nullary.Stable infix 4 _≐_ data _≐_ {a} {A : Type a} (x y : A) : Prop a where ∣_∣ : x ≡ y → x ≐ y data ∙⊥ : Prop where private variable x y z : A rerel : ∙⊥ → ⊥ rerel () ∙refute : x ≐ y → (x ≡ y → ⊥) → ∙⊥ ∙refute ∣ x≡y ∣ x≢y with x≢y x≡y ∙refute ∣ x≡y ∣ x≢y | () refute : x ≐ y → ¬ (¬ (x ≡ y)) refute x≐y x≢y = rerel (∙refute x≐y x≢y) unsquash : Stable (x ≡ y) → x ≐ y → x ≡ y unsquash st x≐y = st (refute x≐y) ∙refl : x ≐ x ∙refl = ∣ refl ∣ ∙trans : x ≐ y → y ≐ z → x ≐ z ∙trans ∣ xy ∣ ∣ yz ∣ = ∣ xy ; yz ∣ ∙sym : x ≐ y → y ≐ x ∙sym ∣ p ∣ = ∣ sym p ∣ ∙cong : (f : A → B) → x ≐ y → f x ≐ f y ∙cong f ∣ x≡y ∣ = ∣ cong f x≡y ∣ module Reasoning where infixr 2 ≐˘⟨⟩-syntax ≐⟨∙⟩-syntax ≐˘⟨⟩-syntax : ∀ (x : A) {y z} → y ≐ z → y ≐ x → x ≐ z ≐˘⟨⟩-syntax _ y≡z y≡x = ∙trans (∙sym y≡x) y≡z syntax ≐˘⟨⟩-syntax x y≡z y≡x = x ≐˘⟨ y≡x ⟩ y≡z ≐⟨∙⟩-syntax : ∀ (x : A) {y z} → y ≐ z → x ≐ y → x ≐ z ≐⟨∙⟩-syntax _ y≡z x≡y = ∙trans x≡y y≡z syntax ≐⟨∙⟩-syntax x y≡z x≡y = x ≐⟨ x≡y ⟩ y≡z _≐⟨⟩_ : ∀ (x : A) {y} → x ≐ y → x ≐ y _ ≐⟨⟩ x≡y = x≡y infix 2.5 _∎ _∎ : ∀ {A : Type a} (x : A) → x ≐ x _∎ x = ∙refl infixr 2 ≡˘⟨⟩-syntax ≡⟨∙⟩-syntax ≡˘⟨⟩-syntax : ∀ (x : A) {y z} → y ≐ z → y ≡ x → x ≐ z ≡˘⟨⟩-syntax _ y≡z y≡x = ∙trans ∣ sym y≡x ∣ y≡z syntax ≡˘⟨⟩-syntax x y≡z y≡x = x ≡˘⟨ y≡x ⟩ y≡z ≡⟨∙⟩-syntax : ∀ (x : A) {y z} → y ≐ z → x ≡ y → x ≐ z ≡⟨∙⟩-syntax _ y≡z x≡y = ∙trans ∣ x≡y ∣ y≡z syntax ≡⟨∙⟩-syntax x y≡z x≡y = x ≡⟨ x≡y ⟩ y≡z