Built with Alectryon, running Coq+SerAPI v8.17.0+0.17.1. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.

Congruence (Def 6.1)

We prove in this module that weak bisimilarity is a congruence for composition. The proof makes a slight technical side step: we prove the composition to be equivalent to an alternate definition, dully named compo_alt.

Indeed, congruence is a very easy result, demanding basically no assumption. What is actually hard, is to manage weak bisimilarity proofs, which in contrast to strong bisimilarity can be hard to tame: instead of synchronizing, at every step they can eat any number of Tau node on either side, forcing us to do complex inductions in the middle of our bisimilarity proofs.

Because of this, since our main definition compo is the specific case of composition of two instances of the machine strategy in the OGS game, we know much more than what we actually care about. Hence we define the much more general compo_alt composing any two abstract strategy for the OGS game and prove that one congruent w.r.t. weak bisimilarity. We then connect these two alternative definitions with a strong bisimilarity, much more structured, hence easy to prove.

We consider a language abstractly captured as a machine satisfying an appropriate axiomatization.

  Context {T C} {CC : context T C} {CL : context_laws T C}.
  Context {val} {VM : subst_monoid val} {VML : subst_monoid_laws val}.
  Context {conf} {CM : subst_module val conf} {CML : subst_module_laws val conf}.
  Context {obs : obs_struct T C} {M : machine val conf obs}.
  Context {ML : machine_laws val conf obs} {VV : var_assumptions val}.

We start off by defining this new, opaque composition.

  Record compo_alt_t (Δ : C) : Type := AltT {
    alt_ctx : ogs_ctx ;
    alt_act : ogs_act (obs:=obs) Δ alt_ctx ;
    alt_pas : ogs_pas (obs:=obs) Δ alt_ctx
  } .
  #[global] Arguments AltT {Δ Φ} u v : rename.
  #[global] Arguments alt_ctx {Δ}.
  #[global] Arguments alt_act {Δ}.
  #[global] Arguments alt_pas {Δ}.

  Definition compo_alt_body {Δ}
    : compo_alt_t Δ -> delay (compo_alt_t Δ + obs∙ Δ)
    := cofix _compo_body x :=
        go match x.(alt_act).(_observe) with
            | RetF r => RetD (inr r)
            | TauF t => TauD (_compo_body (AltT t x.(alt_pas)))
            | VisF e k => RetD (inl (AltT (x.(alt_pas) e) k))
            end .

  Definition compo_alt {Δ a} (u : ogs_act Δ a) (v : ogs_pas Δ a) : delay (obs∙ Δ)
    := iter_delay compo_alt_body (AltT u v).

Now we define our bisimulation candidates, for weak and strong bisimilarity.

  Variant alt_t_weq Δ : relation (compo_alt_t Δ) :=
  | AltWEq {Φ u1 u2 v1 v2}
    : u1 ≈ u2
      -> h_pasvR ogs_hg (it_wbisim (eqᵢ _)) _ v1 v2
      -> alt_t_weq Δ (AltT (Φ:=Φ) u1 v1) (AltT (Φ:=Φ) u2 v2).

  Variant alt_t_seq Δ : relation (compo_alt_t Δ) :=
  | AltSEq {Φ u1 u2 v1 v2}
    : u1 ≊ u2
      -> h_pasvR ogs_hg (it_eq (eqᵢ _)) _ v1 v2
      -> alt_t_seq Δ (AltT (Φ:=Φ) u1 v1) (AltT (Φ:=Φ) u2 v2).

And prove the tedious but direct weak congruence.

  
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
a: ogs_ctx

Proper (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) a ==> h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) a ==> it_wbisim (eqᵢ (fun _ : T1 => obs ∙ Δ)) T1_0) compo_alt
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
a: ogs_ctx
x, y: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) a
H1: x ≈ y
u, v: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) a
H2: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) a u v

compo_alt x u ≈ compo_alt y v
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
a: ogs_ctx
x, y: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) a
H1: x ≈ y
u, v: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) a
H2: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) a u v

dpointwise_relation (fun i : T1 => (alt_t_weq Δ ==> it_wbisim (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) i)%signature) (fun pat : T1 => let 'T1_0 as x := pat return (compo_alt_t Δ -> itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) x) in compo_alt_body) (fun pat : T1 => let 'T1_0 as x := pat return (compo_alt_t Δ -> itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) x) in compo_alt_body)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hu: u1 ≈ u2
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2

