Remark var_names_app:
  forall vars1 vars2, var_names (vars1 ++ vars2) = var_names vars1 ++ var_names vars2.Remark filter_app:
  forall (A: Type) (f: A -> bool) l1 l2,
  List.filter f (l1 ++ l2) = List.filter f l1 ++ List.filter f l2.Remark filter_charact:
  forall (A: Type) (f: A -> bool) x l,
  In x (List.filter f l) <-> In x l /\ f x = true.Remark filter_norepet:
  forall (A: Type) (f: A -> bool) l,
  list_norepet l -> list_norepet (List.filter f l).Remark filter_map:
  forall (A B: Type) (f: A -> B) (pa: A -> bool) (pb: B -> bool),
  (forall a, pb (f a) = pa a) ->
  forall l, List.map f (List.filter pa l) = List.filter pb (List.map f l).

(* Specifications: *)
Lemma vars_and_temps_properties: forall cenv params vars temps, list_norepet (var_names params ++ var_names vars) -> list_disjoint (var_names params) (var_names temps) -> list_norepet (var_names params) /\ list_norepet (var_names (remove_lifted cenv (params ++ vars))) /\ list_disjoint (var_names params) (var_names (add_lifted cenv vars temps)).
Lemma assign_loc_inject: forall f ty m loc ofs v m' tm loc' ofs' v', assign_loc ge ty m loc ofs v m' -> Val.inject f (Vptr loc ofs) (Vptr loc' ofs') -> Val.inject f v v' -> Mem.inject f m tm -> exists tm', assign_loc tge ty tm loc' ofs' v' tm' /\ Mem.inject f m' tm' /\ (forall b chunk v, f b = None -> Mem.load chunk m b 0 = Some v -> Mem.load chunk m' b 0 = Some v).
Lemma assign_loc_nextblock: forall ge ty m b ofs v m', assign_loc ge ty m b ofs v m' -> Mem.nextblock m' = Mem.nextblock m.
Lemma bind_parameters_nextblock: forall ge e m params args m', bind_parameters ge e m params args m' -> Mem.nextblock m' = Mem.nextblock m.
Lemma free_list_perm': forall b lo hi l m m', Mem.free_list m l = Some m' -> In (b, lo, hi) l -> Mem.range_perm m b lo hi Cur Freeable.