| (((⌜str ∈ entries[str, ino]⌝ ∧ abs(sdt -- str, entries[str, ino] -- str) * abs(sdt[str], entries[str, ino][str])) * D))(dirs), str ∈ sdt ⊦ str ∈ entries, ∃ tree, ino0, sdi0, sdt0. ¬ str ∈ sdt0 ∧ sdt = sdt0[str, tree] ∧ ¬ str ∈ sdi0 ∧ entries[str, ino] = sdi0[str, ino0] ∧ ((abs(tree, ino0) * abs(sdt0, sdi0) * D))(dirs) |
(((abs(sdt -- str, entries) * abs(sdt[str], ino)) * D))(dirs), str ∈ sdt ⊦ str ∈ entries, ∃ tree, ino0, sdi0, sdt0. ¬ str ∈ sdt0 ∧ sdt = sdt0[str, tree] ∧ ¬ str ∈ sdi0 ∧ entries[str, ino] = sdi0[str, ino0] ∧ ((abs(tree, ino0) * abs(sdt0, sdi0) * D))(dirs)
Used simplifier rules: and-com: ⊦ (D ∧ D0) = (D0 ∧ D); from specification heap-sep[dir-heap]%and-ass: ⊦ ((D ∧ D0) ∧ D1) = (D ∧ D0 ∧ D1); from specification heap-sep[dir-heap]% ⊦ (true ∧ D) = D; (s)% ⊦ entries[str, ino][str] = ino; (s)% ⊦ ¬ str ∈ entries → entries -- str = entries; (s)% ⊦ entries[str, ino] -- str = entries -- str; (s)% ⊦ ⌜true⌝ = true; (s)% ⊦ str ∈ entries[str0, ino] ↔ str = str0 ∨ str ∈ entries; (ws)