| abs(tree, ino)(dirs), afs-cons(dirs, files), fids-cons(tree, abs-files(files), ofh), ispath(p, ino, m, dirs, files), px-parent(user, p, ino, dirs, files), m ∈ files ⊦ tree[p] = fnode(fid) ↔ fid = ⌜m⌝ , tree[p].dir?, m ∈ dirs |
⊦ p ∈ tree → abs(tree, ino0) = _∃(λ ino1. abs|(tree, ino0, p, ino1) * abs(tree[p], ino1))
⊦ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (p ∈ tree ↔ ispath(p, ino, dirs, files))
Used simplifier rules: path-in-eq: ⊦ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (p ∈ tree ↔ ispath(p, ino, dirs, files));% ⊦ (_∃ nD)(dirs) ↔ (∃ ino. nD(ino)(dirs)); (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]%absc-path: ⊦ p ∈ tree ∧ ((abs|(tree, ino, p, ino0) * D))(dirs) ∧ ispath(p, ino, ino1, dirs, files) → ino0 = ino1; (forward) from specification vfs-abs%⊦ ¬ ino ∈ dirs → (((abs(tree, ino) * D))(dirs) ↔ tree = fnode(⌜ino⌝ ) ∧ D(dirs)); (ws)% ⊦ fnode(fid) = fnode(fid0) ↔ fid = fid0; (s)% ⊦ ispath(p, n, m, dirs, files) → ispath(p, n, dirs, files); (s) Used terms: p, ino, tree