| dirs[m1] = mkdir(m5, md0, m6, m7, entries0), files[m] = mkfile(m0, md1, # links(m, dirs), content), dirs[lookup(parent(p), ROOT_INO, dirs, files)] = mkdir(m2, md, m3, m4, entries), root[q1 + str '] = fnode(⌜m⌝ ), root[q0 + str '] = fnode(⌜m⌝ ), root[q1].dir?, root.dir?, root[q0].dir?, dom of < ino6, abs(root, ROOT_INO)(dirs), afs-cons(dirs, files), fids-cons(root, abs-files(files), abs-of(of)), ispath(q1, ROOT_INO, m10, dirs, files), ispath(q0, ROOT_INO, m10, dirs, files), ispath(path, ROOT_INO, m, dirs, files), ispath(q0 + str ', ROOT_INO, m9, dirs, files), of-cons(of, dirs, files), pr(user, md1), px-parent(user, path, ROOT_INO, dirs, files), str ' ∈ root[q1], str ∈ dirs[m10].entries, ROOT_INO ∈ dirs, m ∈ files, str ' ∈ root[q0], m10 ∈ dirs, psynced → asynced, ∃ m0. ispath(q1, ROOT_INO, m0, dirs, files) ∧ ispath(str ', m0, m8, dirs, files) ⊦ # links(m, dirs) = count(⌜m⌝ , root.fids), # links(⌜m⌝ , root) = 0, links(⌜m⌝ , root) = ∅, q0 = q1, root[path].dir?, m ∈ dirs, m8 ∈ dirs, m9 ∈ dirs |
⊦ 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)
⊦ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (p ∈ tree ↔ ispath(p, ino, dirs, files))
dirs[m1] = mkdir(m5, md0, m6, m7, entries0), files[m] = mkfile(m0, md1, # links(m, dirs), content), dirs[lookup(parent(p), ROOT_INO, dirs, files)] = mkdir(m2, md, m3, m4, entries), root[q1 + str '] = fnode(⌜m⌝ ), root[q0 + str '] = fnode(⌜m⌝ ), root[q1].dir?, root.dir?, root[q0].dir?, dom of < ino6, abs(root, ROOT_INO)(dirs), afs-cons(dirs, files), fids-cons(root, abs-files(files), abs-of(of)), ispath(q1, ROOT_INO, m10, dirs, files), ispath(q0, ROOT_INO, m10, dirs, files), ispath(path, ROOT_INO, m, dirs, files), ispath(q0 + str ', ROOT_INO, m9, dirs, files), of-cons(of, dirs, files), pr(user, md1), px-parent(user, path, ROOT_INO, dirs, files), dirs[m10].entries[str] ∈ files, str ' ∈ root[q1], str ∈ dirs[m10].entries, ROOT_INO ∈ dirs, m ∈ files, str ' ∈ root[q0], m10 ∈ dirs, psynced → asynced ⊦ # links(m, dirs) = count(⌜m⌝ , root.fids), # links(⌜m⌝ , root) = 0, links(⌜m⌝ , root) = ∅, q0 = q1, root[path].dir?, m ∈ dirs, dirs[m10].entries[str] ∈ dirs, m9 ∈ dirs
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-eq: ⊦ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (p ∈ tree ↔ ispath(p, ino, dirs, files));% ⊦ ispath(p, n, m, dirs, files) → ispath(p, n, dirs, files); (s)%path-inj: ⊦ ispath(p, n, m0, dirs, files) ∧ ispath(p, n, m1, dirs, files) → m0 = m1; (forward) from specification afs-base%⊦ ispath(str ', n, m, dirs, files) ↔ n ∈ dirs ∧ str ∈ dirs[n].entries ∧ (m ∈ dirs ∨ m ∈ files) ∧ dirs[n].entries[str] = m; (s)