| # links(m, dirs) = 0, of0[fd] = mkfile(m, mode, m0), files[m] = mkfile(m1, md, 0, content), err0 = ESUCCESS, fid = ofh0[fd].fid, fs = abs-files(files), ofh = ofh0 -- fd, ofh0 = abs-of(of0), root.dir?, dom of0 < ino0, abs(root, ROOT_INO)(dirs), afs-cons(dirs, files), afs-cons(dirs, files -- m), fids-cons(root, abs-files(files), abs-of(of0)), of-cons(of0 -- fd, dirs, files -- m), of-cons(of0, dirs, files), fd ∈ ofh0, fd ∈ of0, m ∈ files, psynced → asynced ⊦ ⟨skip⟩ (ofh = abs-of(of0 -- fd) ∧ fs = abs-files(files -- m) ∧ (psynced → asynced) ∧ ESUCCESS = err0), m = ROOT_INO, is-open(m, of0 -- fd), ¬ fid ∈ ofh.fids ∧ ¬ fid ∈ root.fids |
⊦ ⌜ino⌝ ∈ abs-of(of).fids ↔ is-open(ino, of)
⊦ n ∈ files ∧ abs(tree, ROOT_INO)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (⌜n⌝ ∈ tree.fids ↔ links(n, dirs) ≠ ∅)
Used simplifier rules: of: ⊦ ⌜ino⌝ ∈ abs-of(of).fids ↔ is-open(ino, of);%file-fid: ⊦ n ∈ files ∧ abs(tree, ROOT_INO)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (⌜n⌝ ∈ tree.fids ↔ links(n, dirs) ≠ ∅);% ⊦ fd ∈ abs-of(of) ↔ fd ∈ of; (s)% ⊦ abs-of(of) -- fd = abs-of(of -- fd); (s)%fd ∈ of ⊦ abs-of(of)[fd] = mkfh(⌜of[fd].ino⌝ , of[fd].mode, of[fd].pos); (s)% ⊦ mkfh(fid, mode, m).fid = fid; (s)% ⊦ mkfile(m, mode, m0).ino = m; (s)%size-zero-01: ⊦ ls ≠ ∅ → # ls ≠ 0; (forward) from specification set-basic[alink-set]