| root[q] = dnode(md, sdt), files[m] = mkfile(m0, md1, # links(m, dirs), content), dirs[m1] = mkdir(m5, md0, m6, m7, entries0), root[q + str '] = fnode(⌜m⌝ ), (( m9 => mkdir(# entries, md, # links(m9, dirs), m4, entries) * (⌜str ∈ entries⌝ ∧ abs(sdt -- str, entries -- str) * abs(sdt[str], entries[str])) * abs|(root, ROOT_INO, q, m9)) )(dirs), root.dir?, dom of < ino6, 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), of-cons(of, dirs, files), pr(user, md1), px-parent(user, path, ROOT_INO, dirs, files), m ∈ files, ROOT_INO ∈ dirs, q ∈ root, str ∈ entries, entries[str] ∈ files, str ∈ sdt, psynced → asynced ⊦ # links(⌜m⌝ , root) = 0, # links(m, dirs) = count(⌜m⌝ , root.fids), links(⌜m⌝ , root) = ∅, m = entries[str], root[path].dir?, entries[str] ∈ dirs, m ∈ dirs |
root[q + str '] = fnode(⌜m⌝ ), dirs[m1] = mkdir(m5, md0, m6, m7, entries0), files[m] = mkfile(m0, md1, # links(m, dirs), content), root[q] = dnode(md, sdt), sdt[str] = fnode(⌜entries[str]⌝ ), ((m9 => mkdir(# entries, md, # links(m9, dirs), m4, entries) * abs(sdt -- str, entries -- str) * abs|(root, ROOT_INO, q, m9)))(dirs), root.dir?, dom of < ino6, afs-cons(dirs, files), fids-cons(root, abs-files(files), abs-of(of)), ispath(path, ROOT_INO, m, dirs, files), ispath(q, ROOT_INO, m9, dirs, files), of-cons(of, dirs, files), pr(user, md1), px-parent(user, path, ROOT_INO, dirs, files), str ∈ sdt, entries[str] ∈ files, str ∈ entries, q ∈ root, ROOT_INO ∈ dirs, m ∈ files, psynced → asynced ⊦ # links(m, dirs) = count(⌜m⌝ , root.fids), # links(⌜m⌝ , root) = 0, links(⌜m⌝ , root) = ∅, m = entries[str], root[path].dir?, m ∈ dirs, entries[str] ∈ dirs
Used simplifier rules: 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]%⊦ ¬ ino ∈ dirs → (((abs(tree, ino) * D))(dirs) ↔ tree = fnode(⌜ino⌝ ) ∧ D(dirs)); (ws)%and-com: ⊦ (D ∧ D0) = (D0 ∧ D); from specification heap-sep[dir-heap]%and-ass: ⊦ ((D ∧ D0) ∧ D1) = (D ∧ D0 ∧ D1); from specification heap-sep[dir-heap]% ⊦ (true ∧ D) = D; (s)% ⊦ ⌜true⌝ = true; (s)