Skip to content

Commit 1933346

Browse files
guilhermehasMatthewDaggitt
authored andcommitted
Add apartness reasoning (#1973)
1 parent 7ce684a commit 1933346

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed

CHANGELOG.md

+12
Original file line numberDiff line numberDiff line change
@@ -3054,3 +3054,15 @@ This is a full list of proofs that have changed form to use irrelevant instance
30543054
```agda
30553055
↭-reverse : (xs : List A) → reverse xs ↭ xs
30563056
```
3057+
3058+
* Added new file `Relation.Binary.Reasoning.Base.Apartness`
3059+
3060+
This is how to use it:
3061+
```agda
3062+
_ : a # d
3063+
_ = begin-apartness
3064+
a ≈⟨ a≈b ⟩
3065+
b #⟨ b#c ⟩
3066+
c ≈⟨ c≈d ⟩
3067+
d ∎
3068+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
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

Comments
 (0)