| ((abs(tree, ino) * abs(sdt0, entries0) * ino0 => mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino])))(dirs), p0 ∈ tree, ((abs(tree, ino) * ino0 => mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino]) * abs(sdt0, entries0)))(dirs) → (∃ dirs0, dirs1. dirs0 ⊥ dirs1 ∧ dirs0 ∪ dirs1 = dirs ∧ abs(tree, ino)(dirs0) ∧ ((ino0 => mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino]) * abs(sdt0, entries0)))(dirs1)), ∀ tree, ino0, dirs. abs(tree, ino0)(dirs) ∧ p0 ∈ tree → (∃ ino. ((abs(tree[p0], ino) * (abs(tree[p0], ino) -* abs(tree, ino0))))(dirs)) ⊦ str ∈ sdt0, str ∈ entries0, ∃ ino. (( abs(tree[p0], ino) * ( abs(tree[p0], ino) -* _∃ (λ ad. (⌜str ∈ ad.entries⌝ ∧ (abs(tree, ad.entries[str]) * abs(sdt0, ad.entries -- str)) * ino0 => ad) ∧ ⌜ad.meta = md⌝ ∧ ⌜ad.size = # ad.entries⌝ ))) )(dirs) |
((ino0 => mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino]) * abs(sdt0, entries0)))(dirs1), ((abs(tree, ino) * abs(sdt0, entries0) * ino0 => mkdir(# entries0 + 1, md, m0, m1, entries0[str, ino])))(dirs0 ∪ dirs1), abs(tree, ino)(dirs0), p0 ∈ tree, dirs0 ⊥ dirs1, ∀ tree, ino0, dirs. abs(tree, ino0)(dirs) ∧ p0 ∈ tree → (∃ ino. ((abs(tree[p0], ino) * (abs(tree[p0], ino) -* abs(tree, ino0))))(dirs)) ⊦ str ∈ sdt0, str ∈ entries0, ∃ ino. (( abs(tree[p0], ino) * ( abs(tree[p0], ino) -* _∃ (λ ad. (⌜str ∈ ad.entries⌝ ∧ (abs(tree, ad.entries[str]) * abs(sdt0, ad.entries -- str)) * ino0 => ad) ∧ ⌜ad.meta = md⌝ ∧ ⌜ad.size = # ad.entries⌝ ))) )(dirs0 ∪ dirs1)
Used simplifier rules: sep-com: ⊦ D * D0 = D0 * D; from specification heap-sep[dir-heap]%sep-ass: ⊦ (D * D0) * D1 = D * D0 * D1; from specification heap-sep[dir-heap]