module Deterministic.Deterministic where
open import Coinduction
open import Data.Colist
open import Data.Empty
open import Deterministic.Expr
open import Deterministic.EasyToWorkWith
[]∷-lemma : ∀ {e m ms} → e HasTrace [] → e HasTrace m ∷ ms → ⊥
[]∷-lemma (nop s₁) (nop s₂) = []∷-lemma (♭ s₁) s₂
deterministic : ∀ {e} ms₁ ms₂ →
e HasTrace ms₁ → e HasTrace ms₂ → ms₁ ≈ ms₂
deterministic [] [] s₁ s₂ = []
deterministic [] (m ∷ ms) s₁ s₂ = ⊥-elim ([]∷-lemma s₁ s₂)
deterministic (m ∷ ms) [] s₁ s₂ = ⊥-elim ([]∷-lemma s₂ s₁)
deterministic (m₁ ∷ ms₁) (m₂ ∷ ms₂) (nop s₁) (nop s₂) = deterministic _ _ s₁ s₂
deterministic (m ∷ ms₁) (.m ∷ ms₂) (tick s₁) (tick s₂) = m ∷ ♯ deterministic _ _ (♭ s₁) (♭ s₂)