End MATCH_PROGRAM_GENERIC.
(** In many cases, the context for [match_program_gen] is the source program or source compilation unit itself.  We provide a specialized definition for this case. *)
Definition match_program {F1 V1 F2 V2: Type} {LF: Linker F1} {LV: Linker V1}
(match_fundef: program F1 V1 -> F1 -> F2 -> Prop)
(match_varinfo: V1 -> V2 -> Prop)
(p1: program F1 V1) (p2: program F2 V2) : Prop :=
match_program_gen match_fundef match_varinfo p1 p1 p2.

(* Specifications: *)
Lemma match_program_main:
forall {F1 V1 F2 V2: Type} {LF: Linker F1} {LV: Linker V1}
{match_fundef: program F1 V1 -> F1 -> F2 -> Prop}
{match_varinfo: V1 -> V2 -> Prop}
{p1: program F1 V1} {p2: program F2 V2},
match_program match_fundef match_varinfo p1 p2 -> p2.(prog_main) = p1.(prog_main).
Lemma match_program_main:
forall {F1 V1 F2 V2: Type} {LF: Linker F1} {LV: Linker V1}
{match_fundef: program F1 V1 -> F1 -> F2 -> Prop}
{match_varinfo: V1 -> V2 -> Prop}
{p1: program F1 V1} {p2: program F2 V2},
match_program match_fundef match_varinfo p1 p2 -> p2.(prog_main) = p1.(prog_main).