Section DECOMPOSITION.
Variable f: function.
Variable k: cont.
Variable e: env.
Variable m: mem.
Definition simple_side_effect (r: expr) : Prop :=
match r with
| Evalof l _ => simple l = true /\ type_is_volatile (typeof l) = true
| Eseqand r1 r2 _ => simple r1 = true
| Eseqor r1 r2 _ => simple r1 = true
| Econdition r1 r2 r3 _ => simple r1 = true
| Eassign l1 r2 _ => simple l1 = true /\ simple r2 = true
| Eassignop _ l1 r2 _ _ => simple l1 = true /\ simple r2 = true
| Epostincr _ l1 _ => simple l1 = true
| Ecomma r1 r2 _ => simple r1 = true
| Ecall r1 rl _ => simple r1 = true /\ simplelist rl = true
| Ebuiltin ef tyargs rl _ => simplelist rl = true
| Eparen r1 _ _ => simple r1 = true
| _ => False
end.
Scheme expr_ind2 := Induction for expr Sort Prop
with exprlist_ind2 := Induction for exprlist Sort Prop.
Combined Scheme expr_expr_list_ind from expr_ind2, exprlist_ind2.
Local Hint Constructors leftcontext leftcontextlist : core.
End DECOMPOSITION.
(** Simulation for expressions. *)
(** Simulation for all states *)

Theorem progress:
forall S,
safe S -> (exists r, final_state S r) \/ (exists t, exists S', step S t S').