(*Variable genv: G. Variable main: Values.val.*)
(*  Variable match_rmap_perm: jres -> dres -> Prop. Variable no_locks_perm: jres ->  Prop.   Axiom init_diagram: forall ge (j : Values.Val.meminj) (U:_) (js : jstate ge) (vals : list Values.val) (m m' : mem) (rmap: jres) (pmap: dres) main h, init_inj_ok j m -> match_rmap_perm rmap pmap -> no_locks_perm rmap -> initial_core (JMachineSem ge U (Some rmap)) h m (U, nil, js) m' main vals -> exists (ds : dstate ge), initial_core (DMachineSem ge U (Some pmap)) h m (U, nil, ds) m' main vals /\ invariant ds /\ match_st ge js ds.*)
(* There's no good generic way to describe the actual initial state, since it depends on the relationship between initial rmap/pmap and memory. *)

Axiom core_diagram:
forall ge (m : mem)  (U0 U U': _) rmap pmap
(ds : dstate ge) dtr (js js': jstate ge) jtr jtr'
(m' : mem),
corestep (JMachineSem ge U0 rmap) (U, jtr, js) m (U', jtr', js') m' ->
match_st ge js ds ->
invariant ds ->
exists (ds' : dstate ge),
invariant ds' /\
match_st ge js' ds' /\
exists dtr', corestep (DMachineSem ge U0 pmap) (U, dtr, ds) m (U', app dtr dtr', ds') m'.