(* 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.
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.
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).
Lemma apply_hist_app : forall h1 h2 H H', apply_hist H (h1 ++ h2) H' <-> exists H1, apply_hist H h1 H1 /\ apply_hist H1 h2 H'.
Lemma hashtable_A_forget : forall T lgk lgv entries, Forall (fun '(_, lv) => map_incl (singleton 0 0) lv) T -> Zlength T = size -> view_shift (hashtable_A T lgk lgv entries) (hashtable_A (repeat (0, singleton 0 0) (Z.to_nat size)) lgk lgv entries).
Lemma body_f : semax_body Vprog Gprog f_f f_spec.
Lemma add_fails : forall k v b l H H' (HH : apply_hist H l H') (Hadd : In (HAdd k v b) l) (Hk : H k <> None), b = false.
Lemma only_one_add_succeeds : forall k v1 v2 l i1 i2 H0 H (HH : apply_hist H0 l H) (Hin1 : Znth i1 l (HGet 0 0) = HAdd k v1 true) (Hin2 : Znth i2 l (HGet 0 0) = HAdd k v2 true), i2 = i1 /\ v2 = v1.
Lemma one_add_succeeds : forall k v b l H0 H (HH : apply_hist H0 l H) (Hk : H0 k = None) (Hin : In (HAdd k v b) l) (Hout : forall v, ~In (HSet k v) l), exists v', In (HAdd k v' true) l.
Lemma filter_find_count : forall {A} (f : A -> bool) d l li (Hunique : NoDup li) (Hli : forall i, In i li -> f (Znth i l d) = true) (Hrest : forall i, ~In i li -> f (Znth i l d) = false), Zlength (filter f l) = Zlength li.
Lemma hashtable_A_join : forall lgk lgv entries, hashtable_A (repeat (0, singleton 0 0) (Z.to_nat size)) lgk lgv entries * hashtable_A (repeat (0, singleton 0 0) (Z.to_nat size)) lgk lgv entries = hashtable_A (repeat (0, singleton 0 0) (Z.to_nat size)) lgk lgv entries.
Lemma body_main : semax_body Vprog Gprog f_main main_spec.