| ri[key] ∈ fs, key ∈ ri, ri[inodekey(fs[ri[key]].key.ino)] ∈ as, fs[ri[key]].data? → inodekey(fs[ri[key]].key.ino) ∈ ri ∧ ¬ fs[ri[inodekey(fs[ri[key]].key.ino)]].directory ∧ # fs[ri[key]].data = VFS_PAGE_SIZE, fs[ri[key]].dentry? → inodekey(fs[ri[key]].key.ino) ∈ ri ∧ ¬ inodekey(fs[ri[key]].key.ino) ∈ ro ∧ fs[ri[inodekey(fs[ri[key]].key.ino)]].directory ∧ inodekey(fs[ri[key]].ino) ∈ ri ∧ ¬ inodekey(fs[ri[key]].ino) ∈ ro ⊦ # as = 0, as = ∅, ri[inodekey(fs[ri[key]].key.ino)] ∈ range ri ∩ as, ( fs[ri[key]].dentry? → inodekey(fs[ri[key]].key.ino) ∈ ri ∧ ¬ inodekey(fs[ri[key]].key.ino) ∈ ro ∧ (∅)[ri[inodekey(fs[ri[key]].key.ino)]].directory ∧ inodekey(fs[ri[key]].ino) ∈ ri ∧ ¬ inodekey(fs[ri[key]].ino) ∈ ro) ∧ ( fs[ri[key]].data? → inodekey(fs[ri[key]].key.ino) ∈ ri ∧ ¬ (∅)[ri[inodekey(fs[ri[key]].key.ino)]].directory ∧ # fs[ri[key]].data = VFS_PAGE_SIZE) |
ri[inodekey(fs[ri[key]].key.ino)] ∈ as, key ∈ ri, ri[key] ∈ fs, fs[ri[key]].dentry? → inodekey(fs[ri[key]].key.ino) ∈ ri ∧ ¬ inodekey(fs[ri[key]].key.ino) ∈ ro ∧ fs[ri[inodekey(fs[ri[key]].key.ino)]].directory ∧ inodekey(fs[ri[key]].ino) ∈ ri ∧ ¬ inodekey(fs[ri[key]].ino) ∈ ro, fs[ri[key]].data? → inodekey(fs[ri[key]].key.ino) ∈ ri ∧ ¬ fs[ri[inodekey(fs[ri[key]].key.ino)]].directory ∧ # fs[ri[key]].data = VFS_PAGE_SIZE ⊦ # as = 0, as = ∅, ri[inodekey(fs[ri[key]].key.ino)] ∈ ri, ( fs[ri[key]].dentry? → inodekey(fs[ri[key]].key.ino) ∈ ri ∧ ¬ inodekey(fs[ri[key]].key.ino) ∈ ro ∧ (∅)[ri[inodekey(fs[ri[key]].key.ino)]].directory ∧ inodekey(fs[ri[key]].ino) ∈ ri ∧ ¬ inodekey(fs[ri[key]].ino) ∈ ro) ∧ ( fs[ri[key]].data? → inodekey(fs[ri[key]].key.ino) ∈ ri ∧ ¬ (∅)[ri[inodekey(fs[ri[key]].key.ino)]].directory ∧ # fs[ri[key]].data = VFS_PAGE_SIZE)
Used simplifier rules: int-c: ⊦ as ∩ as0 = as0 ∩ as; from specification set-union[node-store]%int-a: ⊦ (as ∩ as0) ∩ as1 = as ∩ as0 ∩ as1; from specification set-union[node-store]% ⊦ adr ∈ range ri ↔ adr ∈ ri; (s)% ⊦ adr ∈ as ∩ as0 ↔ adr ∈ as ∧ adr ∈ as0; (ws)