theory SepList imports Sep begin abbreviation NULL :: nat where "NULL \ 0" consts List :: "nat list \ nat \ heap \ bool" primrec "List [] p h = (p = NULL \ sep_emp h)" "List (x#xs) p h = (p \ NULL \ p = x \ (\q. (p \ q \\<^sup>* List xs q) h))" lemma list_empty [simp]: shows "List xs NULL = (\s. xs = [] \ \ s)" apply (cases xs) apply (rule ext, clarsimp) apply clarsimp apply (rule ext) apply clarsimp done text {* Prepending to a list *} lemma "VARS H {p \ NULL \ (p \ x \\<^sup>* List qs q) H} H := H(p \ q) {List (p#qs) p H}" apply vcg apply clarsimp apply (rule_tac x=q in exI) apply (drule sep_conjD) apply clarsimp apply (rule_tac s\<^isub>0="s\<^isub>0(p \ q)" in sep_conjI) prefer 2 apply assumption apply (simp add: singl_def) apply (simp add: map_disj_def singl_def) apply (simp add: map_add_ac) done end