Module NodesetFacts := FSetFacts.Facts(Nodeset).Definition match_prog (p: LTL.program) (tp: Linear.program) :=
  match_program (fun ctx f tf => transf_fundef f = OK tf) eq p tp.

(* Specifications: *)
Lemma transf_program_match: forall p tp, transf_program p = OK tp -> match_prog p tp.
Lemma functions_translated: forall v f, Genv.find_funct ge v = Some f -> exists tf, Genv.find_funct tge v = Some tf /\ transf_fundef f = OK tf.
Lemma function_ptr_translated: forall v f, Genv.find_funct_ptr ge v = Some f -> exists tf, Genv.find_funct_ptr tge v = Some tf /\ transf_fundef f = OK tf.
Lemma symbols_preserved: forall id, Genv.find_symbol tge id = Genv.find_symbol ge id.
Lemma senv_preserved: Senv.equiv ge tge.
Lemma sig_preserved: forall f tf, transf_fundef f = OK tf -> Linear.funsig tf = LTL.funsig f.
Lemma stacksize_preserved: forall f tf, transf_function f = OK tf -> Linear.fn_stacksize tf = LTL.fn_stacksize f.
Lemma find_function_translated: forall ros ls f, LTL.find_function ge ros ls = Some f -> exists tf, find_function tge ros ls = Some tf /\ transf_fundef f = OK tf.
Lemma nodeset_of_list_correct: forall l s s', nodeset_of_list l s = OK s' -> list_norepet l /\ (forall pc, Nodeset.In pc s' <-> Nodeset.In pc s \/ In pc l) /\ (forall pc, In pc l -> ~Nodeset.In pc s).
Lemma enumerate_norepet: forall f enum, enumerate f = OK enum -> list_norepet enum.