| # buf = VFS_PAGE_SIZE, files[m0] = mkfile(m1, md0, # links(m0, dirs), content), afs-cons(dirs, files), m0 ∈ files, ∃ content. ((m0 => mkfile(n0, md, m, content) * F))(files) ∧ content.stream = σ ⊦ [asynced := ?] ∃ content0. ((m0 => mkfile(n0, md, m, content0) * F))(files[m0, mkfile(m1, md0, # links(m0, dirs), content[n, buf])]) ∧ content0.stream = (σ to n * VFS_PAGE_SIZE) + ⌜buf⌝ + (σ from VFS_PAGE_SIZE * n + VFS_PAGE_SIZE) |
# buf = VFS_PAGE_SIZE, ((m0 => mkfile(m1, md0, # links(m0, dirs), content) * F))(files), afs-cons(dirs, files) ⊦ [asynced := ?] ∃ content1. ((m0 => mkfile(m1, md0, # links(m0, dirs), content1) * F))(files[m0, mkfile(m1, md0, # links(m0, dirs), content[n, buf])]) ∧ content1.stream = (content.stream to n * VFS_PAGE_SIZE) + ⌜buf⌝ + (content.stream from VFS_PAGE_SIZE * n + VFS_PAGE_SIZE)
Used simplifier rules: ⊦ ((ino => af * F))(files) → ino ∈ files; (s)%⊦ mkfile(m, md, m0, content) = mkfile(m1, md0, m2, content0) ↔ m = m1 ∧ md = md0 ∧ m0 = m2 ∧ content = content0; (ws)% ⊦ ((ino => af * F))(files) → (files[ino] = af0 ↔ af = af0); (s)%sep-com: ⊦ F * F0 = F0 * F; from specification heap-sep[file-heap]%sep-ass: ⊦ (F * F0) * F1 = F * F0 * F1; from specification heap-sep[file-heap]