| root[p] = fnode(⌜m⌝ ), dirs[lookup(q, ROOT_INO, dirs, files)] = mkdir(m2, md, m3, m4, entries), files[m] = mkfile(m0, md1, # links(m, dirs), content), dirs[m1] = mkdir(m5, md0, m6, m7, entries0), p = q + str ', root.dir?, dom of < ino6, abs(root, ROOT_INO)(dirs), afs-cons(dirs, files), fids-cons(root, abs-files(files), abs-of(of)), ispath(p, ROOT_INO, m8, dirs, files), ispath(path, ROOT_INO, m, dirs, files), of-cons(of, dirs, files), pr(user, md1), px-parent(user, path, ROOT_INO, dirs, files), m ∈ files, ROOT_INO ∈ dirs, psynced → asynced ⊦ # links(⌜m⌝ , root) = 0, # links(m, dirs) = count(⌜m⌝ , root.fids), links(⌜m⌝ , root) = ∅, p = ε, root[path].dir?, m8 ∈ dirs, m ∈ dirs, lookup(q, ROOT_INO, dirs, files) ∈ dirs ∧ str ∈ entries ∧ m = entries[str] |
⊦ 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))
⊦ ispath(p, ino, dirs, files) ↔ (∃ m. ispath(p, ino, m, dirs, files))
⊦ afs-cons(dirs, files) ∧ ino ∈ dirs ∧ dirs[ino] = mkdir(n, md, n0, n1, entries) → # entries = n
dirs[m9] = mkdir(# entries, md, # links(m9, dirs), m4, entries), root[q + str '] = fnode(⌜m⌝ ), dirs[m1] = mkdir(m5, md0, m6, m7, entries0), files[m] = mkfile(m0, md1, # links(m, dirs), content), root.dir?, root[q].dir?, dom of < ino6, abs(root, ROOT_INO)(dirs), afs-cons(dirs, files), fids-cons(root, abs-files(files), abs-of(of)), ispath(q, ROOT_INO, m9, dirs, files), ispath(path, ROOT_INO, m, dirs, files), ispath(q + str ', ROOT_INO, m8, dirs, files), of-cons(of, dirs, files), pr(user, md1), px-parent(user, path, ROOT_INO, dirs, files), m9 ∈ dirs, ROOT_INO ∈ dirs, m ∈ files, str ' ∈ root[q], psynced → asynced ⊦ # links(m, dirs) = count(⌜m⌝ , root.fids), # links(⌜m⌝ , root) = 0, links(⌜m⌝ , root) = ∅, root[path].dir?, m ∈ dirs, m8 ∈ dirs, m = entries[str] ∧ str ∈ entries
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-target: ⊦ ispath(p, ino, dirs, files) ↔ (∃ m. ispath(p, ino, m, dirs, files));%make-abs-fold-work: ⊦ afs-cons(dirs, files) ∧ ino ∈ dirs ∧ dirs[ino] = mkdir(n, md, n0, n1, entries) → # entries = n;% ⊦ ¬ fnode(fid).dir?; (s)%afs-cons-dir-nlink: ⊦ afs-cons(dirs, files) ∧ ino ∈ dirs ∧ dirs[ino] = mkdir(n0, md, n, n1, entries) → # links(ino, dirs) = n; (forward) from specification afs-base% ⊦ str ' ≠ ε; (s)% ⊦ ¬ tree.dir? → (p ∈ tree ↔ p = ε); (s)% ⊦ ispath(p, n, m, dirs, files) → ispath(p, n, dirs, files); (s)% ⊦ ispath(p, n, m, dirs, files) → lookup(p, n, dirs, files) = m; (s)% ⊦ p + q ∈ tree ↔ p ∈ tree ∧ q ∈ tree[p]; (s)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ p + str ' ≠ ε; (s)