(** The following two theorems are simpler versions for the case where the function transformation does not depend on the compilation unit. *)

(* Specifications: *)
Theorem match_transform_partial_program:
forall {A B V: Type} {LA: Linker A} {LV: Linker V}
(transf_fun: A -> res B)
(p: program A V) (tp: program B V),
transform_partial_program transf_fun p = OK tp ->
match_program (fun cu f tf => transf_fun f = OK tf) eq p tp.
Theorem match_transform_program:
forall {A B V: Type} {LA: Linker A} {LV: Linker V}
(transf: A -> B)
(p: program A V),
match_program (fun cu f tf => tf = transf f) eq p (transform_program transf p).
Theorem match_transform_partial_program:
forall {A B V: Type} {LA: Linker A} {LV: Linker V}
(transf_fun: A -> res B)
(p: program A V) (tp: program B V),
transform_partial_program transf_fun p = OK tp ->
match_program (fun cu f tf => transf_fun f = OK tf) eq p tp.
Theorem match_transform_program:
forall {A B V: Type} {LA: Linker A} {LV: Linker V}
(transf: A -> B)
(p: program A V),
match_program (fun cu f tf => tf = transf f) eq p (transform_program transf p).