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