proposition: Lemma lseg_unfold (ls: listspec list_structid list_link list_token): forall dsh psh contents v1 v2, lseg ls dsh psh contents v1 v2 = match contents with | p::t => !! (p=v1 /\ ~ ptr_eq v1 v2) && EX tail: val, !! is_pointer_or_null tail && list_token dsh v1 * list_cell ls dsh (vund ls) v1 * field_at psh list_struct (StructField list_link :: nil) (valinject (nested_field_type list_struct (StructField list_link :: nil)) tail) v1 * lseg ls dsh psh t tail v2 | nil => !! (ptr_eq v1 v2) && emp end.
proof: Proof. intros. unfold lseg. rewrite LsegGeneral.lseg_unfold. revert v1; induction contents; simpl; intros; auto. Qed.
imports: VST.floyd.base2 VST.floyd.client_lemmas VST.floyd.closed_lemmas VST.floyd.nested_pred_lemmas VST.floyd.nested_field_lemmas VST.floyd.efield_lemmas VST.floyd.mapsto_memory_block VST.floyd.reptype_lemmas VST.floyd.data_at_rec_lemmas VST.floyd.field_at VST.floyd.nested_loadstore VST.floyd.entailer