| ⟨if pre-lookup(p_ino, dent, dirs, files) then { if dent.name ∈ dirs[p_ino].entries then {dent := mkdentry(dent.name, dirs[p_ino].entries[dent.name]); err := ESUCCESS} else {dent := negdentry(dent.name); err := ENOENT} or fail#(; ; err)} else abort⟩ (dent = old_dent ∧ err = err0), asynced ↔ asynced0, dirs = dirs1, files = files1, p_ino = pageno ⊦ pageno ∈ dirs1 ∧ (links(pageno, dirs1) ≠ ∅ ∨ pageno = ROOT_INO) |
⟨abort⟩ (dent = old_dent ∧ err = err0), asynced ↔ asynced0, dirs = dirs1, files = files1, p_ino = pageno ⊦ pageno ∈ dirs1 ∧ (links(pageno, dirs1) ≠ ∅ ∨ pageno = ROOT_INO)
Used simplifier rules: ⊦ pre-lookup(p_ino, dent, dirs, files) ↔ valid-parent-ino(p_ino, dirs, files); (s)%⊦ valid-parent-ino(ino, dirs, files) ↔ ino ∈ dirs ∧ (links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO); (s)