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