|
| 1 | +------------------------------------------------------------------------ |
| 2 | +-- The Agda standard library |
| 3 | +-- |
| 4 | +-- The basic code for equational reasoning with three relations: |
| 5 | +-- equality and apartness |
| 6 | +------------------------------------------------------------------------ |
| 7 | + |
| 8 | +{-# OPTIONS --cubical-compatible --safe #-} |
| 9 | + |
| 10 | +open import Relation.Binary |
| 11 | + |
| 12 | +module Relation.Binary.Reasoning.Base.Apartness {a ℓ₁ ℓ₂} {A : Set a} |
| 13 | + {_≈_ : Rel A ℓ₁} {_#_ : Rel A ℓ₂} |
| 14 | + (≈-equiv : IsEquivalence _≈_) |
| 15 | + (#-trans : Transitive _#_) (#-sym : Symmetric _#_) |
| 16 | + (#-≈-trans : Trans _#_ _≈_ _#_) (≈-#-trans : Trans _≈_ _#_ _#_) |
| 17 | + where |
| 18 | + |
| 19 | +open import Level using (Level; _⊔_) |
| 20 | +open import Relation.Binary.PropositionalEquality.Core |
| 21 | + using (_≡_; refl; sym) |
| 22 | +open import Relation.Nullary.Decidable using (Dec; yes; no) |
| 23 | +open import Relation.Nullary.Decidable using (True; toWitness) |
| 24 | + |
| 25 | +open IsEquivalence ≈-equiv |
| 26 | + renaming |
| 27 | + ( refl to ≈-refl |
| 28 | + ; sym to ≈-sym |
| 29 | + ; trans to ≈-trans |
| 30 | + ) |
| 31 | + |
| 32 | +infix 4 _IsRelatedTo_ |
| 33 | + |
| 34 | +data _IsRelatedTo_ (x y : A) : Set (a ⊔ ℓ₁ ⊔ ℓ₂) where |
| 35 | + nothing : x IsRelatedTo y |
| 36 | + apartness : (x#y : x # y) → x IsRelatedTo y |
| 37 | + equals : (x≈y : x ≈ y) → x IsRelatedTo y |
| 38 | + |
| 39 | +data IsApartness {x y} : x IsRelatedTo y → Set (a ⊔ ℓ₁ ⊔ ℓ₂) where |
| 40 | + isApartness : ∀ x#y → IsApartness (apartness x#y) |
| 41 | + |
| 42 | +IsApartness? : ∀ {x y} (x#y : x IsRelatedTo y) → Dec (IsApartness x#y) |
| 43 | +IsApartness? nothing = no λ() |
| 44 | +IsApartness? (apartness x#y) = yes (isApartness x#y) |
| 45 | +IsApartness? (equals x≈y) = no (λ ()) |
| 46 | + |
| 47 | +extractApartness : ∀ {x y} {x#y : x IsRelatedTo y} → IsApartness x#y → x # y |
| 48 | +extractApartness (isApartness x#y) = x#y |
| 49 | + |
| 50 | +data IsEquality {x y} : x IsRelatedTo y → Set (a ⊔ ℓ₁ ⊔ ℓ₂) where |
| 51 | + isEquality : ∀ x≈y → IsEquality (equals x≈y) |
| 52 | + |
| 53 | +IsEquality? : ∀ {x y} (x≲y : x IsRelatedTo y) → Dec (IsEquality x≲y) |
| 54 | +IsEquality? nothing = no λ() |
| 55 | +IsEquality? (apartness _) = no λ() |
| 56 | +IsEquality? (equals x≈y) = yes (isEquality x≈y) |
| 57 | + |
| 58 | +extractEquality : ∀ {x y} {x≲y : x IsRelatedTo y} → IsEquality x≲y → x ≈ y |
| 59 | +extractEquality (isEquality x≈y) = x≈y |
| 60 | + |
| 61 | +infix 1 begin-apartness_ begin-equality_ |
| 62 | +infixr 2 step-≈ step-≈˘ step-≡ step-≡˘ step-# step-#˘ _≡⟨⟩_ |
| 63 | +infix 3 _∎ |
| 64 | + |
| 65 | +begin-apartness_ : ∀ {x y} (r : x IsRelatedTo y) → {s : True (IsApartness? r)} → x # y |
| 66 | +begin-apartness_ _ {s} = extractApartness (toWitness s) |
| 67 | + |
| 68 | +begin-equality_ : ∀ {x y} (r : x IsRelatedTo y) → {s : True (IsEquality? r)} → x ≈ y |
| 69 | +begin-equality_ _ {s} = extractEquality (toWitness s) |
| 70 | + |
| 71 | +step-# : ∀ (x : A) {y z} → y IsRelatedTo z → x # y → x IsRelatedTo z |
| 72 | +step-# x nothing _ = nothing |
| 73 | +step-# x (apartness y#z) x#y = nothing |
| 74 | +step-# x (equals y≈z) x#y = apartness (#-≈-trans x#y y≈z) |
| 75 | + |
| 76 | +step-#˘ : ∀ (x : A) {y z} → y IsRelatedTo z → y # x → x IsRelatedTo z |
| 77 | +step-#˘ x y-z y#x = step-# x y-z (#-sym y#x) |
| 78 | + |
| 79 | +step-≈ : ∀ (x : A) {y z} → y IsRelatedTo z → x ≈ y → x IsRelatedTo z |
| 80 | +step-≈ x nothing x≈y = nothing |
| 81 | +step-≈ x (apartness y#z) x≈y = apartness (≈-#-trans x≈y y#z) |
| 82 | +step-≈ x (equals y≈z) x≈y = equals (≈-trans x≈y y≈z) |
| 83 | + |
| 84 | +step-≈˘ : ∀ x {y z} → y IsRelatedTo z → y ≈ x → x IsRelatedTo z |
| 85 | +step-≈˘ x y∼z x≈y = step-≈ x y∼z (≈-sym x≈y) |
| 86 | + |
| 87 | +step-≡ : ∀ (x : A) {y z} → y IsRelatedTo z → x ≡ y → x IsRelatedTo z |
| 88 | +step-≡ x nothing _ = nothing |
| 89 | +step-≡ x (apartness x#y) refl = apartness x#y |
| 90 | +step-≡ x (equals x≈y) refl = equals x≈y |
| 91 | + |
| 92 | +step-≡˘ : ∀ x {y z} → y IsRelatedTo z → y ≡ x → x IsRelatedTo z |
| 93 | +step-≡˘ x y∼z x≡y = step-≡ x y∼z (sym x≡y) |
| 94 | + |
| 95 | +_≡⟨⟩_ : ∀ (x : A) {y} → x IsRelatedTo y → x IsRelatedTo y |
| 96 | +x ≡⟨⟩ x-y = x-y |
| 97 | + |
| 98 | +_∎ : ∀ x → x IsRelatedTo x |
| 99 | +x ∎ = equals ≈-refl |
| 100 | + |
| 101 | +syntax step-# x y∼z x#y = x #⟨ x#y ⟩ y∼z |
| 102 | +syntax step-#˘ x y∼z x#y = x #˘⟨ x#y ⟩ y∼z |
| 103 | +syntax step-≈ x y∼z x≈y = x ≈⟨ x≈y ⟩ y∼z |
| 104 | +syntax step-≈˘ x y∼z y≈x = x ≈˘⟨ y≈x ⟩ y∼z |
| 105 | +syntax step-≡ x y∼z x≡y = x ≡⟨ x≡y ⟩ y∼z |
| 106 | +syntax step-≡˘ x y∼z y≡x = x ≡˘⟨ y≡x ⟩ y∼z |
0 commit comments