(*      semax vars G (fun s => call P (map s vars)) f -> *)
Definition program_proved (p: program) :=
exists G, semax_func G p G
/\ table_get G 0 = Some  (0::nil, lift1 allocpool (eval (Var 0))).

Axiom semax_assign: forall x y c vars G P,
expcheck vars y = true ->
semax (vs_add x vars) G P c ->
semax vars G (|> subst' x (eval y) P) (Do x := y ; c).