| dirs0[ino1] = mkdir(# entries0, md0, # links(ino1, dirs0), m3, entries0), fs = abs-files(files0), path = q + str ', root[q].dir?, root.dir?, dom of < ino0, abs(root, ROOT_INO)(dirs0), afs-cons(dirs, (files0 ++ ino2)[ino2, mkfile(0, md, 1, ∅)]), afs-cons(dirs0, files0), fids-cons(root, abs-files(files0), abs-of(of)), ispath(q, ROOT_INO, ino1, dirs0, files0), of-cons(of, dirs, (files0 ++ ino2)[ino2, mkfile(0, md, 1, ∅)]), of-cons(of, dirs0, files0), pw(user, md0), px(user, md0), px-parent(user, q, ROOT_INO, dirs0, files0), ino1 ∈ dirs0, dirs ≡ dirs0[ino1, mkdir(# entries0 + 1, md0, # links(ino1, dirs0), m3, entries0[str, ino2])], psynced → asynced0, links(ino1, dirs0) ≠ ∅ ∨ ino1 = ROOT_INO ⊦ ⟨psynced := ?⟩ ( abs-files(files0)[⌜ino2⌝ , mkfile(md, mkbuf(0))] = abs-files((files0 ++ ino2)[ino2, mkfile(0, md, 1, ∅)]) ∧ abs(root[q + str ', fnode(⌜ino2⌝ )], ROOT_INO)(dirs) ∧ (psynced → asynced)), ∃ err1. pre-create(path, md, err1, user, root, fs, abs-of(of)) ∧ ⟨err := err1; if err = ESUCCESS then choose fid with ¬ fid ∈ fs in {root[path] := fnode(fid); fs[fid] := mkfile(md, mkbuf(0))}; psynced := ?⟩ (fs = abs-files((files0 ++ ino2)[ino2, mkfile(0, md, 1, ∅)]) ∧ abs(root, ROOT_INO)(dirs) ∧ (psynced → asynced) ∧ ESUCCESS = err), ino2 = 0, ino2 ∈ files0, str ∈ entries0, ino2 ∈ dirs, ino2 ∈ dirs0 |
⊦ ispath(p, ROOT_INO, ino, dirs, files) ∧ ino ∈ dirs ∧ dirs[ino] = mkdir(n, md, m0, m1, entries) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) ∧ ¬ abs(tree0, ROOT_INO)(dirs0) → ( abs(tree, ROOT_INO)(dirs) ↔ (∃ sdt. ((abs|(tree, ROOT_INO, p, ino) * ino => mkdir(n, md, m0, m1, entries) * abs(sdt, entries)))(dirs) ∧ p ∈ tree ∧ tree[p] = dnode(md, sdt)))
abs(tree0, ino1) = emp ⊦ ¬ str ∈ entries ∧ p ∈ tree ∧ tree[p] = dnode(md, sdt) ∧ ((abs|(tree, ROOT_INO, p, ino0) * ino0 => mkdir(# entries + 1, md, m0, m1, entries[str, ino1]) * abs(sdt, entries)))(dirs) → abs(tree[p + str ', tree0], ROOT_INO)(dirs)
Used simplifier rules: abs-unfold: ⊦ ispath(p, ROOT_INO, ino, dirs, files) ∧ ino ∈ dirs ∧ dirs[ino] = mkdir(n, md, m0, m1, entries) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) ∧ ¬ abs(tree0, ROOT_INO)(dirs0) → ( abs(tree, ROOT_INO)(dirs) ↔ (∃ sdt. (( abs|(tree, ROOT_INO, p, ino) * ino => mkdir(n, md, m0, m1, entries) * abs(sdt, entries)) )(dirs) ∧ p ∈ tree ∧ tree[p] = dnode(md, sdt)));%abs-fold-new: abs(tree0, ino1) = emp ⊦ ¬ str ∈ entries ∧ p ∈ tree ∧ tree[p] = dnode(md, sdt) ∧ (( abs|(tree, ROOT_INO, p, ino0) * ino0 => mkdir(# entries + 1, md, m0, m1, entries[str, ino1]) * abs(sdt, entries)) )(dirs) → abs(tree[p + str ', tree0], ROOT_INO)(dirs);%⊦ ¬ ino ∈ files ∧ ino ≠ 0 → abs-files(files)[⌜ino⌝ , mkfile(md, mkbuf(0))] = abs-files((files ++ ino)[ino, mkfile(0, md, 1, ∅)]); (s)%sep-ass: ⊦ (D * D0) * D1 = D * D0 * D1; from specification heap-sep[dir-heap]%sep-com: ⊦ D * D0 = D0 * D; from specification heap-sep[dir-heap]% ⊦ ((ino => ad * D))(dirs) → (dirs[ino] = ad0 ↔ ad = ad0); (s)% ⊦ ((ino => ad * D))(dirs) → ino ∈ dirs; (s)%⊦ dirs ≡ dirs0[ino, ad] → ( ((ino => ad0 * D))(dirs0) ↔ ((ino => ad * D))(dirs) ∧ dirs0[ino] = ad0 ∧ ino ∈ dirs0); (ws)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ abs(fnode(fid), ino) = (emp ∧ ⌜ino = fid.ino⌝ ); (s)% ⊦ ⌜m⌝ .ino = m; (s)% ⊦ ⌜true⌝ = true; (s)% ⊦ (true ∧ D) = D; (s)%and-ass: ⊦ ((D ∧ D0) ∧ D1) = (D ∧ D0 ∧ D1); from specification heap-sep[dir-heap]%and-com: ⊦ (D ∧ D0) = (D0 ∧ D); from specification heap-sep[dir-heap]%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]