(* Why isn't this automatic? *)
Instance zero_ord_preorder : RelationClasses.PreOrder zero_ord.
Instance table_incl_preorder : RelationClasses.PreOrder table_incl.

(* Specifications: *)
Lemma table_incl_upd : forall T i k v, 0 <= i < Zlength T -> zero_ord (fst (Znth i T)) k ->
map_incl (snd (Znth i T)) v -> table_incl T (upd_Znth i T (k, v)).
Lemma HT_upd_exists : forall H k v (HH : match H k with Some lv => exists v, value_of lv v | None => True end),
exists H', HT_upd H k v H'.
Lemma zero_ord_0_inv : forall z, zero_ord z 0 -> z = 0.
(* up *)
Lemma andp_emp_dup : forall P, P && emp = (P && emp) * (P && emp).
Lemma body_get_item : semax_body Vprog Gprog f_get_item get_item_spec.
Lemma body_add_item : semax_body Vprog Gprog f_add_item add_item_spec.
Opaque Znth.
Lemma body_init_table : semax_body Vprog Gprog f_init_table init_table_spec.
Lemma lock_struct_array : forall sh z (v : list val) p,
data_at sh (tarray (tptr (Tstruct _lock_t noattr)) z) v p =
data_at sh (tarray (tptr tlock) z) v p.
Lemma f_pred_precise : forall tsh sh gsh (entries : list (val * val)) gh g lgk lgv p t locksp lockt resultsp res,
readable_share sh -> Zlength lgk = Zlength entries -> Zlength lgv = Zlength entries ->
precise (f_lock_pred tsh sh gsh entries gh g lgk lgv p t locksp lockt resultsp res).
Lemma f_pred_positive : forall tsh sh gsh entries gh g lgk lgv p t locksp lockt resultsp res,
positive_mpred (f_lock_pred tsh sh gsh entries gh g lgk lgv p t locksp lockt resultsp res).