| abs(tree, ino)(dirs), afs-cons(dirs, files), fids-cons(tree, abs-files(files), ofh), ispath(p, ino, m, dirs, files) ⊦ ispath(p + str ', ino, dirs, files) ↔ m ∈ dirs ∧ str ∈ dirs[m].entries |
⊦ ispath(p, ino, m, dirs, files) ∧ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → p ∈ tree ∧ (tree[p].dir? ↔ m ∈ dirs)
⊦ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (p ∈ tree ↔ ispath(p, ino, dirs, files))
tree[p].dir?, abs(tree, ino)(dirs), afs-cons(dirs, files), fids-cons(tree, abs-files(files), ofh), ispath(p, ino, m, dirs, files), str ∈ dirs[m].entries, m ∈ dirs ⊦ dirs[m].entries[str] ∈ files, dirs[m].entries[str] ∈ dirs
Used simplifier rules: path-in: ⊦ ispath(p, ino, m, dirs, files) ∧ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → p ∈ tree ∧ (tree[p].dir? ↔ m ∈ dirs);%path-in-eq: ⊦ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (p ∈ tree ↔ ispath(p, ino, dirs, files));% ⊦ ispath(p, n, m, dirs, files) → ispath(p, n, dirs, files); (s)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]%⊦ ispath(str ', n, dirs, files) ↔ n ∈ dirs ∧ str ∈ dirs[n].entries ∧ (dirs[n].entries[str] ∈ dirs ∨ dirs[n].entries[str] ∈ files); (s)%⊦ ispath(p, n, m, dirs, files) → (ispath(p + q, n, dirs, files) ↔ ispath(q, m, dirs, files)); (s)