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') /\ U = (fun b z => false)
      | S k => fun U c1 m1 c3 m3 => exists c2, exists m2, exists U1, exists U2,
        effstep Sem U1 c1 m1 c2 m2 /\
        effstepN k U2 c2 m2 c3 m3 /\
        U = (fun b z => U1 b z || (U2 b z && valid_block_dec m1 b))
    end.

(* Specifications: *)
Lemma effstepN_perm: forall n U c1 m1 c2 m2, effstepN n U c1 m1 c2 m2 -> forall b z, U b z = true -> Mem.perm m1 b z Cur Writable.
Lemma effstepN_valid n U c1 m1 c2 m2 (Step:effstepN n U c1 m1 c2 m2) b z (EFF:U b z = true): Mem.valid_block m1 b.
Lemma effstepN_mem: forall n U c m c' m' (EF: effstepN n U c m c' m'), mem_step m m'.
Lemma effstepN_fwd n U c m c' m' (EF: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 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_trans: forall n1 n2 U1 st1 m1 st2 m2 U2 st3 m3, effstepN n1 U1 st1 m1 st2 m2 -> effstepN n2 U2 st2 m2 st3 m3 -> effstepN (n1+n2) (fun b z => U1 b z || (U2 b z && valid_block_dec m1 b)) st1 m1 st3 m3.
Lemma effstepN_trans': forall n1 n2 U U1 st1 m1 st2 m2 U2 st3 m3, effstepN n1 U1 st1 m1 st2 m2 -> effstepN n2 U2 st2 m2 st3 m3 -> U = (fun b z => U1 b z || (U2 b z && valid_block_dec m1 b)) -> effstepN (n1+n2) U st1 m1 st3 m3.