| ino = ROOT_INO, afs-cons(dirs, files), ROOT_INO ∈ dirs ⊦ [vfs_walk#(p, user, dirs, files, asynced; ino, err)] ( ⌊err⌋ ∨ err = ESUCCESS ∧ ispath(p, ROOT_INO, ino, dirs, files) ∧ px-parent(user, p, ROOT_INO, dirs, files) ∨ err = ENOENT ∧ ¬ ispath(p, ROOT_INO, dirs, files) ∨ err = EACCESS ∧ p ≠ ε ∧ (∃ p'. p' ⊑ parent(p) ∧ ispath(p', ROOT_INO, dirs, files) ∧ ¬ px(user, p', ROOT_INO, dirs, files))) |
p_ino ∈ dirs, p_ino = ino, afs-cons(dirs, files), ispath(q, ROOT_INO, p_ino, dirs, files), q ≠ ε → px(user, parent(q), ROOT_INO, dirs, files) ⊦ [vfs_walk#(p, user, dirs, files, asynced; ino, err)] ( ⌊err⌋ ∨ err = ESUCCESS ∧ ispath(p, p_ino, ino, dirs, files) ∧ px-parent(user, q + p, ROOT_INO, dirs, files) ∨ err = ENOENT ∧ ¬ ispath(p, p_ino, dirs, files) ∨ err = EACCESS ∧ p ≠ ε ∧ (∃ p'. p' ⊑ parent(p) ∧ ispath(p', p_ino, dirs, files) ∧ ¬ px(user, q + p', ROOT_INO, dirs, files)))
Used simplifier rules: ⊦ ispath(ε, n, m, dirs, files) ↔ valid-ino(n, dirs, files) ∧ m = n; (s)% ⊦ valid-ino(ino, dirs, files) ↔ ino ∈ dirs ∨ ino ∈ files; (s)% ⊦ ε + p = p; (s)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ afs-cons(dirs, files) → ROOT_INO ∈ dirs; (ss)