(* Lemma stronger_data_at_rec_derives: forall sh t v0 v1 pos p, legal_alignas_type t = true -> (alignof t | pos) -> v0 >>> v1 -> field_compatible t nil (offset_val (Int.repr pos) p) -> data_at_rec sh type_id_env.empty_ti t pos v0 p |-- data_at_rec sh type_id_env.empty_ti t pos v1 p. *)
(* Lemma stronger_data_at_rec_nested_field_derives: forall sh t gfs t0 v0 v1 p, legal_alignas_type t = true -> nested_field_type2 t gfs = t0 -> legal_nested_field t gfs -> v0 >>> v1 -> size_compatible t p -> align_compatible t p -> data_at_rec sh type_id_env.empty_ti t0 (nested_field_offset2 t gfs) v0 p |-- data_at_rec sh type_id_env.empty_ti t0 (nested_field_offset2 t gfs) v1 p. *)

(* Specifications: *)
Lemma stronger_trans: forall t (v0 v1 v2: reptype t),
v0 >>> v1 -> v1 >>> v2 -> v0 >>> v2.
Lemma field_at_stronger: forall sh t gfs v0 v1,
v0 >>> v1 ->
field_at sh t gfs v0 |-- field_at sh t gfs v1.
Lemma stronger_array_ext: forall t0 n a (v0 v1: reptype (Tarray t0 n a)),
Zlength (unfold_reptype v0) = Zlength (unfold_reptype v1) ->
(forall i, 0 <= i < n -> Znth i (unfold_reptype v0)  >>> Znth i (unfold_reptype v1)) ->
v0 >>> v1.
Lemma stronger_default_val: forall t v, v >>> default_val t.
Lemma stronger_proj_reptype: forall t v1 v2,
(v1 >>> v2) <->
(forall gfs, legal_nested_field t gfs -> type_is_by_value (nested_field_type t gfs) = true ->
proj_reptype t gfs v1 >>> proj_reptype t gfs v2).
Lemma data_equal_JMeq:
forall t t' a a' b b',
t=t' ->
@JMeq (reptype t) a (reptype t') a' ->
@JMeq (reptype t) b (reptype t') b' ->
a === b -> a' === b'.
Lemma eq_rect_r_data_equal: forall {t1 t2} v0 v1 (H: t1 = t2),
v0 === v1 ->
eq_rect_r reptype v0 H === eq_rect_r reptype v1 H.