| err = ESUCCESS, err0 = err1, fid = root[path].fid, root.dir?, fids-cons(root, fs, ofh), pre-open(path, mode, err, user, root, fs, ofh) ⊦ fids-cons(root, fs, ofh[n, mkfh(fid, mode, 0)]), n ∈ ofh |
⊦ fids-cons(tree0, fs0, ofh0) → (fids-cons(tree1, fs1, ofh1) ↔ (∀ fid. (fid ∈ fs0 ↔ fid ∈ tree0.fids ∨ fid ∈ ofh0.fids) → (fid ∈ fs1 ↔ fid ∈ tree1.fids ∨ fid ∈ ofh1.fids)))
fid ∈ fs ↔ fid ∈ root.fids ∨ fid ∈ ofh.fids, root.dir?, fids-cons(root, fs, ofh), path ∈ root, mode = MODE_R ∨ mode = MODE_RW → pr(user, path, root, fs), mode = MODE_W ∨ mode = MODE_RW → pw(user, path, root, fs) ⊦ fid ∈ fs ↔ fid ∈ root.fids ∨ fid = root[path].fid ∨ fid ∈ ofh.fids, root[path].dir?, n ∈ ofh
Used simplifier rules: fids-cons-reduce: ⊦ fids-cons(tree0, fs0, ofh0) → ( fids-cons(tree1, fs1, ofh1) ↔ (∀ fid. (fid ∈ fs0 ↔ fid ∈ tree0.fids ∨ fid ∈ ofh0.fids) → (fid ∈ fs1 ↔ fid ∈ tree1.fids ∨ fid ∈ ofh1.fids)));% ⊦ fid ∈ fids ++ fid0 ↔ fid = fid0 ∨ fid ∈ fids; (s)% ⊦ mkfh(fid, mode, m).fid = fid; (s)% ⊦ ¬ fd ∈ ofh → ofh[fd, fh].fids = ofh.fids ++ fh.fid; (s)%⊦ pre-open(p, mode, ESUCCESS, user, root, fs, ofh) ↔ p ∈ root ∧ ¬ root[p].dir? ∧ (mode = MODE_R ∨ mode = MODE_RW → pr(user, p, root, fs)) ∧ (mode = MODE_W ∨ mode = MODE_RW → pw(user, p, root, fs)); (s)