1
------------------------------------------------------------------------
3
------------------------------------------------------------------------
5
{-# OPTIONS --universe-polymorphism #-}
10
open import Function.Equivalence as Equiv using (_⇔_)
12
open import Relation.Binary
14
------------------------------------------------------------------------
19
syntax Plus R x y = x [ R ]⁺ y
21
data Plus {a ℓ} {A : Set a} (_∼_ : Rel A ℓ) : Rel A (a ⊔ ℓ) where
22
[_] : ∀ {x y} (x∼y : x ∼ y) → x [ _∼_ ]⁺ y
23
_∼⁺⟨_⟩_ : ∀ x {y z} (x∼⁺y : x [ _∼_ ]⁺ y) (y∼⁺z : y [ _∼_ ]⁺ z) →
26
-- "Equational" reasoning notation. Example:
33
finally : ∀ {a ℓ} {A : Set a} {_∼_ : Rel A ℓ} x y →
34
x [ _∼_ ]⁺ y → x [ _∼_ ]⁺ y
37
syntax finally x y x∼⁺y = x ∼⁺⟨ x∼⁺y ⟩∎ y ∎
44
map : ∀ {a a′ ℓ ℓ′} {A : Set a} {A′ : Set a′}
45
{_R_ : Rel A ℓ} {_R′_ : Rel A′ ℓ′} {f : A → A′} →
46
_R_ =[ f ]⇒ _R′_ → Plus _R_ =[ f ]⇒ Plus _R′_
47
map R⇒R′ [ xRy ] = [ R⇒R′ xRy ]
48
map R⇒R′ (x ∼⁺⟨ xR⁺z ⟩ zR⁺y) =
49
_ ∼⁺⟨ map R⇒R′ xR⁺z ⟩ map R⇒R′ zR⁺y
51
------------------------------------------------------------------------
52
-- Alternative definition of transitive closure
54
-- A generalisation of Data.List.Nonempty.List⁺.
59
syntax Plus′ R x y = x ⟨ R ⟩⁺ y
61
data Plus′ {a ℓ} {A : Set a} (_∼_ : Rel A ℓ) : Rel A (a ⊔ ℓ) where
62
[_] : ∀ {x y} (x∼y : x ∼ y) → x ⟨ _∼_ ⟩⁺ y
63
_∷_ : ∀ {x y z} (x∼y : x ∼ y) (y∼⁺z : y ⟨ _∼_ ⟩⁺ z) → x ⟨ _∼_ ⟩⁺ z
67
_++_ : ∀ {a ℓ} {A : Set a} {_∼_ : Rel A ℓ} {x y z} →
68
x ⟨ _∼_ ⟩⁺ y → y ⟨ _∼_ ⟩⁺ z → x ⟨ _∼_ ⟩⁺ z
69
[ x∼y ] ++ y∼⁺z = x∼y ∷ y∼⁺z
70
(x∼y ∷ y∼⁺z) ++ z∼⁺u = x∼y ∷ (y∼⁺z ++ z∼⁺u)
72
-- Plus and Plus′ are equivalent.
74
equivalent : ∀ {a ℓ} {A : Set a} {_∼_ : Rel A ℓ} {x y} →
75
Plus _∼_ x y ⇔ Plus′ _∼_ x y
76
equivalent {_∼_ = _∼_} = Equiv.equivalent complete sound
78
complete : Plus _∼_ ⇒ Plus′ _∼_
79
complete [ x∼y ] = [ x∼y ]
80
complete (x ∼⁺⟨ x∼⁺y ⟩ y∼⁺z) = complete x∼⁺y ++ complete y∼⁺z
82
sound : Plus′ _∼_ ⇒ Plus _∼_
83
sound [ x∼y ] = [ x∼y ]
84
sound (x∼y ∷ y∼⁺z) = _ ∼⁺⟨ [ x∼y ] ⟩ sound y∼⁺z