proposition: Lemma frr_app_inv: forall from to ra g1 ra' rb rb' g3, forward_roots_relation from to (ra++rb) g1 (ra'++rb') g3 -> Zlength ra = Zlength ra' -> exists g2, forward_roots_relation from to ra g1 ra' g2 /\ forward_roots_relation from to rb g2 rb' g3.
proof: Proof. intros. remember (ra++rb) as rab. remember (ra'++rb') as rab'. revert ra ra' rb rb' Heqrab Heqrab' H0. induction H; intros; destruct ra, ra'; inv Heqrab; inv Heqrab'; simpl in *; subst. + exists g; split; constructor. + exists g1; split. constructor. econstructor; eauto. + list_solve. + list_solve. + edestruct IHforward_roots_relation as [g4 [? ?]]. 4:{ exists g4. split; try eassumption. econstructor; eauto. } auto. auto. list_solve. Qed.
imports: Coq.ZArith.ZArith Coq.Program.Basics Coq.micromega.Lia compcert.lib.Integers compcert.common.Values VST.veric.base VST.veric.Clight_lemmas VST.veric.val_lemmas VST.veric.shares VST.msl.seplog VST.msl.shares VST.zlist.sublist VST.floyd.coqlib3 VST.floyd.functional_base VST.floyd.data_at_rec_lemmas VST.zlist.list_solver CertiGraph.lib.EquivDec_ext CertiGraph.lib.List_ext CertiGraph.graph.graph_model CertiGraph.graph.graph_gen