Fixpoint effstepN (n:nat) : (block -> Z -> bool) -> C -> mem -> C -> mem -> Prop :=
match n with
| O => fun U c m c' m' => (c,m) = (c',m')
| S k => fun U c1 m1 c3 m3 => exists c2, exists m2,
effstep Sem g U c1 m1 c2 m2 /\
effstepN k (fun b ofs => U b ofs  || freshloc m1 m2 b)  c2 m2 c3 m3
end.

(* Specifications: *)
Lemma effstepN_fwd: forall n U c m c' m',
effstepN n U c m c' m' -> mem_forward m m'.
Lemma effstepN_corestepN: forall n E c m c' m',
effstepN n E c m c' m' -> corestepN Sem g n c m c' m'.
Lemma effstepN_unchanged: forall n U c1 m1 c2 m2,
effstepN n U c1 m1 c2 m2 ->
Mem.unchanged_on (fun b z => U b z = false) m1 m2.
Lemma effstepN_sub: forall n U V c m c' m'
(UV: forall b ofs, U b ofs = true -> V b ofs = true),
(effstepN n U c m c' m' -> effstepN n V c m c' m').
Lemma effstepN_add : forall n m U c1 m1 c3 m3,
effstepN (n+m) U c1 m1 c3 m3 <->
exists c2, exists m2,
effstepN n U c1 m1 c2 m2 /\
effstepN m (fun b z => U b z || freshloc m1 m2 b) c2 m2 c3 m3.