module Issue488 where
open import Data.Product using (∃-syntax; -,_; _×_; _,_)
open import Relation.Nullary using (¬_)
open import Relation.Binary.PropositionalEquality using (_≡_; refl; sym; trans)
module CounterExample where
data Term : Set where
A B C D : Term
data _—→_ : (M N : Term) → Set where
B—→C : B —→ C
C—→B : C —→ B
B—→A : B —→ A
C—→D : C —→ D
infix 2 _—↠_
infix 1 begin_
infixr 2 _—→⟨_⟩_
infix 3 _∎
data _—↠_ : Term → Term → Set where
_∎ : ∀ M
---------
→ M —↠ M
_—→⟨_⟩_ : ∀ L {M N}
→ L —→ M
→ M —↠ N
---------
→ L —↠ N
begin_ : ∀ {M N}
→ M —↠ N
------
→ M —↠ N
begin M—↠N = M—↠N
diamond : ∀ {L M N}
→ ((L —→ M) × (L —→ N))
-----------------------------
→ ∃[ P ] ((M —↠ P) × (N —↠ P))
diamond (B—→A , B—→A) = -, ((A ∎) , (A ∎))
diamond (C—→B , C—→B) = -, ((B ∎) , (B ∎))
diamond (B—→C , B—→C) = -, ((C ∎) , (C ∎))
diamond (C—→D , C—→D) = -, ((D ∎) , (D ∎))
diamond (B—→C , B—→A) = -, ((begin C —→⟨ C—→B ⟩ B —→⟨ B—→A ⟩ A ∎) , (A ∎))
diamond (C—→B , C—→D) = -, ((begin B —→⟨ B—→C ⟩ C —→⟨ C—→D ⟩ D ∎) , (D ∎))
diamond (B—→A , B—→C) = -, ((A ∎) , (begin C —→⟨ C—→B ⟩ B —→⟨ B—→A ⟩ A ∎))
diamond (C—→D , C—→B) = -, ((D ∎) , (begin B —→⟨ B—→C ⟩ C —→⟨ C—→D ⟩ D ∎))
A—↠A : ∀ {P} → A —↠ P → P ≡ A
A—↠A (.A ∎) = refl
D—↠D : ∀ {P} → D —↠ P → P ≡ D
D—↠D (.D ∎) = refl
¬confluence : ¬ (∀ {L M N}
→ ((L —↠ M) × (L —↠ N))
-----------------------------
→ ∃[ P ] ((M —↠ P) × (N —↠ P)))
¬confluence confluence
with confluence ( (begin B —→⟨ B—→A ⟩ A ∎)
, (begin B —→⟨ B—→C ⟩ C —→⟨ C—→D ⟩ D ∎) )
... | (P , (A—↠P , D—↠P))
with trans (sym (A—↠A A—↠P)) (D—↠D D—↠P)
... | ()
module DeterministicImpliesDiamondPropertyAndConfluence where
infix 2 _—↠_
infix 1 begin_
infixr 2 _—→⟨_⟩_
infix 3 _∎
postulate
Term : Set
_—→_ : Term → Term → Set
postulate
deterministic : ∀ {L M N}
→ L —→ M
→ L —→ N
------
→ M ≡ N
data _—↠_ : Term → Term → Set where
_∎ : ∀ M
---------
→ M —↠ M
_—→⟨_⟩_ : ∀ L {M N}
→ L —→ M
→ M —↠ N
-------
→ L —↠ N
begin_ : ∀ {M N}
→ M —↠ N
------
→ M —↠ N
begin M—↠N = M—↠N
diamond : ∀ {L M N}
→ ((L —→ M) × (L —→ N))
--------------------
→ ∃[ P ] ((M —↠ P) × (N —↠ P))
diamond (L—→M , L—→N)
rewrite deterministic L—→M L—→N = -, ((_ ∎) , (_ ∎))
confluence : ∀ {L M N}
→ (L —↠ M)
→ (L —↠ N)
--------------------
→ ∃[ P ] ((M —↠ P) × (N —↠ P))
confluence {L} {.L} { N} (.L ∎) L—↠N = -, (L—↠N , (N ∎))
confluence {L} { M} {.L} L—↠M (.L ∎) = -, ((M ∎) , L—↠M)
confluence {L} { M} { N} (.L —→⟨ L—→M′ ⟩ M′—↠M) (.L —→⟨ L—→N′ ⟩ N′—↠N)
rewrite deterministic L—→M′ L—→N′ = confluence M′—↠M N′—↠N