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