it_wbisim (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
Hu: gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2

it_wbisim_bt ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
Hu: it_wbisimF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ (_observe u1) (_observe u2)

it_wbisimF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
x1, x2: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) x1
r2: it_eat Φ (_observe u2) x2
rr: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ x1 x2

it_wbisimF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r0: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r0)
r3: obs ∙ Δ
r2: it_eat Φ (_observe u2) (RetF r3)
r_rel: eqᵢ (fun _ : ogs_ctx => obs ∙ Δ) Φ r0 r3

it_wbisimF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2
it_wbisimF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r
it_wbisimF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r0: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r0)
r3: obs ∙ Δ
r2: it_eat Φ (_observe u2) (RetF r3)
r_rel: eqᵢ (fun _ : ogs_ctx => obs ∙ Δ) Φ r0 r3

it_wbisimF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r3)
r2: it_eat Φ (_observe u2) (RetF r3)

itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r3)
r2: it_eat Φ (_observe u2) (RetF r3)
itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r3)
r2: it_eat Φ (_observe u2) (RetF r3)
it_eat T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end ?x1
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r3)
r2: it_eat Φ (_observe u2) (RetF r3)
it_eat T1_0 match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end ?x2
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r3)
r2: it_eat Φ (_observe u2) (RetF r3)
it_eqF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 ?x1 ?x2
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r3)
r2: it_eat Φ (_observe u2) (RetF r3)

itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
exact (RetF (inr r3)).
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r3)
r2: it_eat Φ (_observe u2) (RetF r3)

itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
exact (RetF (inr r3)).
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r3)
r2: it_eat Φ (_observe u2) (RetF r3)

it_eat T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inr r3))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
i: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ i (RetF r3)
r2: it_eat Φ (_observe u2) (RetF r3)

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inr r3))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
i, i0: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
H: i0 = RetF r3
r1: it_eat Φ i i0
r2: it_eat Φ (_observe u2) i0

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inr r3))
induction r1; [ now rewrite H | eauto ].
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r3)
r2: it_eat Φ (_observe u2) (RetF r3)

it_eat T1_0 match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end (RetF (inr r3))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r3)
i: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ i (RetF r3)

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end (RetF (inr r3))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
i0: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
H: i0 = RetF r3
r1: it_eat Φ (_observe u1) i0
i: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ i i0

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end (RetF (inr r3))
induction r2; [ now rewrite H | eauto ].
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r3: obs ∙ Δ
r1: it_eat Φ (_observe u1) (RetF r3)
r2: it_eat Φ (_observe u2) (RetF r3)

it_eqF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 (RetF (inr r3)) (RetF (inr r3))
now repeat econstructor.
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2

it_wbisimF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2

itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2
itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2
it_eat T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end ?x1
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2
it_eat T1_0 match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end ?x2
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2
it_eqF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 ?x1 ?x2
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2

itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
exact (TauD (compo_alt_body (AltT t1 v1))).
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2

itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
exact (TauD (compo_alt_body (AltT t2 v2))).
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2

it_eat T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (TauD compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |})
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
i: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ i (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (TauD compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |})
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
i, i0: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
H: i0 = TauF t1
r1: it_eat Φ i i0
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (TauD compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |})
induction r1; [ now rewrite H | auto ].
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2

it_eat T1_0 match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end (TauD compo_alt_body {| alt_ctx := Φ; alt_act := t2; alt_pas := v2 |})
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
i: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ i (TauF t2)
t_rel: t1 ≈ t2

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end (TauD compo_alt_body {| alt_ctx := Φ; alt_act := t2; alt_pas := v2 |})
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
i, i0: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
H: i0 = TauF t2
r2: it_eat Φ i i0
t_rel: t1 ≈ t2

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end (TauD compo_alt_body {| alt_ctx := Φ; alt_act := t2; alt_pas := v2 |})
induction r2; [ now rewrite H | auto ].
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2, t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ (_observe u1) (TauF t1)
t2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ (_observe u2) (TauF t2)
t_rel: t1 ≈ t2

