Theorems
⊢ FUNPOW Tau n (Ret x) = spin ⇒ F
⊢ FUNPOW Tau n (Ret x) = FUNPOW Tau m (Ret y) ⇒ n = m ∧ x = y
⊢ t = FUNPOW Tau (SUC n) t ⇔ t = spin
⊢ FUNPOW Tau n (Vis a g) = FUNPOW Tau m (Vis e k) ⇒ n = m ∧ a = e ∧ g = k
⊢ (∀r. ∃n r'. abs r = FUNPOW Tau (SUC n) (abs r')) ⇔ ∀r. abs r = spin
⊢ itree_bind (FUNPOW Tau n t) g = FUNPOW Tau n (itree_bind t g)
⊢ t = FUNPOW Tau n t' ⇒ itree_wbisim t t'
⊢ Ret x ≠ FUNPOW Tau n (Vis a g) ∧ Vis a g ≠ FUNPOW Tau n (Ret x)
⊢ FUNPOW Tau n' (Ret x) ≠ FUNPOW Tau n (Vis a g)
⊢ itree_wbisim (FUNPOW Tau n x) x
⊢ itree_wbisim x y ⇒ itree_wbisim (FUNPOW Tau n x) (FUNPOW Tau n' y)
⊢ FUNPOW Tau n (Vis e k) = spin ⇒ F
⊢ ∀x y. Ret x = Ret y ⇔ x = y
⊢ ∀x y. Tau x = Tau y ⇔ x = y
⊢ INJ Tau 𝕌(:(α, β, γ) itree) 𝕌(:(α, β, γ) itree)
⊢ ∀x f y g. Vis x f = Vis y g ⇔ x = y ∧ f = g
⊢ after_taus R x y ⇒ after_taus R (FUNPOW Tau n x) y
⊢ after_taus R x y ⇒ after_taus R x (FUNPOW Tau n y)
after_taus_cases
⊢ ∀R a0 a1.
after_taus R a0 a1 ⇔
R a0 a1 ∨ (∃x. a0 = Tau x ∧ after_taus R x a1) ∨
∃y. a1 = Tau y ∧ after_taus R a0 y
after_taus_ind
⊢ ∀R after_taus'.
(∀x y. R x y ⇒ after_taus' x y) ∧
(∀x y. after_taus' x y ⇒ after_taus' (Tau x) y) ∧
(∀x y. after_taus' x y ⇒ after_taus' x (Tau y)) ⇒
∀a0 a1. after_taus R a0 a1 ⇒ after_taus' a0 a1
⊢ after_taus $= t t' ⇒ t' = spin ⇒ t = spin
⊢ after_taus $= t t' ⇔
(∃t''. strip_tau t t'' ∧ strip_tau t' t'') ∨ t = spin ∧ t' = spin
⊢ after_taus itree_wbisim t t' ⇔ itree_wbisim t t'
⊢ after_taus itree_wbisim t t' ⇒ t' = spin ⇒ t = spin
⊢ ∀R x y. R x y ⇒ after_taus R x y
after_taus_rules
⊢ ∀R. (∀x y. R x y ⇒ after_taus R x y) ∧
(∀x y. after_taus R x y ⇒ after_taus R (Tau x) y) ∧
∀x y. after_taus R x y ⇒ after_taus R x (Tau y)
after_taus_strongind
⊢ ∀R after_taus'.
(∀x y. R x y ⇒ after_taus' x y) ∧
(∀x y. after_taus R x y ∧ after_taus' x y ⇒ after_taus' (Tau x) y) ∧
(∀x y. after_taus R x y ∧ after_taus' x y ⇒ after_taus' x (Tau y)) ⇒
∀a0 a1. after_taus R a0 a1 ⇒ after_taus' a0 a1
⊢ ∀R x y. after_taus R x y ⇒ after_taus R (Tau x) y
⊢ ∀R x y. after_taus R x y ⇒ after_taus R x (Tau y)
⊢ (∀r. strong_bisim_upfrom_abs (abs,abs') (abs r) (abs' r)) ⇔ abs = abs'
⊢ (∀r. strong_bisim_upfrom_abs (abs,abs') (abs r) (abs' r)) ∧
strong_bisim_upfrom_abs (abs,abs') t t' ⇒
t = t'
⊢ (∀r. weak_bisim_upfrom_abs (abs,abs') (abs r) (abs' r)) ⇔
∀r. itree_wbisim (abs r) (abs' r)
⊢ (∀r. weak_bisim_upfrom_abs (abs,abs') (abs r) (abs' r)) ∧
weak_bisim_upfrom_abs (abs,abs') t t' ⇒
itree_wbisim t t'
⊢ DATATYPE (itree Ret Tau Vis)
datatype_itree_el
⊢ DATATYPE (itree_el Event Return Silence)
datatype_itree_next
⊢ DATATYPE (itree_next Ret' Tau' Vis')
⊢ (∀x y. Ret x = Ret y ⇔ x = y) ∧ (∀x y. Tau x = Tau y ⇔ x = y) ∧
∀x f y g. Vis x f = Vis y g ⇔ x = y ∧ f = g
⊢ itree_CASE (Ret r) ret tau vis = ret r ∧
itree_CASE (Tau t) ret tau vis = tau t ∧
itree_CASE (Vis a g) ret tau vis = vis a g
⊢ ∀M M' ret tau vis ret' tau' vis'.
M = M' ∧ (∀x. M' = Ret x ⇒ ret x = ret' x) ∧
(∀t. M' = Tau t ⇒ tau t = tau' t) ∧
(∀a g. M' = Vis a g ⇒ vis a g = vis' a g) ⇒
itree_CASE M ret tau vis = itree_CASE M' ret' tau' vis'
⊢ ∀f. f (itree_CASE t ret tau vis) ⇔
(∃r. t = Ret r ∧ f (ret r)) ∨ (∃u. t = Tau u ∧ f (tau u)) ∨
∃a g. t = Vis a g ∧ f (vis a g)
⊢ itree_CASE t ret tau vis = v ⇔
(∃r. t = Ret r ∧ ret r = v) ∨ (∃u. t = Tau u ∧ tau u = v) ∨
∃a g. t = Vis a g ∧ vis a g = v
⊢ itree_bind (itree_bind t k) k' = itree_bind t (λx. itree_bind (k x) k')
⊢ ∀t k1 k2.
(∀r. itree_wbisim (k1 r) (k2 r)) ⇒
itree_wbisim (itree_bind t k1) (itree_bind t k2)
⊢ ∀a b k. itree_wbisim a b ⇒ itree_wbisim (itree_bind a k) (itree_bind b k)
⊢ ∀a b k1 k2.
itree_wbisim a b ∧ (∀r. itree_wbisim (k1 r) (k2 r)) ⇒
itree_wbisim (itree_bind a k1) (itree_bind b k2)
⊢ itree_bind t k = Ret r ⇒ ∃r'. t = Ret r' ∧ k r' = Ret r
⊢ ∀u u' k. strip_tau u u' ⇒ itree_wbisim (itree_bind u k) (itree_bind u' k)
⊢ itree_bind (Ret r) k = k r ∧
itree_bind (Tau t) k = Tau (itree_bind t k) ∧
itree_bind (Vis e k') k = Vis e (λx. itree_bind (k' x) k)
⊢ ∀u k k' e.
strip_tau u (Vis e k') ⇒
strip_tau (itree_bind u k) (Vis e (λx. itree_bind (k' x) k))
⊢ ∀t1 t2.
t1 = t2 ⇔
∃R. R t1 t2 ∧ (∀x t. R (Ret x) t ⇒ t = Ret x) ∧
(∀u t. R (Tau u) t ⇒ ∃v. t = Tau v ∧ R u v) ∧
∀a f t. R (Vis a f) t ⇒ ∃g. t = Vis a g ∧ ∀s. R (f s) (g s)
⊢ ∀t. (∃x. t = Ret x) ∨ (∃u. t = Tau u) ∨ ∃a g. t = Vis a g
⊢ ∀R. rel_to_reln R ⊆
rel_to_reln itree_wbisim ∪
wbisim_functional
(upto_taus_func (rel_to_reln R) ∪ rel_to_reln itree_wbisim) ⇒
rel_to_reln R ⊆ rel_to_reln itree_wbisim
⊢ Ret x ≠ Tau t ∧ Ret x ≠ Vis e g ∧ Tau t ≠ Vis e g
itree_el_11
⊢ (∀a0 a0'. Event a0 = Event a0' ⇔ a0 = a0') ∧
∀a0 a0'. Return a0 = Return a0' ⇔ a0 = a0'
itree_el_Axiom
⊢ ∀f0 f1 f2. ∃h.
(∀a0. h (Event a0) = f0 a0) ∧ (∀a0. h (Return a0) = f1 a0) ∧
h Silence = f2
itree_el_MAP_CONG
⊢ ∀f1 f2 g1 g2 x.
(∀a. a ∈ itree_elSET1 x ⇒ f1 a = g1 a) ∧
(∀a. a ∈ itree_elSET2 x ⇒ f2 a = g2 a) ⇒
itree_elMAP f1 f2 x = itree_elMAP g1 g2 x
itree_el_MAP_ID
⊢ itree_elMAP I I = I
itree_el_MAP_IMAGE1
⊢ ∀f1 f2 x. itree_elSET1 (itree_elMAP f1 f2 x) = IMAGE f1 (itree_elSET1 x)
itree_el_MAP_IMAGE2
⊢ ∀f1 f2 x. itree_elSET2 (itree_elMAP f1 f2 x) = IMAGE f2 (itree_elSET2 x)
itree_el_MAP_O
⊢ itree_elMAP g1 g2 ∘ itree_elMAP f1 f2 = itree_elMAP (g1 ∘ f1) (g2 ∘ f2)
itree_el_bnd1
⊢ ∀x. cardleq (itree_elSET1 x) 𝕌(:num)
itree_el_bnd2
⊢ ∀x. cardleq (itree_elSET2 x) 𝕌(:num)
itree_el_case_cong
⊢ ∀M M' f f0 v.
M = M' ∧ (∀a0. M' = Event a0 ⇒ f a0 = f' a0) ∧
(∀a0. M' = Return a0 ⇒ f0 a0 = f0' a0) ∧ (M' = Silence ⇒ v = v') ⇒
itree_el_CASE M f f0 v = itree_el_CASE M' f' f0' v'
itree_el_case_eq
⊢ itree_el_CASE x f f0 v = v' ⇔
(∃e. x = Event e ∧ f e = v') ∨ (∃r. x = Return r ∧ f0 r = v') ∨
x = Silence ∧ v = v'
itree_el_distinct
⊢ (∀a0' a0. Event a0 ≠ Return a0') ∧ (∀a0. Event a0 ≠ Silence) ∧
∀a0. Return a0 ≠ Silence
itree_el_induction
⊢ ∀P. (∀e. P (Event e)) ∧ (∀r. P (Return r)) ∧ P Silence ⇒ ∀i. P i
itree_el_inh1
⊢ ∀a1. a1 ∈ itree_elSET1 ((λa1. itree_el_ABS ((λa1. INL a1) a1)) a1)
itree_el_inh2
⊢ ∀a2. a2 ∈ itree_elSET2 ((λa2. itree_el_ABS ((λa2. INR (INL a2)) a2)) a2)
itree_el_nchotomy
⊢ ∀ii. (∃e. ii = Event e) ∨ (∃r. ii = Return r) ∨ ii = Silence
⊢ itree_el (Ret r) [] = Return r ∧ itree_el (Tau t) [] = Silence ∧
itree_el (Vis e g) [] = Event e ∧ itree_el (Ret r) (NONE::ns) = Silence ∧
itree_el (Tau t) (NONE::ns) = itree_el t ns ∧
itree_el (Vis e g) (NONE::ns) = Silence ∧
itree_el (Ret r) (SOME a::ns) = Silence ∧
itree_el (Tau t) (SOME a::ns) = Silence ∧
itree_el (Vis e g) (SOME a::ns) = itree_el (g a) ns
itree_el_wit
⊢ ∀a1 a2.
itree_elSET1
((λa1 a2. itree_el_ABS ((λa1 a2. K INR ARB (K INR ARB ARB)) a1 a2))
a1 a2) ⊆ ∅ ∧
itree_elSET2
((λa1 a2. itree_el_ABS ((λa1 a2. K INR ARB (K INR ARB ARB)) a1 a2))
a1 a2) ⊆ ∅
⊢ ∀body body' seed seed'.
itree_wbisim seed seed' ∧
(∀seed seed'. itree_wbisim (body seed) (body' seed')) ⇒
itree_wbisim (itree_iter body seed) (itree_iter body' seed')
⊢ ∀t k1 k2.
(∀r. itree_wbisim (k1 r) (k2 r)) ⇒
itree_wbisim (itree_iter k1 t) (itree_iter k2 t)
⊢ ∀body seed seed'.
itree_wbisim seed seed' ∧ itree_wbisim (body seed) (body seed') ⇒
itree_wbisim (itree_iter body seed) (itree_iter body seed')
⊢ itree_iter body seed =
itree_bind (body seed)
(λx. case x of INL a => Tau (itree_iter body a) | INR b => Ret b)
itree_next_11
⊢ (∀a0 a0'. Ret' a0 = Ret' a0' ⇔ a0 = a0') ∧
(∀a0 a0'. Tau' a0 = Tau' a0' ⇔ a0 = a0') ∧
∀a0 a1 a0' a1'. Vis' a0 a1 = Vis' a0' a1' ⇔ a0 = a0' ∧ a1 = a1'
itree_next_Axiom
⊢ ∀f0 f1 f2. ∃h.
(∀a0. h (Ret' a0) = f0 a0) ∧ (∀a0. h (Tau' a0) = f1 a0) ∧
∀a0 a1. h (Vis' a0 a1) = f2 a0 a1
itree_next_MAP_CONG
⊢ ∀f1 f2 f3 g1 g2 g3 x.
(∀a. a ∈ itree_nextSET1 x ⇒ f1 a = g1 a) ∧
(∀a. a ∈ itree_nextSET2 x ⇒ f2 a = g2 a) ∧
(∀a. a ∈ itree_nextSET3 x ⇒ f3 a = g3 a) ⇒
itree_nextMAP f1 f2 f3 x = itree_nextMAP g1 g2 g3 x
itree_next_MAP_ID
⊢ itree_nextMAP I I I = I
itree_next_MAP_IMAGE1
⊢ ∀f1 f2 f3 x.
itree_nextSET1 (itree_nextMAP f1 f2 f3 x) = IMAGE f1 (itree_nextSET1 x)
itree_next_MAP_IMAGE2
⊢ ∀f1 f2 f3 x.
itree_nextSET2 (itree_nextMAP f1 f2 f3 x) = IMAGE f2 (itree_nextSET2 x)
itree_next_MAP_IMAGE3
⊢ ∀f1 f2 f3 x.
itree_nextSET3 (itree_nextMAP f1 f2 f3 x) = IMAGE f3 (itree_nextSET3 x)
itree_next_MAP_O
⊢ itree_nextMAP g1 g2 g3 ∘ itree_nextMAP f1 f2 f3 =
itree_nextMAP (g1 ∘ f1) (g2 ∘ f2) (g3 ∘ f3)
itree_next_bnd1
⊢ ∀x. cardleq (itree_nextSET1 x) 𝕌(:num + 'b1)
itree_next_bnd2
⊢ ∀x. cardleq (itree_nextSET2 x) 𝕌(:num + 'b1)
itree_next_bnd3
⊢ ∀x. cardleq (itree_nextSET3 x) 𝕌(:num + 'b1)
itree_next_case_cong
⊢ ∀M M' f f0 f1.
M = M' ∧ (∀a0. M' = Ret' a0 ⇒ f a0 = f' a0) ∧
(∀a0. M' = Tau' a0 ⇒ f0 a0 = f0' a0) ∧
(∀a0 a1. M' = Vis' a0 a1 ⇒ f1 a0 a1 = f1' a0 a1) ⇒
itree_next_CASE M f f0 f1 = itree_next_CASE M' f' f0' f1'
itree_next_case_eq
⊢ itree_next_CASE x f f0 f1 = v ⇔
(∃r. x = Ret' r ∧ f r = v) ∨ (∃s. x = Tau' s ∧ f0 s = v) ∨
∃e f'. x = Vis' e f' ∧ f1 e f' = v
itree_next_distinct
⊢ (∀a0' a0. Ret' a0 ≠ Tau' a0') ∧ (∀a1 a0' a0. Ret' a0 ≠ Vis' a0' a1) ∧
∀a1 a0' a0. Tau' a0 ≠ Vis' a0' a1
itree_next_induction
⊢ ∀P. (∀r. P (Ret' r)) ∧ (∀s. P (Tau' s)) ∧ (∀e f. P (Vis' e f)) ⇒ ∀i. P i
itree_next_inh1
⊢ ∀a1.
a1 ∈
itree_nextSET1
((λa1. itree_next_ABS ((λa1. INR (INR (flip $, ARB a1))) a1)) a1)
itree_next_inh2
⊢ ∀a2. a2 ∈ itree_nextSET2 ((λa2. itree_next_ABS ((λa2. INL a2) a2)) a2)
itree_next_inh3
⊢ ∀a3.
a3 ∈ itree_nextSET3 ((λa3. itree_next_ABS ((λa3. INR (INL a3)) a3)) a3)
itree_next_nchotomy
⊢ ∀ii. (∃r. ii = Ret' r) ∨ (∃s. ii = Tau' s) ∨ ∃e f. ii = Vis' e f
itree_next_wit1
⊢ ∀a1 a2 a3.
itree_nextSET1
((λa1 a2 a3. itree_next_ABS ((λa1 a2 a3. (K ∘ INL) a2 ARB) a1 a2 a3))
a1 a2 a3) ⊆ ∅ ∧
itree_nextSET2
((λa1 a2 a3. itree_next_ABS ((λa1 a2 a3. (K ∘ INL) a2 ARB) a1 a2 a3))
a1 a2 a3) ⊆ {a2} ∧
itree_nextSET3
((λa1 a2 a3. itree_next_ABS ((λa1 a2 a3. (K ∘ INL) a2 ARB) a1 a2 a3))
a1 a2 a3) ⊆ ∅
itree_next_wit2
⊢ ∀a1 a2 a3.
itree_nextSET1
((λa1 a2 a3.
itree_next_ABS
((λa1 a2 a3. K INR ARB ((K ∘ INL) a3 ARB)) a1 a2 a3)) a1 a2 a3) ⊆
∅ ∧
itree_nextSET2
((λa1 a2 a3.
itree_next_ABS
((λa1 a2 a3. K INR ARB ((K ∘ INL) a3 ARB)) a1 a2 a3)) a1 a2 a3) ⊆
∅ ∧
itree_nextSET3
((λa1 a2 a3.
itree_next_ABS
((λa1 a2 a3. K INR ARB ((K ∘ INL) a3 ARB)) a1 a2 a3)) a1 a2 a3) ⊆
{a3}
⊢ strong_bisim_upfrom_abs (abs,abs') t t
⊢ ∀t1 t2.
t1 = t2 ⇔
∃R. R t1 t2 ∧ (∀x t. R (Ret x) t ⇒ t = Ret x) ∧
(∀u t. R (Tau u) t ⇒ ∃v. t = Tau v ∧ (R u v ∨ u = v)) ∧
∀a f t.
R (Vis a f) t ⇒ ∃g. t = Vis a g ∧ ∀s. R (f s) (g s) ∨ f s = g s
⊢ itree_unfold f seed =
case f seed of
Ret' r => Ret r
| Tau' s => Tau (itree_unfold f s)
| Vis' e g => Vis e (itree_unfold f ∘ g)
⊢ itree_wbisim t (Ret x) ⇒ ∃n. t = FUNPOW Tau n (Ret x)
⊢ itree_wbisim t (Vis a g) ⇒
∃n k. t = FUNPOW Tau n (Vis a k) ∧ ∀r. itree_wbisim (k r) (g r)
itree_wbisim_cases
⊢ ∀a0 a1.
itree_wbisim a0 a1 ⇔
(∃t t'. a0 = Tau t ∧ a1 = Tau t' ∧ itree_wbisim t t') ∨
(∃e k k'.
strip_tau a0 (Vis e k) ∧ strip_tau a1 (Vis e k') ∧
∀r. itree_wbisim (k r) (k' r)) ∨
∃r. strip_tau a0 (Ret r) ∧ strip_tau a1 (Ret r)
itree_wbisim_coind
⊢ ∀itree_wbisim'.
(∀a0 a1.
itree_wbisim' a0 a1 ⇒
(∃t t'. a0 = Tau t ∧ a1 = Tau t' ∧ itree_wbisim' t t') ∨
(∃e k k'.
strip_tau a0 (Vis e k) ∧ strip_tau a1 (Vis e k') ∧
∀r. itree_wbisim' (k r) (k' r)) ∨
∃r. strip_tau a0 (Ret r) ∧ strip_tau a1 (Ret r)) ⇒
∀a0 a1. itree_wbisim' a0 a1 ⇒ itree_wbisim a0 a1
⊢ ∀R. (∀t t'.
R t t' ⇒
(∃t2 t3. t = Tau t2 ∧ t' = Tau t3 ∧ (R t2 t3 ∨ itree_wbisim t2 t3)) ∨
(∃e k k'.
strip_tau t (Vis e k) ∧ strip_tau t' (Vis e k') ∧
∀r. R (k r) (k' r) ∨ itree_wbisim (k r) (k' r)) ∨
(∃r. strip_tau t (Ret r) ∧ strip_tau t' (Ret r)) ∨
itree_wbisim t t') ⇒
∀t t'. R t t' ⇒ itree_wbisim t t'
⊢ ∀R. rel_to_reln R ⊆
rel_to_reln itree_wbisim ∪
wbisim_functional (set_companion wbisim_functional (rel_to_reln R)) ⇒
rel_to_reln R ⊆ rel_to_reln itree_wbisim
itree_wbisim_rules
⊢ (∀t t'. itree_wbisim t t' ⇒ itree_wbisim (Tau t) (Tau t')) ∧
(∀e k k' t t'.
strip_tau t (Vis e k) ∧ strip_tau t' (Vis e k') ∧
(∀r. itree_wbisim (k r) (k' r)) ⇒
itree_wbisim t t') ∧
∀r t t'. strip_tau t (Ret r) ∧ strip_tau t' (Ret r) ⇒ itree_wbisim t t'
⊢ ∀t t' t''. itree_wbisim t t' ∧ strip_tau t t'' ⇒ itree_wbisim t'' t'
⊢ ∀t t' v. itree_wbisim t t' ∧ strip_tau t (Ret v) ⇒ strip_tau t' (Ret v)
⊢ ∀t t' e k.
itree_wbisim t t' ∧ strip_tau t (Vis e k) ⇒
∃k'. strip_tau t' (Vis e k') ∧ ∀r. itree_wbisim (k r) (k' r)
⊢ itree_wbisim t t' ⇔
t = spin ∧ t' = spin ∨ (∃r. strip_tau t (Ret r) ∧ strip_tau t' (Ret r)) ∨
∃e k k'.
strip_tau t (Vis e k) ∧ strip_tau t' (Vis e k') ∧
∀l. itree_wbisim (k l) (k' l)
⊢ ∀t t' t''. itree_wbisim t t' ∧ strip_tau t' t'' ⇒ itree_wbisim t t''
⊢ ∀R. (∀t t'.
R t t' ⇒
(∃t2 t3. t = Tau t2 ∧ t' = Tau t3 ∧ (R t2 t3 ∨ itree_wbisim t2 t3)) ∨
(∃e k k'.
strip_tau t (Vis e k) ∧ strip_tau t' (Vis e k') ∧
∀r. R (k r) (k' r) ∨ itree_wbisim (k r) (k' r)) ∨
∃r. strip_tau t (Ret r) ∧ strip_tau t' (Ret r)) ⇒
∀t t'. R t t' ⇒ itree_wbisim t t'
⊢ ∀t t'. itree_wbisim t t' ⇒ itree_wbisim t' t
⊢ ∀t t'. itree_wbisim (Tau t) t' ⇒ itree_wbisim t t'
⊢ (itree_wbisim (Tau t1) t2 ⇔ itree_wbisim t1 t2) ∧
(itree_wbisim t1 (Tau t2) ⇔ itree_wbisim t1 t2)
⊢ ∀t t' t''. itree_wbisim t t' ∧ itree_wbisim t' t'' ⇒ itree_wbisim t t''
⊢ ∀e k1 k2.
(∀r. itree_wbisim (k1 r) (k2 r)) ⇒ itree_wbisim (Vis e k1) (Vis e k2)
⊢ itree_wbisim (Vis a g) (Vis a' g') ⇔
a = a' ∧ ∀r. itree_wbisim (g r) (g' r)
⊢ itree_wbisim t t' ⇒ weak_bisim_upfrom_abs (abs,abs') t t'
⊢ itree_wbisim t' t'' ⇒ weak_bisim_upfrom_abs (abs,abs) t' t''
⊢ ∀n. spin = FUNPOW Tau n spin
⊢ itree_bind spin k = spin
⊢ ∀t. strip_tau spin t ⇒ F
⊢ ∀t1 t2. strip_tau t1 t2 ⇒ ∃n. t1 = FUNPOW Tau n t2
⊢ (∀u. t ≠ Tau u) ⇒ strip_tau (FUNPOW Tau n t) t
⊢ ∀t t' n. strip_tau t t' ⇒ strip_tau (FUNPOW Tau n t) t'
strip_tau_cases
⊢ ∀a0 a1.
strip_tau a0 a1 ⇔
(∃t. a0 = Tau t ∧ strip_tau t a1) ∨
(∃e k. a0 = Vis e k ∧ a1 = Vis e k) ∨ ∃v. a0 = Ret v ∧ a1 = Ret v
strip_tau_ind
⊢ ∀strip_tau'.
(∀t t'. strip_tau' t t' ⇒ strip_tau' (Tau t) t') ∧
(∀e k. strip_tau' (Vis e k) (Vis e k)) ∧
(∀v. strip_tau' (Ret v) (Ret v)) ⇒
∀a0 a1. strip_tau a0 a1 ⇒ strip_tau' a0 a1
⊢ ∀t t' t''. strip_tau t t' ∧ strip_tau t t'' ⇒ t' = t''
strip_tau_rules
⊢ (∀t t'. strip_tau t t' ⇒ strip_tau (Tau t) t') ∧
(∀e k. strip_tau (Vis e k) (Vis e k)) ∧ ∀v. strip_tau (Ret v) (Ret v)
⊢ (strip_tau t' (Tau t) ⇔ F) ∧ (strip_tau (Ret v) (Vis e k) ⇔ F) ∧
(strip_tau (Vis e k) (Ret v) ⇔ F) ∧
(strip_tau (Tau t) t' ⇔ strip_tau t t')
⊢ strip_tau (Ret v) (Ret v') ⇔ v = v'
⊢ strip_tau (Vis e k) (Vis e' k') ⇔ e = e' ∧ k = k'
⊢ (∀t'. ¬strip_tau t t') ⇒ t = spin
strip_tau_strongind
⊢ ∀strip_tau'.
(∀t t'. strip_tau t t' ∧ strip_tau' t t' ⇒ strip_tau' (Tau t) t') ∧
(∀e k. strip_tau' (Vis e k) (Vis e k)) ∧
(∀v. strip_tau' (Ret v) (Ret v)) ⇒
∀a0 a1. strip_tau a0 a1 ⇒ strip_tau' a0 a1
⊢ ∀e k k'.
strip_tau t (Vis e k) ∧ strip_tau t' (Vis e k') ∧
(∀r. itree_wbisim (k r) (k' r)) ⇒
itree_wbisim t t'
⊢ strong_bisim_upfrom_abs (abs,abs') t t' ⇒
strong_bisim_upfrom_abs (abs,abs') (FUNPOW Tau n t) (FUNPOW Tau n t')
⊢ strong_bisim_upfrom_abs (abs,abs') (FUNPOW Tau (SUC n) (abs r))
(FUNPOW Tau (SUC n) (abs' r))
strong_bisim_upfrom_abs_cases
⊢ ∀a0 a1 a2.
strong_bisim_upfrom_abs a0 a1 a2 ⇔
(∃abs abs' x. a0 = (abs,abs') ∧ a1 = Ret x ∧ a2 = Ret x) ∨
(∃abs abs' e k k'.
a0 = (abs,abs') ∧ a1 = Vis e k ∧ a2 = Vis e k' ∧
∀l. strong_bisim_upfrom_abs (abs,abs') (k l) (k' l) ∨
∃r. k l = abs r ∧ k' l = abs' r) ∨
(∃abs abs' t t'.
a0 = (abs,abs') ∧ a1 = Tau t ∧ a2 = Tau t' ∧
∃r. t = abs r ∧ t' = abs' r) ∨
∃abs abs' t t'.
a0 = (abs,abs') ∧ a1 = Tau t ∧ a2 = Tau t' ∧
strong_bisim_upfrom_abs (abs,abs') t t'
strong_bisim_upfrom_abs_coind
⊢ ∀strong_bisim_upfrom_abs'.
(∀a0 a1 a2.
strong_bisim_upfrom_abs' a0 a1 a2 ⇒
(∃abs abs' x. a0 = (abs,abs') ∧ a1 = Ret x ∧ a2 = Ret x) ∨
(∃abs abs' e k k'.
a0 = (abs,abs') ∧ a1 = Vis e k ∧ a2 = Vis e k' ∧
∀l. strong_bisim_upfrom_abs' (abs,abs') (k l) (k' l) ∨
∃r. k l = abs r ∧ k' l = abs' r) ∨
(∃abs abs' t t'.
a0 = (abs,abs') ∧ a1 = Tau t ∧ a2 = Tau t' ∧
∃r. t = abs r ∧ t' = abs' r) ∨
∃abs abs' t t'.
a0 = (abs,abs') ∧ a1 = Tau t ∧ a2 = Tau t' ∧
strong_bisim_upfrom_abs' (abs,abs') t t') ⇒
∀a0 a1 a2.
strong_bisim_upfrom_abs' a0 a1 a2 ⇒ strong_bisim_upfrom_abs a0 a1 a2
strong_bisim_upfrom_abs_rules
⊢ (∀abs abs' x. strong_bisim_upfrom_abs (abs,abs') (Ret x) (Ret x)) ∧
(∀abs abs' e k k'.
(∀l. strong_bisim_upfrom_abs (abs,abs') (k l) (k' l) ∨
∃r. k l = abs r ∧ k' l = abs' r) ⇒
strong_bisim_upfrom_abs (abs,abs') (Vis e k) (Vis e k')) ∧
(∀abs abs' t t'.
(∃r. t = abs r ∧ t' = abs' r) ⇒
strong_bisim_upfrom_abs (abs,abs') (Tau t) (Tau t')) ∧
∀abs abs' t t'.
strong_bisim_upfrom_abs (abs,abs') t t' ⇒
strong_bisim_upfrom_abs (abs,abs') (Tau t) (Tau t')
⊢ ∀abs t t'. strong_bisim_upfrom_abs (abs,abs) t t' ⇔ t = t'
⊢ (∀r. strong_bisim_upfrom_abs (abs,abs') (k r) (k' r)) ⇒
strong_bisim_upfrom_abs (abs,abs') (itree_bind t k) (itree_bind t k')
⊢ ∀t t'. untau t = untau t' ⇒ itree_wbisim t t'
⊢ set_compatible wbisim_functional upto_taus_func
⊢ (itree_wbisim t (FUNPOW Tau n ht) ⇔ itree_wbisim t ht) ∧
(itree_wbisim (FUNPOW Tau n ht) t ⇔ itree_wbisim ht t)
⊢ ∀t t'. itree_wbisim t t' ⇒ untau t = untau t'
⊢ X ⊆ Y ⇒ wbisim_functional X ⊆ wbisim_functional Y
⊢ gfp wbisim_functional = rel_to_reln itree_wbisim
⊢ monotone wbisim_functional
⊢ itree_wbisim t spin ⇔ t = spin
weak_bisim_upfrom_abs_cases
⊢ ∀a0 a1 a2.
weak_bisim_upfrom_abs a0 a1 a2 ⇔
(∃abs abs' x.
a0 = (abs,abs') ∧ strip_tau a1 (Ret x) ∧ strip_tau a2 (Ret x)) ∨
(∃abs abs' e k k' n n' r.
a0 = (abs,abs') ∧ strip_tau a1 (Vis e k) ∧ strip_tau a2 (Vis e k') ∧
∀l. weak_bisim_upfrom_abs (abs,abs') (k l) (k' l) ∨
k l = FUNPOW Tau n (abs r) ∧ k' l = FUNPOW Tau n' (abs' r)) ∨
(∃abs abs' n n' r.
a0 = (abs,abs') ∧ a1 = FUNPOW Tau (SUC n) (abs r) ∧
a2 = FUNPOW Tau (SUC n') (abs' r)) ∨
∃abs abs' n n' t t'.
a0 = (abs,abs') ∧ a1 = FUNPOW Tau (SUC n) t ∧
a2 = FUNPOW Tau (SUC n') t' ∧ weak_bisim_upfrom_abs (abs,abs') t t'
weak_bisim_upfrom_abs_coind
⊢ ∀weak_bisim_upfrom_abs'.
(∀a0 a1 a2.
weak_bisim_upfrom_abs' a0 a1 a2 ⇒
(∃abs abs' x.
a0 = (abs,abs') ∧ strip_tau a1 (Ret x) ∧ strip_tau a2 (Ret x)) ∨
(∃abs abs' e k k' n n' r.
a0 = (abs,abs') ∧ strip_tau a1 (Vis e k) ∧
strip_tau a2 (Vis e k') ∧
∀l. weak_bisim_upfrom_abs' (abs,abs') (k l) (k' l) ∨
k l = FUNPOW Tau n (abs r) ∧ k' l = FUNPOW Tau n' (abs' r)) ∨
(∃abs abs' n n' r.
a0 = (abs,abs') ∧ a1 = FUNPOW Tau (SUC n) (abs r) ∧
a2 = FUNPOW Tau (SUC n') (abs' r)) ∨
∃abs abs' n n' t t'.
a0 = (abs,abs') ∧ a1 = FUNPOW Tau (SUC n) t ∧
a2 = FUNPOW Tau (SUC n') t' ∧
weak_bisim_upfrom_abs' (abs,abs') t t') ⇒
∀a0 a1 a2.
weak_bisim_upfrom_abs' a0 a1 a2 ⇒ weak_bisim_upfrom_abs a0 a1 a2
weak_bisim_upfrom_abs_rules
⊢ (∀abs abs' t t' x.
strip_tau t (Ret x) ∧ strip_tau t' (Ret x) ⇒
weak_bisim_upfrom_abs (abs,abs') t t') ∧
(∀abs abs' e k k' n n' r t t'.
strip_tau t (Vis e k) ∧ strip_tau t' (Vis e k') ∧
(∀l. weak_bisim_upfrom_abs (abs,abs') (k l) (k' l) ∨
k l = FUNPOW Tau n (abs r) ∧ k' l = FUNPOW Tau n' (abs' r)) ⇒
weak_bisim_upfrom_abs (abs,abs') t t') ∧
(∀abs abs' n n' r.
weak_bisim_upfrom_abs (abs,abs') (FUNPOW Tau (SUC n) (abs r))
(FUNPOW Tau (SUC n') (abs' r))) ∧
∀abs abs' n n' t t'.
weak_bisim_upfrom_abs (abs,abs') t t' ⇒
weak_bisim_upfrom_abs (abs,abs') (FUNPOW Tau (SUC n) t)
(FUNPOW Tau (SUC n') t')
⊢ weak_bisim_upfrom_abs (abs,abs') spin spin
⊢ weak_bisim_upfrom_abs (abs,abs') t'' t'³' ⇒
weak_bisim_upfrom_abs (abs,abs') (Tau t'') t'³'
⊢ weak_bisim_upfrom_abs (abs,abs') t'' t'³' ⇒
weak_bisim_upfrom_abs (abs,abs') t'' (Tau t'³')
⊢ itree_wbisim t t' ∧ (∀r. weak_bisim_upfrom_abs (abs,abs') (k r) (k' r)) ⇒
weak_bisim_upfrom_abs (abs,abs') (itree_bind t k) (itree_bind t' k')
⊢ weak_bisim_upfrom_abs (abs,abs') t'' t'³' ⇒
weak_bisim_upfrom_abs (abs,abs') (FUNPOW Tau n t'') (FUNPOW Tau n' t'³')
⊢ weak_bisim_upfrom_abs (abs,abs) t' t'' ⇔ itree_wbisim t' t''