Set Bullet Behavior "Strict Subproofs".
Opaque upto.
(* The complement of make_shares. *)
Fixpoint make_shares_inv shs (lasts : list Z) i {struct lasts} : list share :=
match lasts with
| [] => []
| b :: rest => if eq_dec b i then hd Share.bot shs :: make_shares_inv (tl shs) rest i
else make_shares_inv (tl shs) rest i
end.

Lemma data_at_buffer_cohere : forall sh1 sh2 v1 v2 p, readable_share sh1 ->
data_at sh1 tbuffer v1 p * data_at sh2 tbuffer v2 p |--
data_at sh1 tbuffer v1 p * data_at sh2 tbuffer v1 p.