{-# OPTIONS --sized-types #-}
open import Prelude
module Delay-monad.Bisimilarity.Transitivity-constructor
{a} {A : Type a} where
open import Equality.Propositional
open import Logical-equivalence using (_⇔_)
open import Prelude.Size
open import Function-universe equality-with-J hiding (Kind)
open import Delay-monad
open import Delay-monad.Bisimilarity hiding (never≉now)
open import Delay-monad.Bisimilarity.Negative
data Kind : Type where
strong weak : Kind
mutual
data Prog (i : Size) : Kind → Delay A ∞ → Delay A ∞ → Type a where
now : ∀ {k x} → Prog i k (now x) (now x)
later : ∀ {k x y} →
Prog′ i k (force x) (force y) →
Prog i k (later x) (later y)
laterʳ : ∀ {x y} → Prog i weak x (force y) → Prog i weak x (later y)
laterˡ : ∀ {x y} → Prog i weak (force x) y → Prog i weak (later x) y
reflP : ∀ {k} x → Prog i k x x
symP : ∀ {k x y} → Prog i k x y → Prog i k y x
transP : ∀ {k x y z} →
Prog i strong x y → Prog i k y z → Prog i k x z
record Prog′ (i : Size) (k : Kind) (x y : Delay A ∞) : Type a where
coinductive
field
force : {j : Size< i} → Prog j k x y
open Prog′ public
complete-strong : ∀ {i x y} →
[ i ] x ∼ y → Prog i strong x y
complete-strong now = now
complete-strong (later p) =
later λ { .force → complete-strong (force p) }
complete-weak : ∀ {i x y} → [ i ] x ≈ y → Prog i weak x y
complete-weak now = now
complete-weak (laterʳ p) = laterʳ (complete-weak p)
complete-weak (laterˡ p) = laterˡ (complete-weak p)
complete-weak (later p) =
later λ { .force → complete-weak (force p) }
data WHNF (i : Size) : Kind → Delay A ∞ → Delay A ∞ → Type a where
now : ∀ {k x} → WHNF i k (now x) (now x)
later : ∀ {k x y} →
Prog′ i k (force x) (force y) →
WHNF i k (later x) (later y)
laterʳ : ∀ {x y} →
WHNF i weak x (force y) → WHNF i weak x (later y)
laterˡ : ∀ {x y} →
WHNF i weak (force x) y → WHNF i weak (later x) y
reflW : ∀ {i k} x → WHNF i k x x
reflW (now x) = now
reflW (later x) = later λ { .force → reflP (force x) }
symW : ∀ {i k x y} → WHNF i k x y → WHNF i k y x
symW now = now
symW (later p) = later λ { .force → symP (force p) }
symW (laterʳ p) = laterˡ (symW p)
symW (laterˡ p) = laterʳ (symW p)
trans∼∼W : ∀ {i x y z} →
WHNF i strong x y → WHNF i strong y z → WHNF i strong x z
trans∼∼W now q = q
trans∼∼W (later p) (later q) =
later λ { .force → transP (force p) (force q) }
whnf∼ : ∀ {i x y} → Prog i strong x y → WHNF i strong x y
whnf∼ now = now
whnf∼ (later p) = later p
whnf∼ (reflP x) = reflW x
whnf∼ (symP p) = symW (whnf∼ p)
whnf∼ (transP p q) = trans∼∼W (whnf∼ p) (whnf∼ q)
mutual
sound-strong : ∀ {i x y} →
Prog i strong x y → [ i ] x ∼ y
sound-strong p = soundW-strong (whnf∼ p)
soundW-strong : ∀ {i x y} →
WHNF i strong x y → [ i ] x ∼ y
soundW-strong now = now
soundW-strong (later p) =
later λ { .force → sound-strong (force p) }
trans∼-W : ∀ {i k x y z} →
WHNF ∞ strong x y → WHNF i k y z → WHNF i k x z
trans∼-W now q = q
trans∼-W p (laterʳ q) = laterʳ (trans∼-W p q)
trans∼-W (later p) (laterˡ q) = laterˡ (trans∼-W (whnf∼ (force p)) q)
trans∼-W (later p) (later q) =
later λ { .force → transP (force p) (force q) }
whnf : ∀ {i k x y} → Prog ∞ k x y → WHNF i k x y
whnf now = now
whnf (later p) = later p
whnf (laterʳ p) = laterʳ (whnf p)
whnf (laterˡ p) = laterˡ (whnf p)
whnf (reflP x) = reflW x
whnf (symP p) = symW (whnf p)
whnf (transP p q) = trans∼-W (whnf p) (whnf q)
mutual
sound-weak : ∀ {i x y} → Prog ∞ weak x y → [ i ] x ≈ y
sound-weak p = soundW-weak (whnf p)
soundW-weak : ∀ {i x y} → WHNF ∞ weak x y → [ i ] x ≈ y
soundW-weak now = now
soundW-weak (laterʳ p) = laterʳ (soundW-weak p)
soundW-weak (laterˡ p) = laterˡ (soundW-weak p)
soundW-weak (later p) =
later λ { .force → sound-weak (force p) }
size-preserving⇔uninhabited :
(∀ {i x y} → Prog i weak x y → [ i ] x ≈ y) ⇔ ¬ A
size-preserving⇔uninhabited = record
{ to = (∀ {i x y} → Prog i weak x y → [ i ] x ≈ y) ↝⟨ (λ sound p q → sound (transP (complete-strong p) (complete-weak q))) ⟩
Transitivity-∼≈ˡ ↝⟨ _⇔_.to size-preserving-transitivity-∼≈ˡ⇔uninhabited ⟩□
¬ A □
; from = ¬ A ↝⟨ uninhabited→trivial ⟩
(∀ x y → x ≈ y) ↝⟨ (λ trivial {_ _ _} _ → trivial _ _) ⟩□
(∀ {i x y} → Prog i weak x y → [ i ] x ≈ y) □
}
not-fully-size-preserving :
(∀ {i k x y z} →
WHNF i strong x y → WHNF i k y z → WHNF i k x z) →
¬ A
not-fully-size-preserving trans x = contradiction ∞
where
never≉now : ∀ {i} → ¬ WHNF i weak never (now x)
never≉now (laterˡ p) = never≉now p
mutual
never≈now : ∀ {i} → WHNF i weak never (now x)
never≈now =
trans (later {y = record { force = now x }} never∼now)
(laterˡ now)
never∼now : ∀ {i} → Prog′ i strong never (now x)
force never∼now {j = j} = ⊥-elim (contradiction j)
contradiction : Size → ⊥
contradiction i = never≉now (never≈now {i = i})
partially-adapted-counterexample :
(∀ {i x} → Prog i strong never x → x ≡ never) →
¬ A
partially-adapted-counterexample convert x = contradiction ∞
where
mutual
now∼→≡now : ∀ {i x y} → Prog i strong (now x) y → y ≡ now x
now∼→≡now now = refl
now∼→≡now (reflP _) = refl
now∼→≡now (symP p) = ∼now→≡now p
now∼→≡now (transP p q) rewrite now∼→≡now p = now∼→≡now q
∼now→≡now : ∀ {i x y} → Prog i strong x (now y) → x ≡ now y
∼now→≡now now = refl
∼now→≡now (reflP _) = refl
∼now→≡now (symP p) = now∼→≡now p
∼now→≡now (transP p q) rewrite ∼now→≡now q = ∼now→≡now p
mutual
now≉Pnever : ∀ {i} → ¬ Prog i weak (now x) never
now≉Pnever (laterʳ p) = now≉Pnever p
now≉Pnever (symP p) = never≉Pnow p
now≉Pnever (transP p q) rewrite now∼→≡now p = now≉Pnever q
never≉Pnow : ∀ {i} → ¬ Prog i weak never (now x)
never≉Pnow (laterˡ p) = never≉Pnow p
never≉Pnow (symP p) = now≉Pnever p
never≉Pnow (transP p q) rewrite convert p = never≉Pnow q
mutual
never≈Pnow : ∀ {i} → Prog i weak never (now x)
never≈Pnow =
transP (later {y = record { force = now x }} never∼Pnow)
(laterˡ now)
never∼Pnow : ∀ {i} → Prog′ i strong never (now x)
force never∼Pnow {j = j} = ⊥-elim (contradiction j)
contradiction : Size → ⊥
contradiction i = never≉Pnow (never≈Pnow {i = i})
exampleP : ∀ {i} → Prog i weak never never
exampleP {i} =
transP (reflP {i = i} never) (later λ { .force → exampleP })
example : ∀ {i} → [ i ] never ≈ never
example = sound-weak exampleP
counterargument : ∀ {i} → [ i ] never ≈ never {A = A}
counterargument =
transitive-∼ˡ (reflexive never)
(later λ { .force → counterargument })