Hint Resolve @data_block_local_facts : saturate_local.

(* Specifications: *)
Lemma data_block_valid_pointer {cs: compspecs} sh l p: sepalg.nonidentity sh -> Zlength l > 0 ->
data_block sh l p |-- valid_pointer p.
Lemma split2_data_block:
forall  {cs: compspecs}  n sh data d,
(0 <= n <= Zlength data)%Z ->
data_block sh data d =
(data_block sh (sublist 0 n data) d *
data_block sh (sublist n (Zlength data) data)
(field_address0 (tarray tuchar (Zlength data)) [ArraySubsc n] d))%logic.
Lemma split3_data_block:
forall  {cs: compspecs} lo hi sh data d,
0 <= lo <= hi ->
hi <= Zlength data  ->
data_block sh data d =
(data_block sh (sublist 0 lo data) d *
data_block sh (sublist lo hi data)
(field_address0 (tarray tuchar (Zlength data)) [ArraySubsc lo] d) *
data_block sh (sublist hi (Zlength data) data)
(field_address0 (tarray tuchar (Zlength data)) [ArraySubsc hi] d))%logic.
Lemma force_lengthn_long {A}: forall n (l:list A) d, (n <= length l)%nat -> force_lengthn n l d = firstn n l.
Lemma skipn_force_lengthn_app {A} n (l m:list A) a:
skipn n (force_lengthn n l a ++ m) = m.