| ⟨vfs_walk#(parent(str0 ' + p0), user, dirs, files, asynced; ino, err)⟩ (ino = ino0 ∧ err = err0), ⟪vfs_walk#(parent(str0 ' + p0), user, dirs, files, asynced; ino, err)⟫ ( ⌊err⌋ ∨ err = ESUCCESS ∧ ispath(parent(str0 ' + p0), ROOT_INO, ino, dirs, files) ∧ px-parent(user, parent(str0 ' + p0), ROOT_INO, dirs, files) ∨ err = ENOENT ∧ ¬ ispath(parent(str0 ' + p0), ROOT_INO, dirs, files) ∨ err = EACCESS ∧ p0 ≠ ε ∧ (∃ p'. p' ⊑ parent(str0 ' + parent(p0)) ∧ ispath(p', ROOT_INO, dirs, files) ∧ ¬ px(user, p', ROOT_INO, dirs, files))), ino = ROOT_INO, afs-cons(dirs, files), ⌊err0⌋ ∨ err0 = ESUCCESS ∧ ispath(parent(str0 ' + p0), ROOT_INO, ino0, dirs, files) ∧ px-parent(user, parent(str0 ' + p0), ROOT_INO, dirs, files) ∨ err0 = ENOENT ∧ ¬ ispath(parent(str0 ' + p0), ROOT_INO, dirs, files) ∨ err0 = EACCESS ∧ p0 ≠ ε ∧ p' ⊑ parent(str0 ' + parent(p0)) ∧ ispath(p', ROOT_INO, dirs, files) ∧ ¬ px(user, p', ROOT_INO, dirs, files) ⊦ str0 ' + p0 = parent(str0 ' + p0) + (str0 ' + p0).last ' ∧ ( ⌊err0⌋ ∨ err0 = ESUCCESS ∧ ispath(parent(str0 ' + p0), ROOT_INO, ino0, dirs, files) ∧ px-parent(user, parent(str0 ' + p0), ROOT_INO, dirs, files) ∨ err0 = ENOENT ∧ ¬ ispath(parent(str0 ' + p0), ROOT_INO, dirs, files) ∨ err0 = EACCESS ∧ (∃ p'. p' ⊑ parent(str0 ' + p0) ∧ ispath(p', ROOT_INO, dirs, files) ∧ ¬ px(user, p', ROOT_INO, dirs, files))) |
⟪vfs_walk#(parent(str0 ' + p0), user, dirs, files, asynced; ino, err)⟫ ( ⌊err⌋ ∨ err = ESUCCESS ∧ ROOT_INO ∈ dirs ∧ str0 ∈ dirs[ROOT_INO].entries ∧ ispath(parent(p0), dirs[ROOT_INO].entries[str0], ino, dirs, files) ∧ px-parent(user, str0 ' + parent(p0), ROOT_INO, dirs, files) ∨ err = ENOENT ∧ (¬ str0 ∈ dirs[ROOT_INO].entries ∨ ¬ ispath(parent(p0), dirs[ROOT_INO].entries[str0], dirs, files)) ∨ err = EACCESS ∧ (∃ p'. p' ⊑ parent(str0 ' + parent(p0)) ∧ ispath(p', ROOT_INO, dirs, files) ∧ ¬ px(user, p', ROOT_INO, dirs, files))), ⟨vfs_walk#(parent(str0 ' + p0), user, dirs, files, asynced; ino, err)⟩ (ino = ino0 ∧ err = EACCESS), ino = ROOT_INO, p0 ≠ ε, afs-cons(dirs, files), ispath(p', ROOT_INO, dirs, files), p' ⊑ parent(str0 ' + parent(p0)), ¬ px(user, p', ROOT_INO, dirs, files) ⊦ ∃ p'0. p'0 ⊑ str0 ' + parent(p0) ∧ ispath(p'0, ROOT_INO, dirs, files) ∧ ¬ px(user, p'0, ROOT_INO, dirs, files)
Used simplifier rules: ⊦ ESUCCESS ≠ EACCESS; (s)% ⊦ ENOENT ≠ EACCESS; (s)% ⊦ ¬ ⌊EACCESS⌋ ; (s)%⊦ ispath(str ' + q, n, dirs, files) ↔ valid-dir-ino(n, dirs, files) ∧ str ∈ dirs[n].entries ∧ ispath(q, dirs[n].entries[str], dirs, files); (s)% ⊦ afs-cons(dirs, files) → ROOT_INO ∈ dirs; (ss)% ⊦ valid-dir-ino(ino, dirs, files) ↔ ino ∈ dirs; (s)%⊦ 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); (s)% ⊦ p ≠ ε → parent(str ' + p) = str ' + parent(p); (s)% ⊦ str ' + p = str ' + p0 ↔ p = p0; (s)%p ≠ ε ⊦ parent(p) + p.last ' = p; (s)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ str ' + p ≠ ε; (s)