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.

Adequacy (Def 6.1)

We prove in this module that the composition of strategy is adequate. The proof essentially proceeds by showing that "evaluating and observing", i.e., reduce, is a solution of the same equations as is the composition of strategies.

This argument assumes we can rely on the unicity of such a solution: we prove this fact by proving that these equations are eventually guarded in OGS/CompGuarded.v.

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} {ML : machine_laws val conf obs}.
  Context {VV : var_assumptions val}.

We define reduce, called "zip-then-eval-then-observe" in the paper.

  Definition reduce {Ξ”} (x : reduce_t Ξ”)
    : delay (obsβˆ™ Ξ”)
    := evalβ‚’ (x.(red_act).(ms_conf)
              β‚œβŠ› [ a_id , bicollapse x.(red_act).(ms_env) x.(red_pas) ]) .

  Definition reduce' {Ξ”} : forall i, reduce_t Ξ” -> itree βˆ…β‚‘ (fun _ : T1 => obsβˆ™ Ξ”) i
    := fun 'T1_0 => reduce .

Equipped with eventually guarded equations, we are ready to prove the adequacy.

First a technical lemma, rewriting one step of compo, then reduce to a simpler more explicit form.

  
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 Ξ”

(compo_body x >>= (fun (i : T1) (r : (fun _ : T1 => (reduce_t Ξ” + obs βˆ™ Ξ”)%type) i) => match r with | inl y => reduce' i y | inr o => Ret' (o : (fun _ : T1 => obs βˆ™ Ξ”) i) end)) β‰Š (eval (ms_conf (red_act x)) >>= (fun (i : T1) (n : (fun _ : T1 => nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (red_ctx x))) i) => match c_view_cat (nf_var n) with | Vcat_l i0 => Ret' (i0 β‹… nf_obs n) | Vcat_r j => reduce' i {| red_ctx := Game.g_next (j β‹… nf_obs n); red_act := m_strat_resp (red_pas x) (j β‹… nf_obs n); red_pas := ms_env (red_act x);⁻ nf_args n |} 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: reduce_t Ξ”

(compo_body x >>= (fun (i : T1) (r : (fun _ : T1 => (reduce_t Ξ” + obs βˆ™ Ξ”)%type) i) => match r with | inl y => reduce' i y | inr o => Ret' (o : (fun _ : T1 => obs βˆ™ Ξ”) i) end)) β‰Š (eval (ms_conf (red_act x)) >>= (fun (i : T1) (n : (fun _ : T1 => nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (red_ctx x))) i) => match c_view_cat (nf_var n) with | Vcat_l i0 => Ret' (i0 β‹… nf_obs n) | Vcat_r j => reduce' i {| red_ctx := Game.g_next (j β‹… nf_obs n); red_act := m_strat_resp (red_pas x) (j β‹… nf_obs n); red_pas := ms_env (red_act x);⁻ nf_args n |} 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: reduce_t Ξ”

(eval (ms_conf (red_act x)) >>= (fun i : T1 => (fun (i0 : T1) (x1 : obs βˆ™ Ξ” + {m : Game.g_move (red_ctx x) & m_strat_pas Ξ” (Game.g_next m)}) => match match x1 with | inl r => inr r | inr e => inl {| red_ctx := Game.g_next (projT1 e); red_act := m_strat_resp (red_pas x) (projT1 e); red_pas := projT2 e |} end with | inl y => reduce' i0 y | inr o => Ret' o end) i ∘ (fun _ : T1 => m_strat_wrap (ms_env (red_act x))) i)) β‰Š (eval (ms_conf (red_act x)) >>= (fun (i : T1) (n : nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (red_ctx x))) => match c_view_cat (nf_var n) with | Vcat_l i0 => Ret' (i0 β‹… nf_obs n) | Vcat_r j => reduce' i {| red_ctx := Game.g_next (j β‹… nf_obs n); red_act := m_strat_resp (red_pas x) (j β‹… nf_obs n); red_pas := ms_env (red_act x);⁻ nf_args n |} 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: reduce_t Ξ”

dpointwise_relation (fun i : T1 => (eq ==> it_eq (eqα΅’ (fun _ : T1 => obs βˆ™ Ξ”)) (i:=i))%signature) (fun (i : T1) (x0 : nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (red_ctx x))) => match match m_strat_wrap (ms_env (red_act x)) x0 with | inl r => inr r | inr e => inl {| red_ctx := Game.g_next (projT1 e); red_act := m_strat_resp (red_pas x) (projT1 e); red_pas := projT2 e |} end with | inl y => reduce' i y | inr o => Ret' o end) (fun (i : T1) (n : nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (red_ctx x))) => match c_view_cat (nf_var n) with | Vcat_l i0 => Ret' (i0 β‹… nf_obs n) | Vcat_r j => reduce' i {| red_ctx := Game.g_next (j β‹… nf_obs n); red_act := m_strat_resp (red_pas x) (j β‹… nf_obs n); red_pas := ms_env (red_act x);⁻ nf_args n |} 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: reduce_t Ξ”
a: T1
cut_ty: T
i: Ξ” +β–Ά Game.join_pol Game.Act (red_ctx x) βˆ‹ cut_ty
fill_op: obs cut_ty
fill_args: dom fill_op =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (red_ctx x))

match match m_strat_wrap (ms_env (red_act x)) (i β‹… fill_op ⦇ fill_args ⦈) with | inl r => inr r | inr e => inl {| red_ctx := Game.g_next (projT1 e); red_act := m_strat_resp (red_pas x) (projT1 e); red_pas := projT2 e |} end with | inl y => reduce' a y | inr o => Ret' o end β‰Š match c_view_cat (nf_var (i β‹… fill_op ⦇ fill_args ⦈)) with | Vcat_l i0 => Ret' (i0 β‹… nf_obs (i β‹… fill_op ⦇ fill_args ⦈)) | Vcat_r j => reduce' a {| red_ctx := Game.g_next (j β‹… nf_obs (i β‹… fill_op ⦇ fill_args ⦈)); red_act := m_strat_resp (red_pas x) (j β‹… nf_obs (i β‹… fill_op ⦇ fill_args ⦈)); red_pas := ms_env (red_act x);⁻ nf_args (i β‹… fill_op ⦇ fill_args ⦈) |} 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: reduce_t Ξ”
a: T1
cut_ty: T
i: Ξ” +β–Ά Game.join_pol Game.Act (red_ctx x) βˆ‹ cut_ty
fill_op: obs cut_ty
fill_args: dom fill_op =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (red_ctx x))

