End corestepN.
(** "Cooperating" semantics impose additional constraints; in particular, they require that the memories produced by coresteps contain no dangling pointers. *)
Record CoopCoreSem {G C} :=
{ coopsem :> CoreSemantics G C mem;
corestep_fwd : forall g c m c' m' (CS: corestep coopsem g c m c' m'),
mem_forward m m'
(*; corestep_wdmem: forall g c m c' m' (CS: corestep coopsem g c m c' m'), mem_wd m -> mem_wd m'*)
(*Doesn't make sense any longer: initial_mem is a property of program, not cores; initmem_wd: forall g m d, initial_mem coopsem g m d -> mem_wd m*)
}.
Implicit Arguments CoopCoreSem [].
Section CoopCoreSemLemmas.
Context {G C: Type}.
Variable coopsem: CoopCoreSem G C.

(* Specifications: *)
Lemma corestepN_fwd: forall ge c m c' m' n,
corestepN coopsem ge n c m c' m' ->
mem_forward m m'.
Lemma corestep_star_fwd: forall g c m c' m'
(CS:corestep_star coopsem g c m c' m'),
mem_forward m m'.
Lemma corestep_plus_fwd: forall g c m c' m'
(CS:corestep_plus coopsem g c m c' m'),
mem_forward m m'.