it_eqF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 (TauD compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (TauD compo_alt_body {| alt_ctx := Φ; alt_act := t2; alt_pas := v2 |})
auto.
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r

it_wbisimF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r

itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r
itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r
it_eat T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end ?x1
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r
it_eat T1_0 match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end ?x2
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r
it_eqF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 ?x1 ?x2
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r

itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
exact (RetF (inl (AltT (v1 q) k1))).
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r

itree' ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) T1_0
exact (RetF (inl (AltT (v2 q) k2))).
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r

it_eat T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inl {| alt_ctx := g_next q; alt_act := v1 q; alt_pas := k1 |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
i: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r1: it_eat Φ i (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inl {| alt_ctx := g_next q; alt_act := v1 q; alt_pas := k1 |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
i, i0: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
H: i0 = VisF q k1
r1: it_eat Φ i i0
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inl {| alt_ctx := g_next q; alt_act := v1 q; alt_pas := k1 |}))
induction r1; [ now rewrite H | auto ].
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r

it_eat T1_0 match _observe u2 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end (RetF (inl {| alt_ctx := g_next q; alt_act := v2 q; alt_pas := k2 |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
i: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r2: it_eat Φ i (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end (RetF (inl {| alt_ctx := g_next q; alt_act := v2 q; alt_pas := k2 |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
i, i0: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
H: i0 = VisF q k2
r2: it_eat Φ i i0
k_rel: forall r : e_rsp q, k1 r ≈ k2 r

it_eat T1_0 match i with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v2 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v2 e; alt_pas := k |}) end (RetF (inl {| alt_ctx := g_next q; alt_act := v2 q; alt_pas := k2 |}))
induction r2; [ now rewrite H | auto ].
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x, y: compo_alt_t Δ
Φ: ogs_ctx
v1, v2: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
Hv: h_pasvR ogs_hg (it_wbisim (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 v2
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall u1 u2 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ, gfp (it_wbisim_map ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ u1 u2 -> it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_alt_body {| alt_ctx := Φ; alt_act := u2; alt_pas := v2 |})
u1, u2: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r1: it_eat Φ (_observe u1) (VisF q k1)
k2: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r2: it_eat Φ (_observe u2) (VisF q k2)
k_rel: forall r : e_rsp q, k1 r ≈ k2 r

it_eqF ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_wbisim_t ∅ₑ (sumᵣ (fun _ : T1 => alt_t_weq Δ) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 (RetF (inl {| alt_ctx := g_next q; alt_act := v1 q; alt_pas := k1 |})) (RetF (inl {| alt_ctx := g_next q; alt_act := v2 q; alt_pas := k2 |}))
unshelve (do 3 econstructor); eauto. Qed.

We can inject pairs of machine-strategy states into pairs of opaque states, this will help us define our next bisimulation candidate.

  Definition reduce_t_inj {Δ} (x : reduce_t Δ) : compo_alt_t Δ
     := AltT (m_strat _ x.(red_act)) (m_stratp _ x.(red_pas)) .

Now we relate the normal composition and the opaque composition of opacified states.

  
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x: reduce_t Δ

iter_delay compo_alt_body (reduce_t_inj x) ≊ iter_delay compo_body x
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x: reduce_t Δ

iter_delay compo_alt_body (reduce_t_inj x) ≊ iter_delay compo_body x
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x: reduce_t Δ

alt_t_seq Δ (reduce_t_inj x) (reduce_t_inj x)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x: reduce_t Δ
forall (i : T1) (a : compo_alt_t Δ) (b : reduce_t Δ), alt_t_seq Δ a (reduce_t_inj b) -> it_eq (sumᵣ (fun (_ : T1) (a0 : compo_alt_t Δ) => alt_t_seq Δ a0 ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) ((let 'T1_0 as x := i return (compo_alt_t Δ -> itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) x) in compo_alt_body) a) ((let 'T1_0 as x := i return (reduce_t Δ -> itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) x) in compo_body) b)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
x: reduce_t Δ

forall (i : T1) (a : compo_alt_t Δ) (b : reduce_t Δ), alt_t_seq Δ a (reduce_t_inj b) -> it_eq (sumᵣ (fun (_ : T1) (a0 : compo_alt_t Δ) => alt_t_seq Δ a0 ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) ((let 'T1_0 as x := i return (compo_alt_t Δ -> itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) x) in compo_alt_body) a) ((let 'T1_0 as x := i return (reduce_t Δ -> itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) x) in compo_body) b)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C

forall (i : T1) (a : compo_alt_t Δ) (b : reduce_t Δ), alt_t_seq Δ a (reduce_t_inj b) -> it_eq (sumᵣ (fun (_ : T1) (a0 : compo_alt_t Δ) => alt_t_seq Δ a0 ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) ((let 'T1_0 as x := i return (compo_alt_t Δ -> itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) x) in compo_alt_body) a) ((let 'T1_0 as x := i return (reduce_t Δ -> itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)) x) in compo_body) b)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
b: reduce_t Δ
u1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (red_ctx b)
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) (red_ctx b)
H: u1 ≊ m_strat (red_ctx b) (red_act b)
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) (red_ctx b) v1 (m_stratp (red_ctx b) (red_pas b))

it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (compo_alt_body {| alt_ctx := red_ctx b; alt_act := u1; alt_pas := v1 |}) (compo_body b)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
c: conf (Δ +▶ ↓⁺ Φ)
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
u1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H: u1 ≊ m_strat Φ {| ms_conf := c; ms_env := u |}
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_body {| red_ctx := Φ; red_act := {| ms_conf := c; ms_env := u |}; red_pas := v |})
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
c: conf (Δ +▶ ↓⁺ Φ)
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
u1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ (_observe u1) match match _observe (eval c) with | RetF r => RetF (m_strat_wrap u r) | TauF t => TauF (fmap_delay (m_strat_wrap u) t) | VisF e k => VisF e (fun r : ex_falso e => (fun _ : T1 => m_strat_wrap u) <$> k r) end with | RetF (inl m) => RetF m | RetF (inr (x,' p)) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) | TauF t => TauF (subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t) | VisF e _ => match e return (itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) with end end
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (compo_alt_body {| alt_ctx := Φ; alt_act := u1; alt_pas := v1 |}) (compo_body {| red_ctx := Φ; red_act := {| ms_conf := c; ms_env := u |}; red_pas := v |})
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
c: conf (Δ +▶ ↓⁺ Φ)
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
u1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ (_observe u1) match match _observe (eval c) with | RetF r => RetF (m_strat_wrap u r) | TauF t => TauF (fmap_delay (m_strat_wrap u) t) | VisF e k => VisF e (fun r : ex_falso e => (fun _ : T1 => m_strat_wrap u) <$> k r) end with | RetF (inl m) => RetF m | RetF (inr (x,' p)) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) | TauF t => TauF (subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t) | VisF e _ => match e return (itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) with end end
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match _observe u1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match match _observe (eval c) with | RetF r => RetF (m_strat_wrap u r) | TauF t => TauF (fmap_delay (m_strat_wrap u) t) | VisF e k => VisF e (fun r : ex_falso e => (fun _ : T1 => m_strat_wrap u) <$> k r) end with | RetF r => RetF match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end | TauF t => TauF (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t) | VisF e k => VisF e (fun r : ex_falso e => (fun (_ : T1) (r0 : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)}) => match r0 with | inl r1 => inr r1 | inr e0 => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e0); red_act := m_strat_resp v (projT1 e0); red_pas := projT2 e0 |} end) <$> k r) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
c: conf (Δ +▶ ↓⁺ Φ)
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 match match _observe (eval c) with | RetF r => RetF (m_strat_wrap u r) | TauF t => TauF (fmap_delay (m_strat_wrap u) t) | VisF e k => VisF e (fun r : ex_falso e => (fun _ : T1 => m_strat_wrap u) <$> k r) end with | RetF (inl m) => RetF m | RetF (inr (x,' p)) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) | TauF t => TauF (subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t) | VisF e _ => match e return (itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) with end end
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match match _observe (eval c) with | RetF r => RetF (m_strat_wrap u r) | TauF t => TauF (fmap_delay (m_strat_wrap u) t) | VisF e k => VisF e (fun r : ex_falso e => (fun _ : T1 => m_strat_wrap u) <$> k r) end with | RetF r => RetF match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end | TauF t => TauF (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t) | VisF e k => VisF e (fun r : ex_falso e => (fun (_ : T1) (r0 : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)}) => match r0 with | inl r1 => inr r1 | inr e0 => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e0); red_act := m_strat_resp v (projT1 e0); red_pas := projT2 e0 |} end) <$> k r) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
ou2: itree' ∅ₑ (fun _ : T1 => nf obs val (Δ +▶ ↓⁺ Φ)) T1_0
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 match match ou2 with | RetF r => RetF (m_strat_wrap u r) | TauF t => TauF (fmap_delay (m_strat_wrap u) t) | VisF e k => VisF e (fun r : ex_falso e => (fun _ : T1 => m_strat_wrap u) <$> k r) end with | RetF (inl m) => RetF m | RetF (inr (x,' p)) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) | TauF t => TauF (subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t) | VisF e _ => match e return (itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) with end end
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match match ou2 with | RetF r => RetF (m_strat_wrap u r) | TauF t => TauF (fmap_delay (m_strat_wrap u) t) | VisF e k => VisF e (fun r : ex_falso e => (fun _ : T1 => m_strat_wrap u) <$> k r) end with | RetF r => RetF match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end | TauF t => TauF (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t) | VisF e k => VisF e (fun r : ex_falso e => (fun (_ : T1) (r0 : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)}) => match r0 with | inl r1 => inr r1 | inr e0 => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e0); red_act := m_strat_resp v (projT1 e0); red_pas := projT2 e0 |} end) <$> k r) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r: nf obs val (Δ +▶ ↓⁺ Φ)
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 match m_strat_wrap u r with | inl m => RetF m | inr (x,' p) => VisF x (fun r : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r) (m_strat_resp p r)) end
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF match m_strat_wrap u r with | inl r => inr r | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
t: itree ∅ₑ (fun _ : T1 => nf obs val (Δ +▶ ↓⁺ Φ)) T1_0
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 (TauF (subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) (fmap_delay (m_strat_wrap u) t)))
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (TauF (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) (fmap_delay (m_strat_wrap u) t)))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry T1_0
k: forall r : e_rsp q, itree ∅ₑ (fun _ : T1 => nf obs val (Δ +▶ ↓⁺ Φ)) (e_nxt r)
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 match q return (itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) with end
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (VisF q (fun r : ex_falso q => (fun (_ : T1) (r0 : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)}) => match r0 with | inl r1 => inr r1 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) <$> ((fun _ : T1 => m_strat_wrap u) <$> k r)))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r: nf obs val (Δ +▶ ↓⁺ Φ)
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 match m_strat_wrap u r with | inl m => RetF m | inr (x,' p) => VisF x (fun r : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r) (m_strat_resp p r)) end
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF match m_strat_wrap u r with | inl r => inr r | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r: nf obs val (Δ +▶ ↓⁺ Φ)
p: obs ∙ Δ
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 (RetF p)
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inr p))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r: nf obs val (Δ +▶ ↓⁺ Φ)
h: h_actv ogs_hg (m_strat_pas Δ) Φ
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 (let (x, p) := h in VisF x (fun r : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r) (m_strat_resp p r)))
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inl {| red_ctx := Φ ▶ₓ m_dom (projT1 h); red_act := m_strat_resp v (projT1 h); red_pas := projT2 h |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r: nf obs val (Δ +▶ ↓⁺ Φ)
p: obs ∙ Δ
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 (RetF p)
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inr p))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
r1: (fun _ : ogs_ctx => obs ∙ Δ) Φ
r: nf obs val (Δ +▶ ↓⁺ Φ)
r2: (fun _ : ogs_ctx => obs ∙ Δ) Φ
r_rel: eqᵢ (fun _ : ogs_ctx => obs ∙ Δ) Φ r1 r2
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 (RetF (inr r1)) (RetF (inr r2))
do 2 econstructor; exact r_rel.
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r: nf obs val (Δ +▶ ↓⁺ Φ)
h: h_actv ogs_hg (m_strat_pas Δ) Φ
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 (let (x, p) := h in VisF x (fun r : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r) (m_strat_resp p r)))
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inl {| red_ctx := Φ ▶ₓ m_dom (projT1 h); red_act := m_strat_resp v (projT1 h); red_pas := projT2 h |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r: nf obs val (Δ +▶ ↓⁺ Φ)
m: m_strat_pas Δ (g_next q)
k_rel: forall r : e_rsp q, k1 r ≊ (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom q) => m_strat (Φ ▶ₓ m_dom q ▶ₓ m_dom r0) (m_strat_resp m r0)) r
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match VisF q k1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inl {| red_ctx := Φ ▶ₓ m_dom (projT1 (q,' m)); red_act := m_strat_resp v (projT1 (q,' m)); red_pas := projT2 (q,' m) |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r: nf obs val (Δ +▶ ↓⁺ Φ)
m: m_strat_pas Δ (g_next q)
k_rel: forall r : e_rsp q, k1 r ≊ (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom q) => m_strat (Φ ▶ₓ m_dom q ▶ₓ m_dom r0) (m_strat_resp m r0)) r
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

v1 q ≊ m_strat (red_ctx {| red_ctx := Φ ▶ₓ m_dom (projT1 (q,' m)); red_act := m_strat_resp v (projT1 (q,' m)); red_pas := projT2 (q,' m) |}) (red_act {| red_ctx := Φ ▶ₓ m_dom (projT1 (q,' m)); red_act := m_strat_resp v (projT1 (q,' m)); red_pas := projT2 (q,' m) |})
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r: nf obs val (Δ +▶ ↓⁺ Φ)
m: m_strat_pas Δ (g_next q)
k_rel: forall r : e_rsp q, k1 r ≊ (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom q) => m_strat (Φ ▶ₓ m_dom q ▶ₓ m_dom r0) (m_strat_resp m r0)) r
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) (red_ctx {| red_ctx := Φ ▶ₓ m_dom (projT1 (q,' m)); red_act := m_strat_resp v (projT1 (q,' m)); red_pas := projT2 (q,' m) |}) k1 (m_stratp (red_ctx {| red_ctx := Φ ▶ₓ m_dom (projT1 (q,' m)); red_act := m_strat_resp v (projT1 (q,' m)); red_pas := projT2 (q,' m) |}) (red_pas {| red_ctx := Φ ▶ₓ m_dom (projT1 (q,' m)); red_act := m_strat_resp v (projT1 (q,' m)); red_pas := projT2 (q,' m) |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r: nf obs val (Δ +▶ ↓⁺ Φ)
m: m_strat_pas Δ (g_next q)
k_rel: forall r : e_rsp q, k1 r ≊ (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom q) => m_strat (Φ ▶ₓ m_dom q ▶ₓ m_dom r0) (m_strat_resp m r0)) r
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

v1 q ≊ m_strat (red_ctx {| red_ctx := Φ ▶ₓ m_dom (projT1 (q,' m)); red_act := m_strat_resp v (projT1 (q,' m)); red_pas := projT2 (q,' m) |}) (red_act {| red_ctx := Φ ▶ₓ m_dom (projT1 (q,' m)); red_act := m_strat_resp v (projT1 (q,' m)); red_pas := projT2 (q,' m) |})
apply H0.
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
r: nf obs val (Δ +▶ ↓⁺ Φ)
m: m_strat_pas Δ (g_next q)
k_rel: forall r : e_rsp q, k1 r ≊ (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom q) => m_strat (Φ ▶ₓ m_dom q ▶ₓ m_dom r0) (m_strat_resp m r0)) r
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) (red_ctx {| red_ctx := Φ ▶ₓ m_dom (projT1 (q,' m)); red_act := m_strat_resp v (projT1 (q,' m)); red_pas := projT2 (q,' m) |}) k1 (m_stratp (red_ctx {| red_ctx := Φ ▶ₓ m_dom (projT1 (q,' m)); red_act := m_strat_resp v (projT1 (q,' m)); red_pas := projT2 (q,' m) |}) (red_pas {| red_ctx := Φ ▶ₓ m_dom (projT1 (q,' m)); red_act := m_strat_resp v (projT1 (q,' m)); red_pas := projT2 (q,' m) |}))
exact k_rel.
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
t: itree ∅ₑ (fun _ : T1 => nf obs val (Δ +▶ ↓⁺ Φ)) T1_0
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 (TauF (subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) (fmap_delay (m_strat_wrap u) t)))
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (TauF (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) (fmap_delay (m_strat_wrap u) t)))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
t: itree ∅ₑ (fun _ : T1 => nf obs val (Δ +▶ ↓⁺ Φ)) T1_0
t_rel: t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) (fmap_delay (m_strat_wrap u) t)
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 (TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |})) (TauF (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) (fmap_delay (m_strat_wrap u) t)))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
t: itree ∅ₑ (fun _ : T1 => nf obs val (Δ +▶ ↓⁺ Φ)) T1_0
t_rel: t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) (fmap_delay (m_strat_wrap u) t)
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) (fmap_delay (m_strat_wrap u) t))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
t2: delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)
t_rel: t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
t2: delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)
t_rel: t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2