match match match c_view_cat i with | Vcat_l i => inl (i β‹… fill_op) | Vcat_r j => inr ((j β‹… fill_op),' (ms_env (red_act x);⁻ nf_args (i β‹… fill_op ⦇ fill_args ⦈))) end with | inl r => inr r | inr e => inl {| red_ctx := red_ctx x β–Άβ‚“ m_dom (projT1 e); red_act := m_strat_resp (red_pas x) (projT1 e); red_pas := projT2 e |} end with | inl y => reduce' a y | inr o => Ret' o end β‰Š match c_view_cat i with | Vcat_l i => Ret' (i β‹… fill_op) | Vcat_r j => reduce' a {| red_ctx := red_ctx x β–Άβ‚“ dom fill_op; red_act := m_strat_resp (red_pas x) (j β‹… fill_op); red_pas := ms_env (red_act x);⁻ nf_args (i β‹… fill_op ⦇ fill_args ⦈) |} end
now destruct (c_view_cat i). Qed.

Next we derive a variant of "evaluation respects substitution", working with partial assignments [ a_id , e ] instead of full assignments.

  Definition eval_split_sub {Ξ“ Ξ”} (c : conf (Ξ” +β–Ά Ξ“)) (e : Ξ“ =[val]> Ξ”)
    : delay (nf obs val Ξ”)
    := eval c >>= fun 'T1_0 n =>
         match c_view_cat (nf_var n) with
         | Vcat_l i => Ret' (i β‹… nf_obs n ⦇ nf_args n βŠ› [ v_var,  e ] ⦈)
         | Vcat_r j => eval (e _ j βŠ™ nf_obs n β¦— nf_args n βŠ› [ v_var,  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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”

eval (c β‚œβŠ› [a_id, e]) ≋ eval_split_sub c e
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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”

eval (c β‚œβŠ› [a_id, e]) ≋ eval_split_sub c e
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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”

eval (c β‚œβŠ› [a_id, e]) ≋ eval c >>= (fun pat : T1 => let 'T1_0 as x := pat return (nf obs val (Ξ” +β–Ά Ξ“) -> itree βˆ…β‚‘ (fun _ : T1 => nf obs val Ξ”) x) in fun n : nf obs val (Ξ” +β–Ά Ξ“) => match c_view_cat (nf_var n) with | Vcat_l i => Ret' (i β‹… nf_obs n ⦇ nf_args n βŠ› [a_id, e] ⦈) | Vcat_r j => eval (e (nf_ty n) j βŠ™ nf_obs n β¦— nf_args n βŠ› [a_id, 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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”

bind_delay' (eval c) (fun n : nf obs val (Ξ” +β–Ά Ξ“) => eval (emb n β‚œβŠ› [a_id, e])) ≋ eval c >>= (fun pat : T1 => let 'T1_0 as x := pat return (nf obs val (Ξ” +β–Ά Ξ“) -> itree βˆ…β‚‘ (fun _ : T1 => nf obs val Ξ”) x) in fun n : nf obs val (Ξ” +β–Ά Ξ“) => match c_view_cat (nf_var n) with | Vcat_l i => Ret' (i β‹… nf_obs n ⦇ nf_args n βŠ› [a_id, e] ⦈) | Vcat_r j => eval (e (nf_ty n) j βŠ™ nf_obs n β¦— nf_args n βŠ› [a_id, 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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”

dpointwise_relation (fun i : T1 => (eq ==> it_eq (fun _ : T1 => nf_eq) (i:=i))%signature) (fun pat : T1 => let 'T1_0 as x := pat return (nf obs val (Ξ” +β–Ά Ξ“) -> itree βˆ…β‚‘ (fun _ : T1 => nf obs val Ξ”) x) in fun y : nf obs val (Ξ” +β–Ά Ξ“) => eval (emb y β‚œβŠ› [a_id, e])) (fun pat : T1 => let 'T1_0 as x := pat return (nf obs val (Ξ” +β–Ά Ξ“) -> itree βˆ…β‚‘ (fun _ : T1 => nf obs val Ξ”) x) in fun n : nf obs val (Ξ” +β–Ά Ξ“) => match c_view_cat (nf_var n) with | Vcat_l i => Ret' (i β‹… nf_obs n ⦇ nf_args n βŠ› [a_id, e] ⦈) | Vcat_r j => eval (e (nf_ty n) j βŠ™ nf_obs n β¦— nf_args n βŠ› [a_id, 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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”
cut_ty: T
i: Ξ” +β–Ά Ξ“ βˆ‹ cut_ty
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Ξ“)

it_eq (fun _ : T1 => nf_eq) (eval (a_id i βŠ™ o β¦— nf_args (i β‹… o ⦇ a ⦈) ⦘ β‚œβŠ› [a_id, e])) match c_view_cat i with | Vcat_l i0 => Ret' (i0 β‹… o ⦇ nf_args (i β‹… o ⦇ a ⦈) βŠ› [a_id, e] ⦈) | Vcat_r j => eval (e cut_ty j βŠ™ o β¦— nf_args (i β‹… o ⦇ a ⦈) βŠ› [a_id, 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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Ξ“)
i: Ξ” βˆ‹ cut_ty

it_eq (fun _ : T1 => nf_eq) (eval (a_id (r_cat_l i) βŠ™ o β¦— nf_args (r_cat_l i β‹… o ⦇ a ⦈) ⦘ β‚œβŠ› [a_id, e])) (Ret' (i β‹… o ⦇ nf_args (r_cat_l i β‹… o ⦇ a ⦈) βŠ› [a_id, e] ⦈))
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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Ξ“)
j: Ξ“ βˆ‹ cut_ty
it_eq (fun _ : T1 => nf_eq) (eval (a_id (r_cat_r j) βŠ™ o β¦— nf_args (r_cat_r j β‹… o ⦇ a ⦈) ⦘ β‚œβŠ› [a_id, e])) (eval (e cut_ty j βŠ™ o β¦— nf_args (r_cat_r j β‹… o ⦇ a ⦈) βŠ› [a_id, e] ⦘))
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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Ξ“)
i: Ξ” βˆ‹ cut_ty

it_eq (fun _ : T1 => nf_eq) (eval (a_id (r_cat_l i) βŠ™ o β¦— nf_args (r_cat_l i β‹… o ⦇ a ⦈) ⦘ β‚œβŠ› [a_id, e])) (Ret' (i β‹… o ⦇ nf_args (r_cat_l i β‹… o ⦇ a ⦈) βŠ› [a_id, e] ⦈))
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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Ξ“)
i: Ξ” βˆ‹ cut_ty

it_eq (fun _ : T1 => nf_eq) (eval (a_id (r_cat_l i) βŠ™ o β¦— a ⦘ β‚œβŠ› [a_id, e])) (Ret' (i β‹… o ⦇ a βŠ› [a_id, e] ⦈))
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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Ξ“)
i: Ξ” βˆ‹ cut_ty

it_eq (fun _ : T1 => nf_eq) (eval (([a_id, e])%asgn cut_ty (r_cat_l i) βŠ™ o β¦— a βŠ› [a_id, e] ⦘)) (Ret' (i β‹… o ⦇ a βŠ› [a_id, e] ⦈))
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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Ξ“)
i: Ξ” βˆ‹ cut_ty

it_eq (fun _ : T1 => nf_eq) (eval (a_id i βŠ™ o β¦— a βŠ› [a_id, e] ⦘)) (Ret' (i β‹… o ⦇ a βŠ› [a_id, e] ⦈))
now apply (eval_nf_ret (i β‹… o ⦇ a βŠ› [a_id, e] ⦈)).
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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Ξ“)
j: Ξ“ βˆ‹ cut_ty

it_eq (fun _ : T1 => nf_eq) (eval (a_id (r_cat_r j) βŠ™ o β¦— nf_args (r_cat_r j β‹… o ⦇ a ⦈) ⦘ β‚œβŠ› [a_id, e])) (eval (e cut_ty j βŠ™ o β¦— nf_args (r_cat_r j β‹… o ⦇ a ⦈) βŠ› [a_id, e] ⦘))
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
c: conf (Ξ” +β–Ά Ξ“)
e: Ξ“ =[ val ]> Ξ”
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Ξ“)
j: Ξ“ βˆ‹ cut_ty

it_eq (fun _ : T1 => nf_eq) (eval (([a_id, e])%asgn cut_ty (r_cat_r j) βŠ™ o β¦— nf_args (r_cat_r j β‹… o ⦇ a ⦈) βŠ› [a_id, e] ⦘)) (eval (e cut_ty j βŠ™ o β¦— nf_args (r_cat_r j β‹… o ⦇ a ⦈) βŠ› [a_id, e] ⦘))
cbn; now rewrite c_view_cat_simpl_r. Qed.

Note the use of iter_evg_uniq: the proof of adequacy is proved by unicity of the fixed point, which is made possible by equivalently viewing the fixpoint combinator used to define the composition of strategy as a fixpoint of eventually guarded equations.

  
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: Game.ogs_ctx
c: m_strat_act Ξ” a
e: m_strat_pas Ξ” a

reduce {| red_ctx := a; red_act := c; red_pas := e |} β‰Š (c βˆ₯g e)
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: Game.ogs_ctx
c: m_strat_act Ξ” a
e: m_strat_pas Ξ” a

reduce {| red_ctx := a; red_act := c; red_pas := e |} β‰Š (c βˆ₯g e)
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: Game.ogs_ctx
c: m_strat_act Ξ” a
e: m_strat_pas Ξ” a

forall (i : T1) (x : reduce_t Ξ”), (let 'T1_0 as x0 := i return (reduce_t Ξ” -> itree βˆ…β‚‘ (fun _ : T1 => obs βˆ™ Ξ”) x0) in fun u : reduce_t Ξ” => reduce u) x β‰Š ((let 'T1_0 as x0 := i return (reduce_t Ξ” -> itree βˆ…β‚‘ ((fun _ : T1 => reduce_t Ξ”) +α΅’ (fun _ : T1 => obs βˆ™ Ξ”)) x0) in fun u : reduce_t Ξ” => compo_body u) x >>= (fun (i0 : T1) (r : ((fun _ : T1 => reduce_t Ξ”) +α΅’ (fun _ : T1 => obs βˆ™ Ξ”)) i0) => match r with | inl x0 => (let 'T1_0 as x1 := i0 return (reduce_t Ξ” -> itree βˆ…β‚‘ (fun _ : T1 => obs βˆ™ Ξ”) x1) in fun u : reduce_t Ξ” => reduce u) x0 | inr y => Ret' y 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx

reduce {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |} β‰Š (compo_body {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |} >>= (fun (i : T1) (r : ((fun _ : T1 => reduce_t Ξ”) +α΅’ (fun _ : T1 => obs βˆ™ Ξ”)) i) => match r with | inl x => (let 'T1_0 as x0 := i return (reduce_t Ξ” -> itree βˆ…β‚‘ (fun _ : T1 => obs βˆ™ Ξ”) x0) in fun u : reduce_t Ξ” => reduce u) x | inr y => Ret' y 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx

reduce {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |} β‰Š (eval (ms_conf (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) >>= (fun (i : T1) (n : nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))) => match c_view_cat (nf_var n) with | Vcat_l i0 => Ret' (i0 β‹… nf_obs n) | Vcat_r j => reduce' i {| red_ctx := Game.g_next (j β‹… nf_obs n); red_act := m_strat_resp (Strategy.red_pas {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) (j β‹… nf_obs n); red_pas := ms_env (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |});⁻ nf_args n |} 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx

then_to_obs (eval_split_sub (ms_conf (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) (bicollapse (ms_env (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) (Strategy.red_pas {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))) β‰Š (eval (ms_conf (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) >>= (fun (i : T1) (n : nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))) => match c_view_cat (nf_var n) with | Vcat_l i0 => Ret' (i0 β‹… nf_obs n) | Vcat_r j => reduce' i {| red_ctx := Game.g_next (j β‹… nf_obs n); red_act := m_strat_resp (Strategy.red_pas {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) (j β‹… nf_obs n); red_pas := ms_env (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |});⁻ nf_args n |} 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx

(eval (ms_conf (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) >>= (fun i : T1 => fmap (fun _ : T1 => nf_to_obs Ξ”) i ∘ (fun pat : T1 => let 'T1_0 as x0 := pat return (nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) -> itree βˆ…β‚‘ (fun _ : T1 => nf obs val Ξ”) x0) in fun n : nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) => match c_view_cat (nf_var n) with | Vcat_l i0 => Ret' (i0 β‹… nf_obs n ⦇ nf_args n βŠ› [a_id, bicollapse (ms_env (red_act {| ...; ...; ... |})) (Strategy.red_pas {| red_ctx := red_ctx; red_act := {| ... |}; red_pas := red_pas |})] ⦈) | Vcat_r j => eval (bicollapse (ms_env (red_act {| red_ctx := red_ctx; red_act := {| ...; ... |}; red_pas := red_pas |})) (Strategy.red_pas {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) (nf_ty n) j βŠ™ nf_obs n β¦— nf_args n βŠ› [a_id, bicollapse (ms_env (red_act {| red_ctx := red_ctx; red_act := ...; red_pas := red_pas |})) (Strategy.red_pas {| red_ctx := red_ctx; red_act := {| ...; ... |}; red_pas := red_pas |})] ⦘) end) i)) β‰Š (eval (ms_conf (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) >>= (fun (i : T1) (n : nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))) => match c_view_cat (nf_var n) with | Vcat_l i0 => Ret' (i0 β‹… nf_obs n) | Vcat_r j => reduce' i {| red_ctx := Game.g_next (j β‹… nf_obs n); red_act := m_strat_resp (Strategy.red_pas {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) (j β‹… nf_obs n); red_pas := ms_env (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |});⁻ nf_args n |} 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx

dpointwise_relation (fun i : T1 => (eq ==> it_eq (eqα΅’ (fun _ : T1 => obs βˆ™ Ξ”)) (i:=i))%signature) (fun i : T1 => fmap (fun _ : T1 => nf_to_obs Ξ”) i ∘ (let 'T1_0 as x0 := i return (nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) -> itree βˆ…β‚‘ (fun _ : T1 => nf obs val Ξ”) x0) in fun n : nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) => match c_view_cat (nf_var n) with | Vcat_l i0 => Ret' (i0 β‹… nf_obs n ⦇ nf_args n βŠ› [a_id, bicollapse (ms_env (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) (Strategy.red_pas {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})] ⦈) | Vcat_r j => eval (bicollapse (ms_env (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) (Strategy.red_pas {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) (nf_ty n) j βŠ™ nf_obs n β¦— nf_args n βŠ› [a_id, bicollapse (ms_env (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})) (Strategy.red_pas {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |})] ⦘) end)) (fun (i : T1) (n : nf obs val (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))) => match c_view_cat (nf_var n) with | Vcat_l i0 => Ret' (i0 β‹… nf_obs n) | Vcat_r j => reduce' i {| red_ctx := Game.g_next (j β‹… nf_obs n); red_act := m_strat_resp (Strategy.red_pas {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) (j β‹… nf_obs n); red_pas := ms_env (red_act {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |});⁻ nf_args n |} 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
i: Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))

((fun _ : T1 => nf_to_obs Ξ”) <$> match c_view_cat i with | Vcat_l i0 => Ret' (i0 β‹… o ⦇ nf_args (i β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦈) | Vcat_r j => eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— nf_args (i β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦘) end) β‰Š match c_view_cat i with | Vcat_l i => Ret' (i β‹… o) | Vcat_r j => reduce {| red_ctx := red_ctx β–Άβ‚“ dom o; red_act := m_strat_resp red_pas (j β‹… o); red_pas := v;⁻ nf_args (i β‹… o ⦇ a ⦈) |} 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
i: Ξ” βˆ‹ cut_ty

((fun _ : T1 => nf_to_obs Ξ”) <$> match c_view_cat (r_cat_l i) with | Vcat_l i0 => Ret' (i0 β‹… o ⦇ nf_args (r_cat_l i β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦈) | Vcat_r j => eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— nf_args (r_cat_l i β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦘) end) β‰Š match c_view_cat (r_cat_l i) with | Vcat_l i => Ret' (i β‹… o) | Vcat_r j => reduce {| red_ctx := red_ctx β–Άβ‚“ dom o; red_act := m_strat_resp red_pas (j β‹… o); red_pas := v;⁻ nf_args (r_cat_l i β‹… o ⦇ a ⦈) |} 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
((fun _ : T1 => nf_to_obs Ξ”) <$> match c_view_cat (r_cat_r j) with | Vcat_l i => Ret' (i β‹… o ⦇ nf_args (r_cat_r j β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦈) | Vcat_r j0 => eval (bicollapse v red_pas cut_ty j0 βŠ™ o β¦— nf_args (r_cat_r j β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦘) end) β‰Š match c_view_cat (r_cat_r j) with | Vcat_l i => Ret' (i β‹… o) | Vcat_r j0 => reduce {| red_ctx := red_ctx β–Άβ‚“ dom o; red_act := m_strat_resp red_pas (j0 β‹… o); red_pas := v;⁻ nf_args (r_cat_r j β‹… o ⦇ a ⦈) |} 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
i: Ξ” βˆ‹ cut_ty

((fun _ : T1 => nf_to_obs Ξ”) <$> match c_view_cat (r_cat_l i) with | Vcat_l i0 => Ret' (i0 β‹… o ⦇ nf_args (r_cat_l i β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦈) | Vcat_r j => eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— nf_args (r_cat_l i β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦘) end) β‰Š match c_view_cat (r_cat_l i) with | Vcat_l i => Ret' (i β‹… o) | Vcat_r j => reduce {| red_ctx := red_ctx β–Άβ‚“ dom o; red_act := m_strat_resp red_pas (j β‹… o); red_pas := v;⁻ nf_args (r_cat_l i β‹… o ⦇ a ⦈) |} 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
i: Ξ” βˆ‹ cut_ty

((fun _ : T1 => nf_to_obs Ξ”) <$> Ret' (i β‹… o ⦇ nf_args (r_cat_l i β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦈)) β‰Š Ret' (i β‹… o)
apply it_eq_unstep; cbn; do 2 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

((fun _ : T1 => nf_to_obs Ξ”) <$> match c_view_cat (r_cat_r j) with | Vcat_l i => Ret' (i β‹… o ⦇ nf_args (r_cat_r j β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦈) | Vcat_r j0 => eval (bicollapse v red_pas cut_ty j0 βŠ™ o β¦— nf_args (r_cat_r j β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦘) end) β‰Š match c_view_cat (r_cat_r j) with | Vcat_l i => Ret' (i β‹… o) | Vcat_r j0 => reduce {| red_ctx := red_ctx β–Άβ‚“ dom o; red_act := m_strat_resp red_pas (j0 β‹… o); red_pas := v;⁻ nf_args (r_cat_r j β‹… o ⦇ a ⦈) |} 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— nf_args (r_cat_r j β‹… o ⦇ a ⦈) βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š reduce {| red_ctx := red_ctx β–Άβ‚“ dom o; red_act := m_strat_resp red_pas (j β‹… o); red_pas := v;⁻ nf_args (r_cat_r j β‹… o ⦇ a ⦈) |}
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1 βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]) βŠ™ o β¦— (r_cat_rr α΅£βŠ› a_id) βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]] ⦘
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
(* AAAAA setoid rewriting!!!! *)
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

?y = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1 βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]) βŠ™ o β¦— (r_cat_rr α΅£βŠ› a_id) βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]] ⦘
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = ?y
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

val (Ξ” +β–Ά Game.join_pol Game.Pas red_ctx) cut_ty
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
(Ξ” +β–Ά Game.join_pol Game.Pas red_ctx) =[ val ]> Ξ”
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
?y = (?y0 α΅₯βŠ› ?y1) βŠ™ o β¦— (r_cat_rr α΅£βŠ› a_id) βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]] ⦘
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
ₐ↓ red_pas cut_ty j = ?y0
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
r_emb r_cat3_1 βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]] ≑ₐ ?y1
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = ?y
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

r_emb r_cat3_1 βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]] ≑ₐ ?y1
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

r_cat3_1 α΅£βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]] ≑ₐ ?y1
now rewrite r_cat3_1_simpl; 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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

val (Ξ” +β–Ά Game.join_pol Game.Pas red_ctx) cut_ty
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
?y = (?y0 α΅₯βŠ› [a_id, bicollapse v red_pas]) βŠ™ o β¦— (r_cat_rr α΅£βŠ› a_id) βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]] ⦘
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
ₐ↓ red_pas cut_ty j = ?y0
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = ?y
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› [a_id, bicollapse v red_pas]) βŠ™ o β¦— (r_cat_rr α΅£βŠ› a_id) βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]] ⦘
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› [a_id, bicollapse v red_pas]) βŠ™ o β¦— r_cat_rr α΅£βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]] ⦘
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
subst_monoid_laws val
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› [a_id, bicollapse v red_pas]) βŠ™ o β¦— r_cat_r α΅£βŠ› (r_cat_r α΅£βŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]) ⦘
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
subst_monoid_laws val
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› [a_id, bicollapse v red_pas]) βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
subst_monoid_laws val
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: (@eq ∘ (fun _ : Game.join_pol (Game.p_switch Game.Pas) red_ctx βˆ‹ cut_ty => val Ξ” cut_ty)) j ((ₐ↓ red_pas βŠ› [a_id, bicollapse v red_pas])%asgn cut_ty j) (bicollapse v red_pas cut_ty j)

bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› [a_id, bicollapse v red_pas]) βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
subst_monoid_laws val
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty

subst_monoid_laws val
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]

((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
H: bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘ = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]
xx:= bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘: conf Ξ”

((fun _ : T1 => nf_to_obs Ξ”) <$> eval (bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘)) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
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
red_ctx: Game.ogs_ctx
u: conf (Ξ” +β–Ά Game.join_pol Game.Act red_ctx)
v: ogs_env Ξ” Game.Act red_ctx
red_pas: m_strat_pas Ξ” red_ctx
cut_ty: T
o: obs cut_ty
a: dom o =[ val ]> (Ξ” +β–Ά Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}))
j: Game.join_pol Game.Act (Strategy.red_ctx {| red_ctx := red_ctx; red_act := {| ms_conf := u; ms_env := v |}; red_pas := red_pas |}) βˆ‹ cut_ty
xx:= bicollapse v red_pas cut_ty j βŠ™ o β¦— a βŠ› [a_id, bicollapse v red_pas] ⦘: conf Ξ”
H: xx = (ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]]

((fun _ : T1 => nf_to_obs Ξ”) <$> eval xx) β‰Š evalβ‚’ ((ₐ↓ red_pas cut_ty j α΅₯βŠ› r_emb r_cat3_1) βŠ™ o β¦— r_cat_rr α΅£βŠ› a_id ⦘ β‚œβŠ› [a_id, [bicollapse v red_pas, a βŠ› [a_id, bicollapse v red_pas]]])
now rewrite H. Qed.

Adequacy (Def 6.1) holds.

  
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
c: conf Ξ“
e: Ξ“ =[ val ]> Ξ”

evalβ‚’ (c β‚œβŠ› e) β‰Š (inj_init_act Ξ” c βˆ₯g inj_init_pas e)
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
c: conf Ξ“
e: Ξ“ =[ val ]> Ξ”

evalβ‚’ (c β‚œβŠ› e) β‰Š (inj_init_act Ξ” c βˆ₯g inj_init_pas e)
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
c: conf Ξ“
e: Ξ“ =[ val ]> Ξ”

evalβ‚’ (c β‚œβŠ› e) β‰Š evalβ‚’ ((c β‚œβŠ› r_emb (r_cat_r α΅£βŠ› r_cat_r)) β‚œβŠ› [a_id, [!, (e βŠ›α΅£ r_cat_l) βŠ› [a_id, !]]])
now rewrite <- c_sub_sub, a_ren_r_simpl, a_ren_l_comp, 2 a_cat_proj_r, a_ren_comp, a_cat_proj_l, a_comp_id. Qed. End with_param.