| inodekey(ino) ∈ ri, ino ∈ abs-files(fs, ri), fs[ri[inodekey(ino)]].nlink ≠ 0 ∨ ino = ROOT_INO ⊦ abs-files(fs, ri)[ino] = mkfile(fs[ri[inodekey(ino)]].size, fs[ri[inodekey(ino)]].meta, fs[ri[inodekey(ino)]].nlink, abs-content(ino, fs, ri ⊖ orphans(fs, ri))), fs[ri[inodekey(ino)]].directory, ino ∈ abs-keys(orphans(fs, ri)), fs[ri[inodekey(ino)]].nlink = 0 ∧ ino ≠ ROOT_INO |
inodekey(ino) ∈ ri, fs[ri[inodekey(ino)]].nlink ≠ 0 ∨ ino = ROOT_INO ⊦ fs[ri[inodekey(ino)]].directory, (datakey(ino, n) ∈ ri ⊖ orphans(fs, ri) ↔ datakey(ino, n) ∈ ri) ∧ (datakey(ino, n) ∈ ri ⊖ orphans(fs, ri) → fs[(ri ⊖ orphans(fs, ri))[datakey(ino, n)]].data = fs[ri[datakey(ino, n)]].data), fs[ri[inodekey(ino)]].nlink = 0 ∧ ino ≠ ROOT_INO
Used simplifier rules: at-files: ⊦ inodekey(ino) ∈ ri ∧ ¬ fs[ri[inodekey(ino)]].directory → abs-files(fs, ri)[ino] = abs-file(ino, fs, ri);%file: ⊦ abs-file(ino, fs, ri) = mkfile (fs[ri[inodekey(ino)]].size, fs[ri[inodekey(ino)]].meta, fs[ri[inodekey(ino)]].nlink, abs-content(ino, fs, ri));%F-inj: ⊦ mkfile(m0, md0, n0, content0) = mkfile(m1, md1, n1, content1) ↔ ¬(n0 ≠ n1 ∨ md0 ≠ md1 ∨ m0 ≠ m1 ∨ content0 ≠ content1);%P-ext: ⊦ content = abs-content(ino, fs, ri) ↔ (∀ n. (n ∈ content ↔ datakey(ino, n) ∈ ri) ∧ (n ∈ content → content[n] = fs[ri[datakey(ino, n)]].data));%in-content: ⊦ n ∈ abs-content(ino, fs, ri) ↔ datakey(ino, n) ∈ ri;%at-content: ⊦ datakey(ino, n) ∈ ri → abs-content(ino, fs, ri)[n] = fs[ri[datakey(ino, n)]].data;%in-files: ⊦ ino ∈ abs-files(fs, ri) ↔ inodekey(ino) ∈ ri ∧ ¬ fs[ri[inodekey(ino)]].directory;%abs-keys: ⊦ n ∈ abs-keys(ks) ↔ inodekey(n) ∈ ks;% ⊦ inodekey(m).ino = m; (s)% ⊦ inodekey(m).inode?; (s)%⊦ key ∈ orphans(fs, ri) ↔ key.inode? ∧ key ∈ ri ∧ fs[ri[key]].nlink = 0 ∧ key.ino ≠ ROOT_INO; (s)