| replay-log(log0, fs0, fi0 ⊖ fo0) = (ri \ ro) \ datakeys(ro, ri), fo0.inodes?, ro.inodes?, file-node-cons(fs0, ri), log-cons(log0, fs0), orphans-cons(fs0, ri, ro), replay-safe(log0, fs0, fi0 ⊖ fo0), ri-closed(ri, fs0, ro), ri-cons(ri, fs0), ri-inj(ri), ri-inj(fi0), inodekey(ino) ∈ ri, datakey(ino, n) ∈ ri, ri[datakey(ino, n)] ∈ fs0, ro ⊆ dom ri, fo0 ⊆ dom fi0, fs0[ri[datakey(ino, n)]].data? → ¬ fs0[ri[inodekey(ino)]].directory ∧ # fs0[ri[datakey(ino, n)]].data = VFS_PAGE_SIZE, fs0[ri[datakey(ino, n)]].dentry? → fs0[ri[inodekey(ino)]].directory ∧ inodekey(fs0[ri[datakey(ino, n)]].ino) ∈ ri ∧ ¬ inodekey(fs0[ri[datakey(ino, n)]].ino) ∈ ro ⊦ dups(log0), inodekey(0) ∈ ri, inodekey(ino) ∈ ro, ( fs0[ri[datakey(ino, n)]].dentry? → inodekey(ino) ∈ replay-log(log0, fs0, fi0 ⊖ fo0) ∧ fs0[replay-log(log0, fs0, fi0 ⊖ fo0)[inodekey(ino)]].directory ∧ inodekey(fs0[ri[datakey(ino, n)]].ino) ∈ replay-log(log0, fs0, fi0 ⊖ fo0)) ∧ ( fs0[ri[datakey(ino, n)]].data? → inodekey(ino) ∈ replay-log(log0, fs0, fi0 ⊖ fo0) ∧ ¬ fs0[replay-log(log0, fs0, fi0 ⊖ fo0)[inodekey(ino)]].directory ∧ # fs0[ri[datakey(ino, n)]].data = VFS_PAGE_SIZE) |
⊦ ri ⊖ ks = (ri \ ks) \ datakeys(ks, ri)
Used simplifier rules: at-diff-ri: ⊦ (ri \ ks)[key] = (key ∈ ks ⊃ (∅)[key];ri[key]);% ⊦ key ∈ ri \ ks ↔ key ∈ ri ∧ ¬ key ∈ ks; (ls)%⊦ key ∈ datakeys(ks, ri) ↔ key ∈ ri ∧ key.data? ∧ inodekey(key.ino) ∈ ks; (s)% ⊦ ¬ inodekey(m).data?; (s)% ⊦ ¬ key ∈ ks → (ri \ ks)[key] = ri[key]; (s) Used terms: fo0, fi0