*)
Definition Select_at {cs} sh n (data2: list val) d :=
@data_at cs sh (Tarray tuchar (Zlength data2) noattr) data2
(offset_val n d).
Definition Unselect_at {cs} sh (data1 data2 data3: list val) d :=
(@data_at cs sh (Tarray tuchar (Zlength data1) noattr) data1 d *
@data_at cs sh (Tarray tuchar (Zlength data3) noattr) data3
(offset_val (Zlength data2 + Zlength data1) d)).

(* Specifications: *)
Lemma Select_Unselect_Tarray_at {cs} l d sh (data1 data2 data3 data: list val)
(DATA: (data1 ++ data2 ++ data3) = data)
(L: l = Zlength data)
(F: @field_compatible cs (Tarray tuchar (Zlength (data1 ++ data2 ++ data3)) noattr) [] d)
(ZL: Zlength (data1 ++ data2 ++ data3) < Int.modulus):
@data_at cs sh (Tarray tuchar l noattr) data d =
@Select_at cs sh (Zlength data1) data2 d * @Unselect_at cs sh data1 data2 data3 d.