Instance Inhabitant_share : Inhabitant share := Share.bot. (* TODO: remove this, it's already in sublist.v *)
Instance Inhabitant_mpred : Inhabitant mpred := @FF mpred Nveric. (* TODO: remove this, it's already in sublist.v *)

Lemma struct_pred_value_cohere : forall {cs : compspecs} m sh1 sh2 p t f off v1 v2
(Hsh1 : readable_share sh1) (Hsh2 : readable_share sh2)
(IH : Forall (fun it : ident * type => forall v1 v2 (p : val),
readable_share sh1 -> readable_share sh2 ->
data_at_rec sh1 (t it) v1 p * data_at_rec sh2 (t it) v2 p |--
data_at_rec sh1 (t it) v1 p * data_at_rec sh2 (t it) v1 p) m),
struct_pred m (fun (it : ident * type) v =>
withspacer sh1 (f it + sizeof (t it)) (off it) (at_offset (data_at_rec sh1 (t it) v) (f it))) v1 p *
struct_pred m (fun (it : ident * type) v =>
withspacer sh2 (f it + sizeof (t it)) (off it) (at_offset (data_at_rec sh2 (t it) v) (f it))) v2 p |--
struct_pred m (fun (it : ident * type) v =>
withspacer sh1 (f it + sizeof (t it)) (off it) (at_offset (data_at_rec sh1 (t it) v) (f it))) v1 p *
struct_pred m (fun (it : ident * type) v =>
withspacer sh2 (f it + sizeof (t it)) (off it) (at_offset (data_at_rec sh2 (t it) v) (f it))) v1 p.