Section EQEXT.

Lemma diagram_eqext: forall
(core_data12 : Type)
(match_core12 : core_data12 -> C1 -> C2 -> Prop)
(core_ord12 : core_data12 -> core_data12 -> Prop)
(core_diagram12 : forall (st1 : C1) (m : mem) (st1' : C1) (m' : mem),
corestep Sem1 g1 st1 m st1' m' ->
forall (d : core_data12) (st2 : C2),
match_core12 d st1 st2 ->
exists st2' : C2,
exists d' : core_data12,
match_core12 d' st1' st2' /\
(corestep_plus Sem2 g2 st2 m st2' m' \/
corestep_star Sem2 g2 st2 m st2' m' /\
core_ord12 d' d))
(core_data23 : Type)
(match_core23 : core_data23 -> C2 -> mem -> C3 -> mem -> Prop)
(core_ord23 : core_data23 -> core_data23 -> Prop)
(core_diagram23 : forall (st1 : C2) (m1 : mem) (st1' : C2) (m1' : mem),
corestep Sem2 g2 st1 m1 st1' m1' ->
forall (cd : core_data23) (st2 : C3) (m2 : mem),
match_core23 cd st1 m1 st2 m2 ->
exists st2' : C3,
exists m2' : mem,
exists cd' : core_data23,
match_core23 cd' st1' m1' st2' m2' /\
(corestep_plus Sem3 g3 st2 m2 st2' m2' \/
corestep_star Sem3 g3 st2 m2 st2' m2' /\ core_ord23 cd' cd))
(st1 : C1)
(m1 : mem)
(st1' : C1)
(m1' : mem)
(CS1 : corestep Sem1 g1 st1 m1 st1' m1')
(d12 : core_data12)
(d23 : core_data23)
(st3 : C3)
(m3 : mem)
(st2 : C2)
(MC12: match_core12 d12 st1 st2)
(MC23: match_core23 d23 st2 m1 st3 m3),
exists st2' : C3,
exists m2' : mem,
exists cd' : core_data12 * option C2 * core_data23,
(let (y, d2) := cd' in
let (d1, X) := y in
exists c2 : C2,
X = Some c2 /\
match_core12 d1 st1' c2 /\ match_core23 d2 c2 m1' st2' m2') /\
(corestep_plus Sem3 g3 st3 m3 st2' m2' \/
corestep_star Sem3 g3 st3 m3 st2' m2' /\
clos_trans (core_data12 * option C2 * core_data23)
(sem_compose_ord_eq_eq core_ord12 core_ord23 C2) cd'
(d12, Some st2, d23)).