| ⟪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 ∧ parent(p) ≠ ε ∧ (∃ p'. p' ⊑ parent(parent(p)) ∧ ispath(p', ROOT_INO, dirs, files) ∧ ¬ px(user, p', ROOT_INO, dirs, files))), ino = ROOT_INO, 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(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 ≠ p.head ' ∧ (∃ p'. p' ⊑ parent(parent(p)) ∧ ispath(p', ROOT_INO, dirs, files) ∧ ¬ px(user, p', ROOT_INO, dirs, files))), ino = ROOT_INO, p ≠ ε, 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)))
Used simplifier rules: ⊦ p ≠ ε → (parent(p) = ε ↔ p = p.head '); (s)