| fs0[ri0[key]].key = key, key.dentry?, ro0.inodes?, fo0.inodes?, log-cons(log0, fs0), log-cons(log1, fs1), node-closed(fs0[ri0[key]], ri0, fs0, ro0), key ∈ ri0, key ∈ ri1, ri0[key] ∈ fs0, fo1 ⊆ dom fi1, ro1 ⊆ dom ri1, ro0 ⊆ dom ri0, fo0 ⊆ dom fi0, key.inode? → fs0[ri0[key]].inode? ∧ key.ino ≠ 0, key.dentry? → fs0[ri0[key]].dentry?, key.data? → fs0[ri0[key]].data?, ∀ key0. ( key0 ∈ ri0 → (key0.inode? → fs0[ri0[key0]].inode? ∧ key0.ino ≠ 0) ∧ ( key0.dentry? → fs0[ri0[key0]].dentry? ∧ inodekey(key0.ino) ∈ ri0 ∧ inodekey(fs0[ri0[key0]].ino) ∈ ri0 ∧ ¬ inodekey(key0.ino) ∈ ro0 ∧ ¬ inodekey(fs0[ri0[key0]].ino) ∈ ro0 ∧ fs0[ri0[inodekey(key0.ino)]].directory) ∧ ( key0.data? → fs0[ri0[key0]].data? ∧ inodekey(key0.ino) ∈ ri0 ∧ ¬ fs0[ri0[inodekey(key0.ino)]].directory ∧ # fs0[ri0[key0]].data = VFS_PAGE_SIZE)) → key0 ∈ ri1 → ri1[key0] ∈ fs1 ∧ fs1[ri1[key0]].key = key0 ∧ (key0.inode? → fs1[ri1[key0]].inode? ∧ key0.ino ≠ 0) ∧ ( key0.dentry? → fs1[ri1[key0]].dentry? ∧ inodekey(key0.ino) ∈ ri1 ∧ inodekey(fs1[ri1[key0]].ino) ∈ ri1 ∧ ¬ inodekey(key0.ino) ∈ ro1 ∧ ¬ inodekey(fs1[ri1[key0]].ino) ∈ ro1 ∧ fs1[ri1[inodekey(key0.ino)]].directory) ∧ ( key0.data? → fs1[ri1[key0]].data? ∧ inodekey(key0.ino) ∈ ri1 ∧ ¬ fs1[ri1[inodekey(key0.ino)]].directory ∧ # fs1[ri1[key0]].data = VFS_PAGE_SIZE), ∀ adr. ( adr ∈ log0 → (fs0[adr].inode? → fs0[adr].key.inode? ∧ fs0[adr].key.ino ≠ 0) ∧ (fs0[adr].dentry? → fs0[adr].key.dentry?) ∧ (fs0[adr].data? → fs0[adr].key.data?) ∧ (fs0[adr].trunc? → fs0[adr].key.inode?)) → adr ∈ log1 → adr ∈ fs1 ∧ (fs1[adr].inode? → fs1[adr].key.inode? ∧ fs1[adr].key.ino ≠ 0) ∧ (fs1[adr].dentry? → fs1[adr].key.dentry?) ∧ (fs1[adr].data? → fs1[adr].key.data?) ∧ (fs1[adr].trunc? → fs1[adr].key.inode?), ∀ key. key ∈ fo1 → key ∈ fi1, ∀ key. key ∈ ro1 → key ∈ ri1 ⊦ dups(log0), inodekey(0) ∈ ri1, inodekey(0) ∈ ri0, ri1[key] ∈ fs1 ∧ key-cons(key, fs1[ri1[key]]), fs0[ri0[key]].dentry? ∧ inodekey(key.ino) ∈ ri0 ∧ inodekey(fs0[ri0[key]].ino) ∈ ri0 ∧ ¬ inodekey(key.ino) ∈ ro0 ∧ ¬ inodekey(fs0[ri0[key]].ino) ∈ ro0 ∧ fs0[ri0[inodekey(key.ino)]].directory |
fs0[ri0[dentrykey(ino, str)]].key = dentrykey(ino, str), fs0[ri0[dentrykey(ino, str)]].dentry?, ro0.inodes?, fo0.inodes?, log-cons(log0, fs0), log-cons(log1, fs1), node-closed(fs0[ri0[dentrykey(ino, str)]], ri0, fs0, ro0), dentrykey(ino, str) ∈ ri0, dentrykey(ino, str) ∈ ri1, ri0[dentrykey(ino, str)] ∈ fs0, fo1 ⊆ dom fi1, ro1 ⊆ dom ri1, ro0 ⊆ dom ri0, fo0 ⊆ dom fi0, ∀ key0. ( key0 ∈ ri0 → (key0.inode? → fs0[ri0[key0]].inode? ∧ key0.ino ≠ 0) ∧ ( key0.dentry? → fs0[ri0[key0]].dentry? ∧ inodekey(key0.ino) ∈ ri0 ∧ inodekey(fs0[ri0[key0]].ino) ∈ ri0 ∧ ¬ inodekey(key0.ino) ∈ ro0 ∧ ¬ inodekey(fs0[ri0[key0]].ino) ∈ ro0 ∧ fs0[ri0[inodekey(key0.ino)]].directory) ∧ ( key0.data? → fs0[ri0[key0]].data? ∧ inodekey(key0.ino) ∈ ri0 ∧ ¬ fs0[ri0[inodekey(key0.ino)]].directory ∧ # fs0[ri0[key0]].data = VFS_PAGE_SIZE)) → key0 ∈ ri1 → ri1[key0] ∈ fs1 ∧ fs1[ri1[key0]].key = key0 ∧ (key0.inode? → fs1[ri1[key0]].inode? ∧ key0.ino ≠ 0) ∧ ( key0.dentry? → fs1[ri1[key0]].dentry? ∧ inodekey(key0.ino) ∈ ri1 ∧ inodekey(fs1[ri1[key0]].ino) ∈ ri1 ∧ ¬ inodekey(key0.ino) ∈ ro1 ∧ ¬ inodekey(fs1[ri1[key0]].ino) ∈ ro1 ∧ fs1[ri1[inodekey(key0.ino)]].directory) ∧ ( key0.data? → fs1[ri1[key0]].data? ∧ inodekey(key0.ino) ∈ ri1 ∧ ¬ fs1[ri1[inodekey(key0.ino)]].directory ∧ # fs1[ri1[key0]].data = VFS_PAGE_SIZE), ∀ adr. ( adr ∈ log0 → (fs0[adr].inode? → fs0[adr].key.inode? ∧ fs0[adr].key.ino ≠ 0) ∧ (fs0[adr].dentry? → fs0[adr].key.dentry?) ∧ (fs0[adr].data? → fs0[adr].key.data?) ∧ (fs0[adr].trunc? → fs0[adr].key.inode?)) → adr ∈ log1 → adr ∈ fs1 ∧ (fs1[adr].inode? → fs1[adr].key.inode? ∧ fs1[adr].key.ino ≠ 0) ∧ (fs1[adr].dentry? → fs1[adr].key.dentry?) ∧ (fs1[adr].data? → fs1[adr].key.data?) ∧ (fs1[adr].trunc? → fs1[adr].key.inode?), ∀ key. key ∈ fo1 → key ∈ fi1, ∀ key. key ∈ ro1 → key ∈ ri1 ⊦ dups(log0), inodekey(0) ∈ ri1, inodekey(0) ∈ ri0, ri1[dentrykey(ino, str)] ∈ fs1 ∧ fs1[ri1[dentrykey(ino, str)]].dentry? ∧ fs1[ri1[dentrykey(ino, str)]].key = dentrykey(ino, str), inodekey(ino) ∈ ri0 ∧ inodekey(fs0[ri0[dentrykey(ino, str)]].ino) ∈ ri0 ∧ ¬ inodekey(ino) ∈ ro0 ∧ ¬ inodekey(fs0[ri0[dentrykey(ino, str)]].ino) ∈ ro0 ∧ fs0[ri0[inodekey(ino)]].directory
Used simplifier rules: elim-dentry: ⊦ key.dentry? ↔ (∃ ino, str. key = dentrykey(ino, str));% ⊦ dentrykey(m, str).ino = m; (s)%⊦ key-cons(dentrykey(ino, str), nd) ↔ nd.dentry? ∧ nd.key = dentrykey(ino, str); (s)% ⊦ ¬ dentrykey(m, str).data?; (s)% ⊦ dentrykey(m, str).dentry?; (s)% ⊦ ¬ dentrykey(m, str).inode?; (s)