it_eq_bt ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
t2: delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ (_observe t1) match _observe t2 with | RetF (inl m) => RetF m | RetF (inr (x,' p)) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) | TauF t => TauF (subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t) | VisF e _ => match e return (itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) with end end

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match _observe t1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match _observe t2 with | RetF r => RetF match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end | TauF t => TauF (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t) | VisF e k => VisF e (fun r : ex_falso e => (fun (_ : T1) (r0 : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)}) => match r0 with | inl r1 => inr r1 | inr e0 => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e0); red_act := m_strat_resp v (projT1 e0); red_pas := projT2 e0 |} end) <$> k r) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
t2: delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 match _observe t2 with | RetF (inl m) => RetF m | RetF (inr (x,' p)) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) | TauF t => TauF (subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t) | VisF e _ => match e return (itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) with end end

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match _observe t2 with | RetF r => RetF match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end | TauF t => TauF (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t) | VisF e k => VisF e (fun r : ex_falso e => (fun (_ : T1) (r0 : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)}) => match r0 with | inl r1 => inr r1 | inr e0 => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e0); red_act := m_strat_resp v (projT1 e0); red_pas := projT2 e0 |} end) <$> k r) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
ot2: itree' ∅ₑ (fun _ : T1 => (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)%type) T1_0
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 match ot2 with | RetF (inl m) => RetF m | RetF (inr (x,' p)) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) | TauF t => TauF (subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t) | VisF e _ => match e return (itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) with end end

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end match ot2 with | RetF r => RetF match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end | TauF t => TauF (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t) | VisF e k => VisF e (fun r : ex_falso e => (fun (_ : T1) (r0 : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)}) => match r0 with | inl r1 => inr r1 | inr e0 => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e0); red_act := m_strat_resp v (projT1 e0); red_pas := projT2 e0 |} end) <$> k r) end
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r: (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)%type
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r) (m_strat_resp p r)) end

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF match r with | inl r => inr r | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
t: itree ∅ₑ (fun _ : T1 => (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)%type) T1_0
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 (TauF (subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t))
it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (TauF (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry T1_0
k: forall r : e_rsp q, itree ∅ₑ (fun _ : T1 => (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)%type) (e_nxt r)
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 match q return (itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) with end
it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (VisF q (fun r : ex_falso q => (fun (_ : T1) (r0 : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)}) => match r0 with | inl r1 => inr r1 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) <$> k r))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
r: (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)%type
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r) (m_strat_resp p r)) end

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF match r with | inl r => inr r | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end)
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
p: obs ∙ Δ
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 (RetF p)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inr p))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
h: h_actv ogs_hg (m_strat_pas Δ) Φ
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 (let (x, p) := h in VisF x (fun r : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r) (m_strat_resp p r)))
it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inl {| red_ctx := Φ ▶ₓ m_dom (projT1 h); red_act := m_strat_resp v (projT1 h); red_pas := projT2 h |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
p: obs ∙ Δ
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 (RetF p)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inr p))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
r1, r2: (fun _ : ogs_ctx => obs ∙ Δ) Φ
r_rel: eqᵢ (fun _ : ogs_ctx => obs ∙ Δ) Φ r1 r2

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 (RetF (inr r1)) (RetF (inr r2))
do 2 econstructor; exact r_rel.
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
h: h_actv ogs_hg (m_strat_pas Δ) Φ
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 (let (x, p) := h in VisF x (fun r : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r) (m_strat_resp p r)))

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (RetF (inl {| red_ctx := Φ ▶ₓ m_dom (projT1 h); red_act := m_strat_resp v (projT1 h); red_pas := projT2 h |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
m: m_strat_pas Δ (g_next q)
k_rel: forall r : e_rsp q, k1 r ≊ (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom q) => m_strat (Φ ▶ₓ m_dom q ▶ₓ m_dom r0) (m_strat_resp m r0)) r

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 (RetF (inl {| alt_ctx := Φ ▶ₓ m_dom q; alt_act := v1 q; alt_pas := k1 |})) (RetF (inl {| red_ctx := Φ ▶ₓ m_dom q; red_act := m_strat_resp v q; red_pas := m |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
m: m_strat_pas Δ (g_next q)
k_rel: forall r : e_rsp q, k1 r ≊ (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom q) => m_strat (Φ ▶ₓ m_dom q ▶ₓ m_dom r0) (m_strat_resp m r0)) r

v1 q ≊ m_strat (red_ctx {| red_ctx := Φ ▶ₓ m_dom q; red_act := m_strat_resp v q; red_pas := m |}) (red_act {| red_ctx := Φ ▶ₓ m_dom q; red_act := m_strat_resp v q; red_pas := m |})
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
m: m_strat_pas Δ (g_next q)
k_rel: forall r : e_rsp q, k1 r ≊ (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom q) => m_strat (Φ ▶ₓ m_dom q ▶ₓ m_dom r0) (m_strat_resp m r0)) r
h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) (red_ctx {| red_ctx := Φ ▶ₓ m_dom q; red_act := m_strat_resp v q; red_pas := m |}) k1 (m_stratp (red_ctx {| red_ctx := Φ ▶ₓ m_dom q; red_act := m_strat_resp v q; red_pas := m |}) (red_pas {| red_ctx := Φ ▶ₓ m_dom q; red_act := m_strat_resp v q; red_pas := m |}))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
q: e_qry Φ
k1: forall x : e_rsp q, itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) (e_nxt x)
m: m_strat_pas Δ (g_next q)
k_rel: forall r : e_rsp q, k1 r ≊ (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom q) => m_strat (Φ ▶ₓ m_dom q ▶ₓ m_dom r0) (m_strat_resp m r0)) r

