| fs[ri[datakey(m, m2 / VFS_PAGE_SIZE)]].key = datakey(m, m2 / VFS_PAGE_SIZE), fs[ri[inodekey(m)]].nlink = 0 ∧ m ≠ ROOT_INO ↔ inodekey(m) ∈ ro, VFS_PAGE_SIZE = n0 + m2 % VFS_PAGE_SIZE, fs[ri[datakey(m, m2 / VFS_PAGE_SIZE)]].data?, fs[ri[inodekey(m)]].inode?, ro.inodes?, fo.inodes?, file-node-cons(fs, ri), log-cons(log, fs), orphans-cons(fs, ri, ro), replay-cons-strong(fs, ri, ro, fi, fo, log), ri-closed(ri, fs, ro), ri-inj(ri), ri-inj(fi), inodekey(m) ∈ ri, ri[inodekey(m)] ∈ fs, datakey(m, m2 / VFS_PAGE_SIZE) ∈ ri, ri[datakey(m, m2 / VFS_PAGE_SIZE)] ∈ fs, m2 ≤ n, ro ⊆ dom ri, fo ⊆ dom fi, ∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]) ⊦ m2 % VFS_PAGE_SIZE = 0, fs[ri[inodekey(m)]].directory, buf-opt.some?, dups(log), node-cons ((fs[ri[datakey(m, m2 / VFS_PAGE_SIZE)]].data:= fill(fs[ri[datakey(m, m2 / VFS_PAGE_SIZE)]].data, zero, m2 % VFS_PAGE_SIZE, n0)).key, fs[ri[datakey(m, m2 / VFS_PAGE_SIZE)]].data:= fill(fs[ri[datakey(m, m2 / VFS_PAGE_SIZE)]].data, zero, m2 % VFS_PAGE_SIZE, n0)), inodekey(0) ∈ ri |
Used simplifier rules: ⊦ datanode(key, buf).data?; (s)% ⊦ datanode(key, buf).data:= buf0 = datanode(key, buf0); (s)% ⊦ datanode(key, buf).key = key; (s)% ⊦ node-cons(key0, datanode(key1, buf)) ↔ key0.data?; (s)% ⊦ datakey(m, m0).data?; (s)% ⊦ nd.data? → (key = nd.key ∧ buf = nd.data ↔ nd = datanode(key, buf)); (elim) Used terms: fs[ri[datakey(m, m2 / VFS_PAGE_SIZE)]], key0, buf