| dent = negdentry(str), err = ESUCCESS, p = str + p1, afs-cons(dirs, files), px(user, dirs[ino].meta), ino ∈ dirs, links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO, ∀ p0, err, dirs, files, ino, user, asynced. # p0 < # p → err = ESUCCESS ∧ afs-cons(dirs, files) ∧ (ino ∈ dirs ∨ ino ∈ files) ∧ (links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO) → ⟪while p0 ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p0.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p0 := p0.tail}}}⟫ true ⊦ ⟪afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p := p.tail}; while p ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p := p.tail}}}⟫ true, p = ε |
dent = negdentry(str), err = ESUCCESS, afs-cons(dirs, files), px(user, dirs[ino].meta), ino ∈ dirs, links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO, ∀ p0, err, dirs, files, ino, user, asynced. # p0 < #(str + p1) → err = ESUCCESS ∧ afs-cons(dirs, files) ∧ (ino ∈ dirs ∨ ino ∈ files) ∧ (links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO) → ⟪while p0 ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p0.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p0 := p0.tail}}}⟫ true ⊦ ⟪afs_lookup#(ino, dirs, files, asynced; dent, err); p := str ' + p1; if err = ESUCCESS then {ino := dent.ino; p := p.tail}; while p ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p := p.tail}}}⟫ true
Used simplifier rules: a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ str ' + p ≠ ε; (s)% ⊦ str + p = str ' + p; (s)