(************************************************  Lemmas about underscore and memory_block  ************************************************)

(* Specifications: *)
Lemma field_at_field_at_: forall sh t gfs v p,
field_at sh t gfs v p |-- field_at_ sh t gfs p.
Lemma field_at_field_at_default : forall sh t gfs v v' p,
v' = default_val (nested_field_type t gfs) ->
field_at sh t gfs v p |-- field_at sh t gfs v' p.
Lemma field_at__memory_block: forall sh t gfs p,
field_at_ sh t gfs p =
memory_block sh (sizeof (nested_field_type t gfs)) (field_address t gfs p).
Lemma data_at_data_at_ : forall sh t v p,
data_at sh t v p |-- data_at_ sh t p.
Lemma data_at_data_at_default : forall sh t v v' p,
v' = default_val (nested_field_type t nil) ->
data_at sh t v p |-- data_at sh t v' p.
Lemma data_at__memory_block: forall sh t p,
data_at_ sh t p =
(!! field_compatible t nil p) && memory_block sh (sizeof t) p.
Lemma memory_block_data_at_: forall sh t p,
field_compatible t nil p ->
memory_block sh (sizeof t) p = data_at_ sh t p.
Lemma data_at__memory_block_cancel:
forall sh t p,
data_at_ sh t p |-- memory_block sh (sizeof t) p.
Lemma data_at_memory_block:
forall sh t v p,
data_at sh t v p |-- memory_block sh (sizeof t) p.