{-# OPTIONS --without-K --guardedness --no-sized-types #-}
open import prelude
open import RTC
open import equality
module RTC.eval-epsilon {I : Set}
(w : IS I)
(fun-ext : {X : Set} {Y : Pow X} (f g : (x : X) → Y x) (eq : (x : X) → (f x) ≡ (g x)) → f ≡ g) where
open IS w renaming (Command to A ; Response to D ; next to n)
open IS (w *) renaming (Command to A* ; Response to D* ; next to n*)
open import RTC.comonad
open import Simulations using (linear-evaluation)
open import RTC.WTC w fun-ext
open import Bisimulation
private eval : ν (w * ⊥) ⊂ ν (w ⊥)
eval T = linear-evaluation (w *) w (counit.epsilon w) refl T
private lave : ν (w * ⊥) ⊂ ν (w ⊥)
lave {i} T = νIntro (ν (w * ⊥)) elim T
private R : Pow (states (w ⊥))
R (i , (T₁ , T₂)) = Σ (ν (w * ⊥) i) (λ T → (T₁ ≡ eval T) × T₂ ≡ lave T)
private init : {i : I} (T : ν (w * ⊥) i) → R (i , ((eval T) , (lave T)))
init T = T , (refl , refl)
private single-a : {i : I} (a : A i) → A* i
single-a a = a ◂ λ d → Leaf
private coalg : R ⊂ Φ (w ⊥) R
coalg {(i , (T₁ , T₂))} (T , (refl , refl)) =
let d₁ : (a₁ : A i) → D i a₁
d₁ = fst (νElim T₁) in
let d₂ : (a₂ : A i) → D i a₂
d₂ = fst (νElim T₂) in
let d : (a* : A* i) → D* i a*
d = fst (νElim T) in
refl , (λ (a : A i) →
let newT₁ : ν (w ⊥) (n a (d₁ a))
newT₁ = snd (νElim T₁) a in
let newT₂ : ν (w ⊥) (n a (d₂ a))
newT₂ = snd (νElim T₂) a in
let newT : ν (w * ⊥) (n* (single-a a) (d (single-a a)))
newT = snd (νElim T) (single-a a) in
(newT , (refl , refl)))
lemma : {i : I} (T : ν (w * ⊥) i) →
linear-evaluation (w *) w (epsilon w) refl T
≈
νIntro (ν (w * ⊥)) elim T
lemma {i} T = record { carrier = R ; coalg = coalg ; init = init T }