Theory itreeTau

Parents

Contents

Type operators

Constants

Definitions

itree_TY_DEFitree_bind_defitree_elMAP_defitree_elREL_defitree_elSET1_defitree_elSET2_defitree_el_ABSREPitree_el_CONS_defitree_el_case_defitree_el_size_defitree_iter_defitree_loop_defitree_nextMAP_defitree_nextREL_defitree_nextSET1_defitree_nextSET2_defitree_nextSET3_defitree_next_ABSREPitree_next_CONS_defitree_next_case_defitree_next_size_defuntau_defupto_taus_func_defwbisim_functional_def

Theorems

FUNPOW_Ret_spin_FFUNPOW_Tau_Ret_eqFUNPOW_Tau_SUC_cyclic_spinFUNPOW_Tau_Vis_eqFUNPOW_Tau_abs_cyclic_spinFUNPOW_Tau_bindFUNPOW_Tau_imp_wbisimFUNPOW_Tau_neqFUNPOW_Tau_neq2FUNPOW_Tau_wbisimFUNPOW_Tau_wbisim_introFUNPOW_Vis_spin_FRet_11Tau_11Tau_INJVis_11after_taus_FUNPOW_TauLafter_taus_FUNPOW_TauRafter_taus_casesafter_taus_indafter_taus_itree_strong_bisim_spin_spinafter_taus_itree_strong_bisim_strip_tauafter_taus_itree_wbisim_itree_wbisimafter_taus_itree_wbisim_spin_spinafter_taus_relafter_taus_rulesafter_taus_strongindafter_taus_tauLafter_taus_tauRcyclic_strong_bisim_upfrom_abscyclic_strong_bisim_upfrom_abs_strong_upfromcyclic_weak_bisim_upfrom_abscyclic_weak_bisim_upfrom_abs_weak_upfromdatatype_itreedatatype_itree_eldatatype_itree_nextitree_11itree_CASEitree_CASE_congitree_CASE_elimitree_CASE_eqitree_bind_associtree_bind_resp_k_wbisimitree_bind_resp_t_wbisimitree_bind_resp_wbisimitree_bind_ret_invitree_bind_right_identityitree_bind_strip_tau_wbisimitree_bind_thmitree_bind_vis_strip_tauitree_bisimulationitree_casesitree_coind_upto_tausitree_distinctitree_el_11itree_el_Axiomitree_el_MAP_CONGitree_el_MAP_IDitree_el_MAP_IMAGE1itree_el_MAP_IMAGE2itree_el_MAP_Oitree_el_bnd1itree_el_bnd2itree_el_case_congitree_el_case_eqitree_el_distinctitree_el_inductionitree_el_inh1itree_el_inh2itree_el_nchotomyitree_el_thmitree_el_wititree_iter_body_seed_wbisimitree_iter_resp_wbisimitree_iter_seed_wbisimitree_iter_thmitree_next_11itree_next_Axiomitree_next_MAP_CONGitree_next_MAP_IDitree_next_MAP_IMAGE1itree_next_MAP_IMAGE2itree_next_MAP_IMAGE3itree_next_MAP_Oitree_next_bnd1itree_next_bnd2itree_next_bnd3itree_next_case_congitree_next_case_eqitree_next_distinctitree_next_inductionitree_next_inh1itree_next_inh2itree_next_inh3itree_next_nchotomyitree_next_wit1itree_next_wit2itree_strong_bisim_upfrom_absitree_strong_bisimulationitree_unfolditree_wbisim_Ret_FUNPOWitree_wbisim_Vis_FUNPOWitree_wbisim_casesitree_wbisim_coinditree_wbisim_coind_uptoitree_wbisim_coind_upto'itree_wbisim_reflitree_wbisim_rulesitree_wbisim_strip_tauitree_wbisim_strip_tau_Retitree_wbisim_strip_tau_Visitree_wbisim_strip_tau_casesitree_wbisim_strip_tau_symitree_wbisim_strong_coinditree_wbisim_symitree_wbisim_tauitree_wbisim_tau_eqitree_wbisim_tau_eqnitree_wbisim_transitree_wbisim_visitree_wbisim_vis_visitree_wbisim_weak_bisim_upfrom_absitree_wbisim_weak_upfrom_absspinspin_FUNPOW_Tauspin_bindspin_strip_taustrip_tau_FUNPOWstrip_tau_FUNPOW_cancelstrip_tau_FUNPOW_strip_taustrip_tau_casesstrip_tau_indstrip_tau_injstrip_tau_rulesstrip_tau_simpsstrip_tau_simps2strip_tau_simps3strip_tau_spinstrip_tau_strongindstrip_tau_vis_wbisimstrong_bisim_upfrom_abs_FUNPOW_Taustrong_bisim_upfrom_abs_FUNPOW_Tau_SUC_absstrong_bisim_upfrom_abs_casesstrong_bisim_upfrom_abs_coindstrong_bisim_upfrom_abs_rulesstrong_bisim_upfrom_abs_strongstrong_bisim_upfrom_abs_strong_binduntau_IMP_wbisimuntau_spinupto_taus_compatiblewbisim_FUNPOW_Tauwbisim_IMP_untauwbisim_functional_cancelwbisim_functional_gfpwbisim_functional_monowbisim_spin_eqweak_bisim_upfrom_abs_casesweak_bisim_upfrom_abs_coindweak_bisim_upfrom_abs_rulesweak_bisim_upfrom_abs_spinweak_bisim_upfrom_abs_tauLweak_bisim_upfrom_abs_tauRweak_bisim_upfrom_abs_wbisim_bindweak_bisim_upfrom_cyclic_abs_FUNPOW_Tauweak_bisim_upfrom_weak_abs

