(* Simultaneous evaluation of a list of expressions *)
Fixpoint list_eval (es:list expr) (vs:list val) : pred world :=
match es, vs with
| e::es', v::vs' => eval e v && list_eval es' vs'
| nil, nil => TT
| _, _ => FF
end.

(* The 'defined' predicate is sufficent to successfully perform a local variable update. *)
Lemma defined_update : forall i P n rho m v,
(defined i * P)%pred (n,(rho,m)) ->
exists rho',
LocalsMap.map_upd i v rho = Some rho' /\
(hasval i v * P)%pred (n,(rho',m)).