| ispath(name + p0, n0, n1, dirs0, files), dirs0 ⊥ dirs1, ∀ n0, n1, dirs0, files, dirs1. ispath(p0, n0, n1, dirs0, files) ∧ dirs0 ⊥ dirs1 → ispath(p0, n0, n1, dirs0 ∪ dirs1, files) ⊦ ispath(name + p0, n0, n1, dirs0 ∪ dirs1, files) |
ispath(p0, dirs0[n0].entries[name], n1, dirs0, files), n0 ∈ dirs0, name ∈ dirs0[n0].entries, dirs0 ⊥ dirs1, ∀ n0, n1, dirs0, files, dirs1. ispath(p0, n0, n1, dirs0, files) ∧ dirs0 ⊥ dirs1 → ispath(p0, n0, n1, dirs0 ∪ dirs1, files) ⊦ ispath(p0, dirs0[n0].entries[name], n1, dirs0 ∪ dirs1, files)
Used simplifier rules: path-rec: ⊦ ispath(str ' + p, n, m, dirs, files) ↔ valid-dir-ino(n, dirs, files) ∧ str ∈ dirs[n].entries ∧ ispath(p, dirs[n].entries[str], m, dirs, files);%valid-dir-ino: ⊦ valid-dir-ino(ino, dirs, files) ↔ ino ∈ dirs;%ino ∈ dirs ∪ dirs0 ⊦ dirs ⊥ dirs0 → (dirs ∪ dirs0)[ino] = (ino ∈ dirs ⊃ dirs[ino];dirs0[ino]); (s)% ⊦ dirs ⊥ dirs0 → (ino ∈ dirs ∪ dirs0 ↔ ino ∈ dirs ∨ ino ∈ dirs0); (s)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ str + p = str ' + p; (s)