| dirs[m] = mkdir(# entries, md, # links(m, dirs), n1, entries), tree[p].dir?, 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), str ∈ entries, m ∈ dirs ⊦ entries[str] ∈ dirs ↔ tree[p + str '].dir?, (∀ ino. ¬ ino ∈ files ∨ ¬ ino ∈ dirs) ∧ (∀ ino. ⌜ino⌝ ∈ tree.fids → ino ∈ files) ∧ ((abs(tree, ino) * emp))(dirs) ∧ ispath(p + str, ino, entries[str], dirs, files) |
⊦ ispath(p, ino, m, dirs, files) ∧ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → p ∈ tree ∧ (tree[p].dir? ↔ m ∈ dirs)
dirs[m] = mkdir(# entries, md, # links(m, dirs), n1, entries), tree[p].dir?, 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), str ∈ entries, m ∈ dirs ⊦ entries[str] ∈ dirs ↔ tree[p + str '].dir?, ispath(p + str ', ino, entries[str], dirs, files)
Used simplifier rules: path-in: ⊦ ispath(p, ino, m, dirs, files) ∧ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → p ∈ tree ∧ (tree[p].dir? ↔ m ∈ dirs);%path-in-dirs: p ≠ ε ⊦ ispath(p, n, m, dirs, files) → n ∈ dirs; (forward) from specification afs-base%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ p + str ' ≠ ε; (s)% ⊦ p + str = p + str '; (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]% ⊦ emp * D = D; (s)% ⊦ afs-cons(dirs, files) ∧ ino ∈ dirs → ¬ ino ∈ files; (s)