| fs1[ri1[dentrykey(pageno, str)]].key = dentrykey(pageno, str), fs1[ri1[dentrykey(pageno, str)]].data?, fs1[ri1[dentrykey(pageno, str)]].dentry?, fs1[ri1[inodekey(pageno)]].directory, log-cons(log1, fs1), ubifs-cons(fs0, ri0, ro0, fi0, fo0, log0), dentrykey(pageno, str) ∈ ri1, ri1[dentrykey(pageno, str)] ∈ fs1, inodekey(pageno) ∈ ri1, inodekey(fs1[ri1[dentrykey(pageno, str)]].ino) ∈ ri1, fo1 ⊆ dom fi1, ro1 ⊆ dom ri1, ∀ 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, ∀ key. key ∈ ri1 → ri1[key] ∈ fs1 ∧ key-cons(key, fs1[ri1[key]]) ⊦ inodekey(0) ∈ ri1, inodekey(fs1[ri1[dentrykey(pageno, str)]].ino) ∈ ro1, inodekey(pageno) ∈ ro1 |
Used simplifier rules: ⊦ datanode(key, buf).data?; (s)% ⊦ ¬ datanode(key, buf).dentry?; (s)% ⊦ nd.data? → (key = nd.key ∧ buf = nd.data ↔ nd = datanode(key, buf)); (elim) Used terms: fs1[ri1[dentrykey(pageno, str)]], key0, buf