| tree[p].dir? ↔ m ∈ dirs, (((abs|(tree, ino, p, m) * abs(tree[p], m)) * D))(dirs), ispath(p, ino, m, dirs, files), p ∈ tree, ∀ ino. ⌜ino⌝ ∈ tree.fids → ino ∈ files, ∀ ino. ¬ ino ∈ files ∨ ¬ ino ∈ dirs ⊦ meta(p, tree, abs-files(files)) = meta(ε, m, dirs, files), tree[p].dir? |
⊦ ¬ ino ∈ dirs → (((abs(tree, ino) * D))(dirs) ↔ tree = fnode(⌜ino⌝ ) ∧ D(dirs))
tree[p] = fnode(⌜m⌝ ), ((abs|(tree, ino, p, m) * D))(dirs), ispath(p, ino, m, dirs, files), p ∈ tree, ∀ ino. ⌜ino⌝ ∈ tree.fids → ino ∈ files, ∀ ino. ¬ ino ∈ files ∨ ¬ ino ∈ dirs ⊦ abs-files(files)[⌜m⌝ ].meta = meta(ε, m, dirs, files), m ∈ dirs
Used simplifier rules: abs-is-file: ⊦ ¬ ino ∈ dirs → (((abs(tree, ino) * D))(dirs) ↔ tree = fnode(⌜ino⌝ ) ∧ D(dirs));% ⊦ ¬ fnode(fid).dir?; (s)% ⊦ fnode(fid).fid = fid; (s)%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]%¬ tree[p].dir? ⊦ meta(p, tree, fs) = fs[tree[p].fid].meta; (s)