(*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. *)

(* Specifications: *)
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'.
Axiom halted_diagram:
forall ge U (ds : dmachine_state ge) (js : jmachine_state ge)  rmap pmap,
fst (fst js) = fst (fst ds) ->
halted (JMachineSem ge U rmap) js = halted (DMachineSem ge U pmap) ds.