| ri0[key0] = ri1[key0], ks0.inodes?, ro1.inodes?, key0 ∈ ri1, key0 ∈ ri0, key ∈ ro1, key ∈ ks0, key0 ∈ (ri0 \ datakeys(key, ri0)) -- key, ks0 ⊆ ro1, ∀ key. (key ∈ ri0 ⊖ ks0 ↔ key ∈ ri1 ⊖ ro1) ∧ (ri0 ⊖ ks0)[key] = (ri1 ⊖ ro1)[key] ⊦ # ro1 = 0, # ks0 = 0, ks0 = ∅, ro1 = ∅, key0.data?, key0 ∈ ro1, key0 ∈ ks0, key0 ∈ ks0 -- key, (key0 ∈ ri1 ⊖ ro1 → key0 ∈ ((ri0 \ datakeys(key, ri0)) -- key) ⊖ (ks0 -- key)) ∧ ((ri0 \ datakeys(key, ri0)) -- key)[key0] = ri1[key0] |
ri0[key0] = ri1[key0], ro1.inodes?, ks0.inodes?, key ∈ ks0, key ∈ ro1, key0 ∈ ri0, key0 ∈ ri1, ks0 ⊆ ro1, ∀ key. (key ∈ ri0 ⊖ ks0 ↔ key ∈ ri1 ⊖ ro1) ∧ (ri0 ⊖ ks0)[key] = (ri1 ⊖ ro1)[key] ⊦ # ks0 = 0, # ro1 = 0, ks0 = ∅, ro1 = ∅, key0.data?, key0 ∈ ks0, key0 ∈ ro1, key0 ∈ ((ri0 \ datakeys(key, ri0)) -- key) ⊖ (ks0 -- key)
Used simplifier rules: at-del-ri: ⊦ (ri -- key0)[key1] = (key0 = key1 ⊃ (∅)[key0];ri[key1]);%at-diff-ri: ⊦ (ri \ ks)[key] = (key ∈ ks ⊃ (∅)[key];ri[key]);%⊦ key ∈ ri ⊖ ks ↔ key ∈ ri ∧ ¬ key ∈ ks ∧ (key.data? → ¬ inodekey(key.ino) ∈ ks); (ws)% ⊦ key ∈ ks -- key0 ↔ key ≠ key0 ∧ key ∈ ks; (s)%⊦ key ∈ datakeys(key0, ri) ↔ key ∈ ri ∧ key.data? ∧ key0.inode? ∧ key.ino = key0.ino; (s)% ⊦ key ∈ ri \ ks ↔ key ∈ ri ∧ ¬ key ∈ ks; (ls)% ⊦ key ∈ ri -- key0 ↔ key ≠ key0 ∧ key ∈ ri; (s)