| tree[p] = dnode(md0, sdt), entries[str] = ROOT_INO, dirs[ino] = mkdir(# entries, md, # links(ino, dirs), m0, entries), (((ino0 => mkdir(# entries0, md0, m1, m2, entries0) * abs(sdt, entries0)) * abs|(tree, ROOT_INO, p, ino0)))(dirs), abs(tree, ROOT_INO)(dirs), afs-cons(dirs, files), fids-cons(tree, abs-files(files), ofh), ispath(p, ROOT_INO, ino, dirs, files), ino ∈ dirs, str ∈ entries, p ∈ tree ∧ ((abs|(tree, ROOT_INO, p, ino0) * abs(sdt, entries0) * ino0 => mkdir(# entries0, md0, m1, m2, entries0)))(dirs) ∧ ispath(p, ROOT_INO, ino, dirs, files) → ino0 = ino ⊦ |
⊦ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (p ∈ tree ↔ ispath(p, ino, dirs, files))
tree[p] = dnode(md0, sdt), entries[str] = ROOT_INO, (((ino => mkdir(# entries, md0, # links(ino, dirs), m2, entries) * abs(sdt, entries)) * abs|(tree, ROOT_INO, p, ino)))(dirs), abs(tree, ROOT_INO)(dirs), afs-cons(dirs, files), fids-cons(tree, abs-files(files), ofh), ispath(p, ROOT_INO, ino, dirs, files), str ∈ sdt, str ∈ entries ⊦
Used simplifier rules: 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));%entries-dom2: ⊦ str ∈ sdt ∧ ((abs(sdt, sdi) * D))(dirs) → str ∈ sdi; (forward) from specification vfs-abs%entries-dom1: ⊦ str ∈ sdi ∧ ((abs(sdt, sdi) * D))(dirs) → str ∈ sdt; (forward) from specification vfs-abs% ⊦ ((ino => ad * D))(dirs) → ino ∈ dirs; (s)%⊦ mkdir(m, md, m0, m1, entries) = mkdir(m2, md0, m3, m4, entries0) ↔ m = m2 ∧ md = md0 ∧ m0 = m3 ∧ m1 = m4 ∧ entries = entries0; (ws)% ⊦ ((ino => ad * D))(dirs) → (dirs[ino] = ad0 ↔ ad = ad0); (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]% ⊦ ispath(p, n, m, dirs, files) → ispath(p, n, dirs, files); (s)