Set Bullet Behavior "Strict Subproofs".
(*+ Initial state *)
Section Initial_State.
Variables
(CS : compspecs) (V : varspecs) (G : funspecs)
(ext_link : string -> ident) (prog : Clight.program)
(all_safe : semax_prog.semax_prog (Concurrent_Espec unit CS ext_link) prog V G)
(init_mem_not_none : Genv.init_mem prog <> None).
Definition Jspec := @OK_spec (Concurrent_Espec unit CS ext_link).
Definition init_m : { m | Genv.init_mem prog = Some m } :=
match Genv.init_mem prog as y return (y <> None -> {m : mem | y = Some m}) with
| Some m => fun _ => exist _ m eq_refl
| None => fun H => (fun Heq => False_rect _ (H Heq)) eq_refl
end init_mem_not_none.
Definition initial_state (n : nat) (sch : schedule) : cm_state :=
(proj1_sig init_m,
(nil, sch,
let spr := semax_prog_rule'
(Concurrent_Espec unit CS ext_link) V G prog
(proj1_sig init_m) 0 all_safe (proj2_sig init_m) in
let q : corestate := projT1 (projT2 spr) in
let jm : juicy_mem := proj1_sig (snd (projT2 (projT2 spr)) n tt) in
@OrdinalPool.mk LocksAndResources (ClightSemanticsForMachines.Clight_newSem (globalenv prog))
(pos.mkPos (le_n 1))
(* (fun _ => Kresume q Vundef) *)
(fun _ => Krun q)
(fun _ => m_phi jm)
(addressFiniteMap.AMap.empty _)
)
).

(* Specifications: *)
Lemma personal_mem_of_same_jm (tp : jstate (globalenv prog)) jm i (cnti : ThreadPool.containsThread tp i) mc :
(ThreadPool.getThreadR cnti = m_phi jm) ->
m_dry (@personal_mem (m_dry jm) (getThreadR cnti) mc) = m_dry jm.
Theorem initial_invariant n sch : state_invariant Jspec G n (initial_state n sch).
End Initial_State.