| files1[ino] = mkfile(m2, md0, m3, content), write-inv(n0, n1, mkinode(ino, md, boolvar, m0, m4, m1), buf, n, dirs, files0, files1), ino ∈ files1, (n0 + n) % VFS_PAGE_SIZE + min(n1 - n0 + n, n2) ≤ VFS_PAGE_SIZE ⊦ afs-cons (dirs, files1 [ino, mkfile (m2, md0, m3, content[(n0 + n) / VFS_PAGE_SIZE, copy(buf, n, getpage((n0 + n) / VFS_PAGE_SIZE, content), (n0 + n) % VFS_PAGE_SIZE, min(n1 - n0 + n, n2))]) ]) ∧ mkinode(ino, md, boolvar, m0, m4, m1).ino ∈ files0 ∧ mkinode(ino, md, boolvar, m0, m4, m1).ino ∈ files1 [ino, mkfile (m2, md0, m3, content[(n0 + n) / VFS_PAGE_SIZE, copy(buf, n, getpage((n0 + n) / VFS_PAGE_SIZE, content), (n0 + n) % VFS_PAGE_SIZE, min(n1 - n0 + n, n2))]) ] ∧ files0[mkinode(ino, md, boolvar, m0, m4, m1).ino].size = mkinode(ino, md, boolvar, m0, m4, m1).size ∧ files1 [ino, mkfile (m2, md0, m3, content[(n0 + n) / VFS_PAGE_SIZE, copy(buf, n, getpage((n0 + n) / VFS_PAGE_SIZE, content), (n0 + n) % VFS_PAGE_SIZE, min(n1 - n0 + n, n2))]) ] [mkinode(ino, md, boolvar, m0, m4, m1).ino ] .size = files0[mkinode(ino, md, boolvar, m0, m4, m1).ino].size ∧ files1 [ino, mkfile (m2, md0, m3, content[(n0 + n) / VFS_PAGE_SIZE, copy(buf, n, getpage((n0 + n) / VFS_PAGE_SIZE, content), (n0 + n) % VFS_PAGE_SIZE, min(n1 - n0 + n, n2))]) ] [mkinode(ino, md, boolvar, m0, m4, m1).ino ] .meta = files0[mkinode(ino, md, boolvar, m0, m4, m1).ino].meta ∧ files1 [ino, mkfile (m2, md0, m3, content[(n0 + n) / VFS_PAGE_SIZE, copy(buf, n, getpage((n0 + n) / VFS_PAGE_SIZE, content), (n0 + n) % VFS_PAGE_SIZE, min(n1 - n0 + n, n2))]) ] -- mkinode(ino, md, boolvar, m0, m4, m1).ino = files0 -- mkinode(ino, md, boolvar, m0, m4, m1).ino ∧ n0 + n + min(n1 - n0 + n, n2) ≤ n1 ∧ n1 - n0 ≤ # buf ∧ write-inv (n0, n1, buf, n + min(n1 - n0 + n, n2), files0[mkinode(ino, md, boolvar, m0, m4, m1).ino].content, files1 [ino, mkfile (m2, md0, m3, content[(n0 + n) / VFS_PAGE_SIZE, copy(buf, n, getpage((n0 + n) / VFS_PAGE_SIZE, content), (n0 + n) % VFS_PAGE_SIZE, min(n1 - n0 + n, n2))]) ] [mkinode(ino, md, boolvar, m0, m4, m1).ino ] .content) |
files1[ino] = mkfile(m2, md0, m3, content), write-inv(n0, n1, mkinode(ino, md, boolvar, m0, m4, m1), buf, n, dirs, files0, files1), ino ∈ files1, (n0 + n) % VFS_PAGE_SIZE + min(n1 - n0 + n, n2) ≤ VFS_PAGE_SIZE ⊦ afs-cons (dirs, files1 [ino, mkfile (files0[ino].size, files0[ino].meta, m3, content[(n0 + n) / VFS_PAGE_SIZE, copy(buf, n, getpage((n0 + n) / VFS_PAGE_SIZE, content), (n0 + n) % VFS_PAGE_SIZE, min(n1 - n0 + n, n2))]) ]) ∧ ino ∈ files0 ∧ files0[ino].size = m1 ∧ m2 = files0[ino].size ∧ md0 = files0[ino].meta ∧ files1 -- ino = files0 -- ino ∧ n0 + n + min(n1 - n0 + n, n2) ≤ n1 ∧ n1 ≤ # buf + n0 ∧ write-inv (n0, n1, buf, n + min(n1 - n0 + n, n2), files0[ino].content, content[(n0 + n) / VFS_PAGE_SIZE, copy(buf, n, getpage((n0 + n) / VFS_PAGE_SIZE, content), (n0 + n) % VFS_PAGE_SIZE, min(n1 - n0 + n, n2))])
Used simplifier rules: n0 ≤ n ⊦ n - n0 ≤ m ↔ n ≤ m + n0; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ ¬ m + n < m; (s)% ⊦ m < n → n ≠ 0; (s)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic%fle-01: ⊦ m ≤ n ∧ n < n0 → m < n0; (forward) from specification nat% ⊦ mkfile(m, md, m0, content).content = content; (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)%ino ∈ files ⊦ files[ino, af] -- ino = files -- ino; (s)% ⊦ mkfile(m, md, m0, content).meta = md; (s)% ⊦ mkfile(m, md, m0, content).size = m; (s)% ⊦ files[ino, af][ino0] = (ino0 = ino ∧ ino ∈ files ⊃ af;files[ino0]); (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).size = m2; (s)% ⊦ ino ∈ files[ino0, af] ↔ ino ∈ files; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).ino = m; (s)