h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) (red_ctx {| red_ctx := Φ ▶ₓ m_dom q; red_act := m_strat_resp v q; red_pas := m |}) k1 (m_stratp (red_ctx {| red_ctx := Φ ▶ₓ m_dom q; red_act := m_strat_resp v q; red_pas := m |}) (red_pas {| red_ctx := Φ ▶ₓ m_dom q; red_act := m_strat_resp v q; red_pas := m |}))
exact k_rel.
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
t: itree ∅ₑ (fun _ : T1 => (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)%type) T1_0
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 (TauF (subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t))

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (TauF (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t))
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
t1: itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
t: itree ∅ₑ (fun _ : T1 => (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)%type) T1_0
t_rel: t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t

it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t)
now apply CIH.
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)
R: relᵢ (itree ∅ₑ ((fun _ : T1 => compo_alt_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ))) (itree ∅ₑ ((fun _ : T1 => reduce_t Δ) +ᵢ (fun _ : T1 => obs ∙ Δ)))
CIH: forall (t1 : itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) (t2 : delay (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)), t1 ≊ subst_delay (fun r : obs ∙ Δ + {x : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom x)} => {| _observe := match r with | inl m => RetF m | inr (x,' p) => VisF x (fun r0 : obs ∙ (↓⁻ Φ +▶ m_dom x) => m_strat (Φ ▶ₓ m_dom x ▶ₓ m_dom r0) (m_strat_resp p r0)) end |}) t2 -> it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R T1_0 (compo_alt_body {| alt_ctx := Φ; alt_act := t1; alt_pas := v1 |}) (fmap_delay (fun r : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)} => match r with | inl r0 => inr r0 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) t2)
ot1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry T1_0
k: forall r : e_rsp q, itree ∅ₑ (fun _ : T1 => (obs ∙ Δ + h_actv ogs_hg (m_strat_pas Δ) Φ)%type) (e_nxt r)
t_rel: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ot1 match q return (itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) with end

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq_t ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) R) T1_0 match ot1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (VisF q (fun r : ex_falso q => (fun (_ : T1) (r0 : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)}) => match r0 with | inl r1 => inr r1 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) <$> k r))
destruct q.
T, C: Type
CC: context T C
CL: context_laws T C
val: Fam₁ T C
VM: subst_monoid val
VML: subst_monoid_laws val
conf: Fam₀ T C
CM: subst_module val conf
CML: subst_module_laws val conf
obs: obs_struct T C
M: machine val conf obs
ML: machine_laws val conf obs
VV: var_assumptions val
Δ: C
Φ: ogs_ctx
u: ogs_env Δ Act Φ
v: m_strat_pas Δ Φ
v1: h_pasv ogs_hg (itree ogs_e (fun _ : ogs_ctx => obs ∙ Δ)) Φ
ou1: itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ
q: e_qry T1_0
k: forall r : e_rsp q, itree ∅ₑ (fun _ : T1 => nf obs val (Δ +▶ ↓⁺ Φ)) (e_nxt r)
H: it_eqF ogs_e (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ)) (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ ou1 match q return (itree' ogs_e (fun _ : ogs_ctx => obs ∙ Δ) Φ) with end
H0: h_pasvR ogs_hg (it_eq (eqᵢ (fun _ : ogs_ctx => obs ∙ Δ))) Φ v1 (m_stratp Φ v)

it_eqF ∅ₑ (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ))) (it_eq (sumᵣ (fun (_ : T1) (a : compo_alt_t Δ) => alt_t_seq Δ a ∘ reduce_t_inj) (eqᵢ (fun _ : T1 => obs ∙ Δ)))) T1_0 match ou1 with | RetF r => RetF (inr r) | TauF t => TauF (compo_alt_body {| alt_ctx := Φ; alt_act := t; alt_pas := v1 |}) | VisF e k => RetF (inl {| alt_ctx := Φ ▶ₓ m_dom e; alt_act := v1 e; alt_pas := k |}) end (VisF q (fun r : ex_falso q => (fun (_ : T1) (r0 : obs ∙ Δ + {m : obs ∙ ↓⁺ Φ & m_strat_pas Δ (Φ ▶ₓ m_dom m)}) => match r0 with | inl r1 => inr r1 | inr e => inl {| red_ctx := Φ ▶ₓ m_dom (projT1 e); red_act := m_strat_resp v (projT1 e); red_pas := projT2 e |} end) <$> ((fun _ : T1 => m_strat_wrap u) <$> k r)))
destruct q. Qed. End with_param.