Definition lseg_cell (ls: listspec list_structid list_link list_token)
(sh : share)
(v: elemtype ls) (x y: val) :=
!!is_pointer_or_null y && list_token sh x * list_cell ls sh v x * field_at sh list_struct (StructField list_link :: nil) (valinject (nested_field_type list_struct (StructField list_link :: nil)) y) x.

Lemma list_append: forall {sh: share}
{ls : listspec list_structid list_link list_token} (hd mid tl:val) ct1 ct2 P,
(forall x tl', lseg_cell ls sh x tl tl' * P tl |-- FF) ->
(lseg ls sh ct1 hd mid) * lseg ls sh ct2 mid tl * P tl|--
(lseg ls sh (ct1 ++ ct2) hd tl) * P tl.