Module Proof3.  (*************** inductive lseg *******************)
Fixpoint lseg (sh: share)
(contents: list val) (x z: val) : mpred :=
match contents with
| h::hs => !! (x<>z) &&
EX y:val,
data_at sh t_struct_list (h,y) x * lseg sh hs y z
| nil => !! (x = z /\ is_pointer_or_null x) && emp
end.
Arguments lseg sh contents x z : simpl never.
Hint Resolve lseg_local_facts : saturate_local.
Hint Resolve lseg_valid_pointer : valid_pointer.

Lemma lseg_app: forall sh s1 s2 a s3 (w x y z: val),
readable_share sh ->
lseg sh s1 w x * lseg sh s2 x y * lseg sh (a::s3) y z |--
lseg sh (s1++s2) w y * lseg sh (a::s3) y z.