| root[q0 + q.last '] = fnode(⌜m⌝ ), root[q] = fnode(⌜m⌝ ), dirs[lookup(parent(p), 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), root[q0].dir?, root.dir?, dom of < ino6, abs(root, ROOT_INO)(dirs), afs-cons(dirs, files), fids-cons(root, abs-files(files), abs-of(of)), ispath(q0 + q.last ', ROOT_INO, m9, dirs, files), ispath(q, ROOT_INO, m8, dirs, files), ispath(path, ROOT_INO, m, dirs, files), ispath(q0, ROOT_INO, lookup(parent(q), ROOT_INO, dirs, files), dirs, files), of-cons(of, dirs, files), pr(user, md1), px-parent(user, path, ROOT_INO, dirs, files), lookup(parent(q), ROOT_INO, dirs, files) ∈ dirs, q.last ' ∈ root[q0], m ∈ files, ROOT_INO ∈ dirs, psynced → asynced ⊦ # links(⌜m⌝ , root) = 0, # links(m, dirs) = count(⌜m⌝ , root.fids), q0 + q.last ' = q, links(⌜m⌝ , root) = ∅, root[path].dir?, m9 ∈ dirs, m8 ∈ dirs, m ∈ dirs |
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[q] = fnode(⌜m⌝ ), root[q0 + str '] = fnode(⌜m⌝ ), q = q1 + str ', 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(q0, ROOT_INO, lookup(q1, ROOT_INO, dirs, files), dirs, files), ispath(path, ROOT_INO, m, dirs, files), ispath(q, ROOT_INO, m8, 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), ROOT_INO ∈ dirs, m ∈ files, str ' ∈ root[q0], lookup(q1, ROOT_INO, dirs, files) ∈ dirs, psynced → asynced ⊦ # links(m, dirs) = count(⌜m⌝ , root.fids), # links(⌜m⌝ , root) = 0, q0 + str ' = q, links(⌜m⌝ , root) = ∅, q = ε, root[path].dir?, m ∈ dirs, m8 ∈ dirs, m9 ∈ dirs
Used simplifier rules: ⊦ tree[ε] = tree; (s)% ⊦ p + str ' ≠ ε; (s)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ ispath(ε, n, m, dirs, files) ↔ valid-ino(n, dirs, files) ∧ m = n; (s)% ⊦ valid-ino(ino, dirs, files) ↔ ino ∈ dirs ∨ ino ∈ files; (s)% ⊦ afs-cons(dirs, files) → ¬ ROOT_INO ∈ files; (s)%p ≠ ε ⊦ q = parent(p) ∧ str = p.last ↔ p = q + str '; (elim) Used terms: q, q1, str