| ((abs(tree, ino0) * D))(dirs), ispath(p, ino0, ino1, dirs, files), p ∈ tree, ino1 ∈ files ⊦ tree[p] = fnode(⌜ino1⌝ ), ino1 ∈ dirs |
⊦ ¬ ino ∈ dirs → (((abs(tree, ino) * D))(dirs) ↔ tree = fnode(⌜ino⌝ ) ∧ D(dirs))
((abs(tree, ino0) * D))(dirs), ispath(str + p0, ino0, ino1, dirs, files), ino1 ∈ files, str + p0 ∈ tree, ∀ 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[str + p0] = fnode(⌜ino1⌝ ), ino1 ∈ dirs
Used simplifier rules: abs-is-file: ⊦ ¬ ino ∈ dirs → (((abs(tree, ino) * D))(dirs) ↔ tree = fnode(⌜ino⌝ ) ∧ D(dirs));%path freely generated by ε, +;;% ⊦ tree[ε] = tree; (s)% ⊦ ε ∈ tree; (s)% ⊦ ispath(ε, n, m, dirs, files) ↔ valid-ino(n, dirs, files) ∧ m = n; (s)% ⊦ valid-ino(ino, dirs, files) ↔ ino ∈ dirs ∨ ino ∈ files; (s)%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]