(** Assuming safety of cooperative VST.concurrency*)
Section Safety.
Variables (f : val) (arg : list val).
Variable init_coarse_safe:
forall sched tpc mem' n,
tpc_init sched init_mem (sched, [::], tpc) mem' f arg ->
HybridCoarseMachine.csafe (sched,[::],tpc) mem' n.
(** [init_mach] and [init_mem] are related by [mem_compatible]*)
(* Lemma init_compatible: *)
(*   forall pmap tp m m', *)
(*     @init_mach DryHybridMachine.dryResources _ _ _ pmap m tp m' f arg -> *)
(*     mem_compatible tp m'. *)
(* Proof. *)
(*   intros. *)
(*   destruct init_perm as [pmap|] eqn:Hinit_perm; *)
(*     [| eapply init_mach_none in H0; now exfalso]. *)
(*   unfold init_perm in Hinit_perm. *)
(*   rewrite H in Hinit_perm. *)
(*   inversion Hinit_perm; subst. *)
(*   constructor. *)
(*   - intros j cntj. *)
(*     pose proof (init_thread H0 cntj); subst. *)
(*     erewrite getThreadR_init by eauto. *)
(*     simpl. *)
(*     split; [intros ? ?; now apply getCur_Max |now apply empty_LT]. *)
(*   - intros. *)
(*     erewrite init_lockRes_empty in H1 by eauto. *)
(*     discriminate. *)
(*   - intros. *)
(*     erewrite init_lockRes_empty in H1 by eauto. *)
(*     discriminate. *)
(* Qed. *)

(** Establishing the simulation relation for the initial state*)
Lemma init_sim:
forall sched tpc tpf m' n (ARG:valid_val_list (id_ren init_mem) arg),
tpc_init sched init_mem (sched, [::], tpc) m' f arg ->
tpf_init sched init_mem (sched, [::], tpf) m' f arg ->
SimDefs.sim tpc [::] m' tpf [::] (@diluteMem FineDilMem m') nil (id_ren m')
(id_ren init_mem) (fun i cnti => id_ren m') n.