| fs[ri[datakey(ino, n)]].key = datakey(ino, n), fs[ri[datakey(ino, n)]].data?, fs[ri[inodekey(ino)]].directory, fo.inodes?, ro.inodes?, node-closed(fs[ri[datakey(ino, n)]], ri, fs, ro), datakey(ino, n) ∈ ri, ri[datakey(ino, n)] ∈ fs, fo ⊆ dom fi, ro ⊆ dom ri, inodekey(ino) ∈ ri → ri[inodekey(ino)] ∈ fs ∧ node-closed(fs[ri[inodekey(ino)]], ri, fs, ro), inodekey(ino) ∈ ri → ri[inodekey(ino)] ∈ fs ∧ fs[ri[inodekey(ino)]].inode? ∧ fs[ri[inodekey(ino)]].key = inodekey(ino), ∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]), ∀ key. key ∈ ri → ri[key] ∈ fs ∧ node-closed(fs[ri[key]], ri, fs, ro), ∀ adr. adr ∈ log → adr ∈ fs ∧ node-cons(fs[adr].key, fs[adr]) ⊦ dups(log), inodekey(0) ∈ ri |
Used simplifier rules: datanode-closed: ⊦ node-closed(datanode(key, buf), ri, fs, ro) ↔ inodekey(key.ino) ∈ ri ∧ ¬ fs[ri[inodekey(key.ino)]].directory ∧ # buf = VFS_PAGE_SIZE;% ⊦ datanode(key, buf).data?; (s)% ⊦ datakey(m, m0).ino = m; (s)% ⊦ nd.data? → (key = nd.key ∧ buf = nd.data ↔ nd = datanode(key, buf)); (elim) Used terms: fs[ri[datakey(ino, n)]], key0, buf