Section cc_simT_trans.

(* Specifications: *)
Lemma ccT_trans_CaseEq: forall {F1 C1 V F2 C2 F3 C3}
(Sem1 : CoopCoreSem (Genv.t F1 V) C1)
(Sem2 : CoopCoreSem (Genv.t F2 V) C2)
(Sem3 : CoopCoreSem (Genv.t F3 V) C3)
ExternIdents epts12 epts23 I
(P1 : AST.program F1 V) (P2 : AST.program F2 V) (P3 : AST.program F3 V)
transf12 (HP12: P2=transform_program transf12 P1) transf23
(ePts12_ok : CompilerCorrectness.entryPts_ok P1 P2 ExternIdents epts12)
(SimEq12 : Forward_simulation_eq.Forward_simulation_equals Sem1 Sem2 (Genv.globalenv P1)
(Genv.globalenv P2) epts12)
(SIM23 : CompilerCorrectness.cc_simT I ExternIdents epts23 F2 C2 V F3 C3 Sem2 Sem3 P2 P3 transf23)
(i1: I F1 C1 V Sem1 P1),
forall entrypoints13 : list (val * val * signature),
entrypoints_compose epts12 epts23 entrypoints13 ->
CompilerCorrectness.cc_simT I ExternIdents entrypoints13 F1 C1 V F3 C3
Sem1 Sem3 P1 P3 (fun f => transf23 (transf12 f)).
Lemma ccT_trans_CaseExtends: forall {F1 C1 V F2 C2 F3 C3}
(Sem1 : CoopCoreSem (Genv.t F1 V) C1)
(Sem2 : CoopCoreSem (Genv.t F2 V) C2)
(Sem3 : CoopCoreSem (Genv.t F3 V) C3)
ExternIdents epts12 epts23 I
(P1 : AST.program F1 V) (P2 : AST.program F2 V) (P3 : AST.program F3 V)
transf12 (HP12: P2=transform_program transf12 P1) transf23
(ePts12_ok : CompilerCorrectness.entryPts_ok P1 P2 ExternIdents epts12)
(SimExt12 :  Forward_simulation_ext.Forward_simulation_extends Sem1 Sem2 (Genv.globalenv P1)
(Genv.globalenv P2) epts12)
(SIM23 : CompilerCorrectness.cc_simT I ExternIdents epts23 F2 C2 V F3 C3 Sem2 Sem3 P2 P3 transf23)
(i1: I F1 C1 V Sem1 P1),
forall entrypoints13 : list (val * val * signature),
entrypoints_compose epts12 epts23 entrypoints13 ->
CompilerCorrectness.cc_simT I ExternIdents entrypoints13 F1 C1 V F3 C3 Sem1 Sem3 P1 P3 (fun f => transf23 (transf12 f)).
Lemma ccT_trans_CaseInject: forall {F1 C1 V F2 C2 F3 C3}
(Sem1 : CoopCoreSem (Genv.t F1 V) C1)
(Sem2 : CoopCoreSem (Genv.t F2 V) C2)
(Sem3 : CoopCoreSem (Genv.t F3 V) C3)
ExternIdents epts12 epts23 I
(P1 : AST.program F1 V) (P2 : AST.program F2 V) (P3 : AST.program F3 V)
transf12 (HP12: P2=transform_program transf12 P1) transf23
(ePts12_ok: forall m, Genv.init_mem P1 = Some m ->
CompilerCorrectness.entryPts_inject_ok P1 P2 (Mem.flat_inj (Mem.nextblock m)) ExternIdents epts12)
(VarsOK1: CompilerCorrectness.externvars_ok P1 ExternIdents)
(SimInj12: Forward_simulation_inj.Forward_simulation_inject Sem1 Sem2 (Genv.globalenv P1)
(Genv.globalenv P2) epts12)
(SIM23 : CompilerCorrectness.cc_simT I ExternIdents epts23 F2 C2 V F3 C3 Sem2 Sem3 P2 P3 transf23)
(i1: I F1 C1 V Sem1 P1),
forall entrypoints13 : list (val * val * signature),
entrypoints_compose epts12 epts23 entrypoints13 ->
CompilerCorrectness.cc_simT I ExternIdents entrypoints13 F1 C1 V F3 C3 Sem1 Sem3 P1 P3 (fun f => transf23 (transf12 f)).
Theorem ccT_sim_trans:
forall ExternIdents entrypoints12 I F1 C1 V F2 C2
(Sem1: CoopCoreSem (Genv.t F1 V) C1)
(Sem2: CoopCoreSem (Genv.t F2 V) C2)
P1 P2
transf12 (HP12: P2=transform_program transf12 P1)
(SIM12: CompilerCorrectness.cc_simT I ExternIdents entrypoints12
F1 C1 V F2 C2 Sem1 Sem2 P1 P2 transf12)
F3 C3 transf23
(Sem3: CoopCoreSem (Genv.t F3 V) C3)
entrypoints23 P3
(SIM23:CompilerCorrectness.cc_simT I ExternIdents entrypoints23 F2 C2 V F3 C3 Sem2 Sem3 P2 P3 transf23)
entrypoints13 (EPC:entrypoints_compose entrypoints12 entrypoints23 entrypoints13),
CompilerCorrectness.cc_simT I ExternIdents entrypoints13 F1 C1 V F3 C3 Sem1 Sem3 P1 P3 (fun f => transf23 (transf12 f)).