(*************************************************************************)

Definition corestep_fun {C M : Type} (sem : @CoreSemantics C M) :=
  forall (m m' m'' : M) c c' c'',
  corestep sem c m c' m' ->
  corestep sem c m c'' m'' ->
  c'=c'' /\ m'=m''.Fixpoint corestepN (n:nat) : C -> M -> C -> M -> Prop :=
    match n with
      | O => fun c m c' m' => (c,m) = (c',m')
      | S k => fun c1 m1 c3 m3 => exists c2, exists m2,
        corestep Sem c1 m1 c2 m2 /\
        corestepN k c2 m2 c3 m3
    end.

(* Specifications: *)
Lemma corestepN_add : forall n m c1 m1 c3 m3, corestepN (n+m) c1 m1 c3 m3 <-> exists c2, exists m2, corestepN n c1 m1 c2 m2 /\ corestepN m c2 m2 c3 m3.
Lemma corestepN_add : forall n m c1 m1 c3 m3, corestepN (n+m) c1 m1 c3 m3 <-> exists c2, exists m2, corestepN n c1 m1 c2 m2 /\ corestepN m c2 m2 c3 m3.