Definitions

itree_TY_DEF
⊢ ∃rep. TYPE_DEFINITION itree_rep_ok rep
⊢ ∀t k.
    itree_bind t k =
    itree_unfold
      (λx.
         case x of
           INL (Ret r) =>
             (case k r of
                Ret s => Ret' s
              | Tau t => Tau' (INR t)
              | Vis e g => Vis' e (INR ∘ g))
         | INL (Tau t) => Tau' (INL t)
         | INL (Vis e g) => Vis' e (INL ∘ g)
         | INR (Ret r') => Ret' r'
         | INR (Tau t') => Tau' (INR t')
         | INR (Vis e' g') => Vis' e' (INR ∘ g')) (INL t)
itree_elMAP_def
⊢ ∀f1 f2.
    itree_elMAP f1 f2 =
    itree_el_ABS ∘ SUM_MAP f1 (SUM_MAP f2 I) ∘ itree_el_REP
itree_elREL_def
⊢ itree_elREL =
  (λR1 R2 x y.
     ∃z. (∀p. p ∈ itree_elSET1 z ⇒ R1 (FST p) (SND p)) ∧
         (∀p. p ∈ itree_elSET2 z ⇒ R2 (FST p) (SND p)) ∧
         itree_elMAP FST FST z = x ∧ itree_elMAP SND SND z = y)
itree_elSET1_def
⊢ itree_elSET1 =
  S ($UNION ∘ BIMG $= ∘ setL)
    (BIMG (S ($UNION ∘ BIMG (K ∅) ∘ setL) (BIMG (K ∅) ∘ setR)) ∘ setR) ∘
  itree_el_REP
itree_elSET2_def
⊢ itree_elSET2 =
  S ($UNION ∘ BIMG (K ∅) ∘ setL)
    (BIMG (S ($UNION ∘ BIMG $= ∘ setL) (BIMG (K ∅) ∘ setR)) ∘ setR) ∘
  itree_el_REP
itree_el_ABSREP
⊢ (∀a. itree_el_ABS (itree_el_REP a) = a) ∧
  ∀r. (λx. T) r ⇔ itree_el_REP (itree_el_ABS r) = r
itree_el_CONS_def
⊢ itree_el_CONS = itree_el_ABS
itree_el_case_def
⊢ (∀a0 f f0 v. itree_el_CASE (Event a0) f f0 v = f a0) ∧
  (∀a0 f f0 v. itree_el_CASE (Return a0) f f0 v = f0 a0) ∧
  ∀f f0 v. itree_el_CASE Silence f f0 v = v
itree_el_size_def
⊢ ∀f0 f1.
    (∀a0. itree_el_size f0 f1 (Event a0) = 1 + f0 a0) ∧
    (∀a0. itree_el_size f0 f1 (Return a0) = 1 + f1 a0) ∧
    itree_el_size f0 f1 Silence = 0
⊢ ∀body seed.
    itree_iter body seed =
    itree_unfold
      (λx.
         case x of
           Ret (INL seed') => Tau' (body seed')
         | Ret (INR v) => Ret' v
         | Tau u => Tau' u
         | Vis e g => Vis' e g) (body seed)
⊢ ∀body seed.
    itree_loop body seed =
    itree_iter
      (λx.
         itree_bind (body x)
           (λcb.
              case cb of INL c => Ret (INL (INL c)) | INR b => Ret (INR b)))
      (INR seed)
itree_nextMAP_def
⊢ ∀f1 f2 f3.
    itree_nextMAP f1 f2 f3 =
    itree_next_ABS ∘ SUM_MAP f2 (SUM_MAP f3 (f1 ## $o f3)) ∘ itree_next_REP
itree_nextREL_def
⊢ itree_nextREL =
  (λR1 R2 R3 x y.
     ∃z. (∀p. p ∈ itree_nextSET1 z ⇒ R1 (FST p) (SND p)) ∧
         (∀p. p ∈ itree_nextSET2 z ⇒ R2 (FST p) (SND p)) ∧
         (∀p. p ∈ itree_nextSET3 z ⇒ R3 (FST p) (SND p)) ∧
         itree_nextMAP FST FST FST z = x ∧ itree_nextMAP SND SND SND z = y)
itree_nextSET1_def
⊢ itree_nextSET1 =
  S ($UNION ∘ BIMG (K ∅) ∘ setL)
    (BIMG
       (S ($UNION ∘ BIMG (K ∅) ∘ setL)
          (BIMG
             (S ($UNION ∘ BIMG $= ∘ setFST)
                (BIMG (BIMG (K ∅) ∘ flip IMAGE 𝕌(:α)) ∘ setSND)) ∘ setR)) ∘
     setR) ∘ itree_next_REP
itree_nextSET2_def
⊢ itree_nextSET2 =
  S ($UNION ∘ BIMG $= ∘ setL)
    (BIMG
       (S ($UNION ∘ BIMG (K ∅) ∘ setL)
          (BIMG
             (S ($UNION ∘ BIMG (K ∅) ∘ setFST)
                (BIMG (BIMG (K ∅) ∘ flip IMAGE 𝕌(:α)) ∘ setSND)) ∘ setR)) ∘
     setR) ∘ itree_next_REP
itree_nextSET3_def
⊢ itree_nextSET3 =
  S ($UNION ∘ BIMG (K ∅) ∘ setL)
    (BIMG
       (S ($UNION ∘ BIMG $= ∘ setL)
          (BIMG
             (S ($UNION ∘ BIMG (K ∅) ∘ setFST)
                (BIMG (BIMG $= ∘ flip IMAGE 𝕌(:α)) ∘ setSND)) ∘ setR)) ∘
     setR) ∘ itree_next_REP
itree_next_ABSREP
⊢ (∀a. itree_next_ABS (itree_next_REP a) = a) ∧
  ∀r. (λx. T) r ⇔ itree_next_REP (itree_next_ABS r) = r
itree_next_CONS_def
⊢ itree_next_CONS = itree_next_ABS
itree_next_case_def
⊢ (∀a0 f f0 f1. itree_next_CASE (Ret' a0) f f0 f1 = f a0) ∧
  (∀a0 f f0 f1. itree_next_CASE (Tau' a0) f f0 f1 = f0 a0) ∧
  ∀a0 a1 f f0 f1. itree_next_CASE (Vis' a0 a1) f f0 f1 = f1 a0 a1
itree_next_size_def
⊢ ∀f0 f1 f2 f3.
    (∀a0. itree_next_size f0 f1 f2 f3 (Ret' a0) = 1 + f2 a0) ∧
    (∀a0. itree_next_size f0 f1 f2 f3 (Tau' a0) = 1 + f3 a0) ∧
    ∀a0 a1. itree_next_size f0 f1 f2 f3 (Vis' a0 a1) = 1 + f1 a0
⊢ untau =
  itree_unfold
    (λt.
       case some t'. strip_tau t t' of
         NONE => Div'
       | SOME (Ret v) => Ret' v
       | SOME (Tau t') => Div'
       | SOME (Vis e k) => Vis' e k)
⊢ ∀R. upto_taus_func R = R ∪ rel_to_reln (after_taus (reln_to_rel R))
⊢ ∀R. wbisim_functional R =
      {(t,t') | ∃r. strip_tau t (Ret r) ∧ strip_tau t' (Ret r)} ∪
      {(t,t') |
       ∃e k k'.
         strip_tau t (Vis e k) ∧ strip_tau t' (Vis e k') ∧
         ∀r. (k r,k' r) ∈ R} ∪ {(Tau t,Tau t') | (t,t') ∈ R}

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
⊢ itree_bind t Ret = t
⊢ ∀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 t t
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 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''
⊢ spin = Tau spin
⊢ ∀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'
⊢ untau spin = Div
⊢ 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''