| ((ino0 => mkdir(# entries, md, m0, m1, entries) * abs(sdt, entries) * D))(dirs), ispath(p0, entries[str], ino1, dirs, files), str ∈ entries, ino1 ∈ files, p0 ∈ sdt[str], str ∈ sdt, ∀ tree, ino0, D, dirs, ino1, files. ((abs(tree, ino0) * D))(dirs) ∧ ispath(p0, ino0, ino1, dirs, files) ∧ p0 ∈ tree ∧ ino1 ∈ files → tree[p0] = fnode(⌜ino1⌝ ) ∨ ino1 ∈ dirs ⊦ sdt[str][p0] = fnode(⌜ino1⌝ ), ino1 ∈ dirs |
str ∈ sdt ⊦ ((abs(sdt, sdi) * D))(dirs) ↔ (∃ tree, ino, sdi0, sdt0. ¬ str ∈ sdt0 ∧ sdt = sdt0[str, tree] ∧ ¬ str ∈ sdi0 ∧ sdi = sdi0[str, ino] ∧ ((abs(tree, ino) * abs(sdt0, sdi0) * D))(dirs))
ispath(p0, entries[str], ino1, dirs, files), p0 ∈ sdt[str], ino1 ∈ files, str ∈ entries, str ∈ sdt, ∀ tree, ino0, D, dirs, ino1, files. ((abs(tree, ino0) * D))(dirs) ∧ ispath(p0, ino0, ino1, dirs, files) ∧ p0 ∈ tree ∧ ino1 ∈ files → tree[p0] = fnode(⌜ino1⌝ ) ∨ ino1 ∈ dirs, ∃ tree, ino, sdi0, sdt0. ¬ str ∈ sdt0 ∧ sdt = sdt0[str, tree] ∧ ¬ str ∈ sdi0 ∧ entries = sdi0[str, ino] ∧ ((abs(tree, ino) * abs(sdt0, sdi0) * D * ino0 => mkdir(# entries, md, m0, m1, entries)))(dirs) ⊦ sdt[str][p0] = fnode(⌜ino1⌝ ), ino1 ∈ dirs
Used simplifier rules: sep-ass: ⊦ (D * D0) * D1 = D * D0 * D1; from specification heap-sep[dir-heap]%sep-com: ⊦ D * D0 = D0 * D; from specification heap-sep[dir-heap] Used terms: str, dirs, D * ino0 => mkdir(# entries, md, m0, m1, entries), entries, sdt