| tree = dnode(md, sdt), tree[parent(p)].dir?, parent(p) ∈ tree, str ' + q0 ⊑ p, ∀ tree, p, tree0, ino0, ino1, D, dirs. tree[parent(p)].dir? ∧ parent(p) ∈ tree ∧ q0 ⊑ p → (((abs|(tree[p, tree0], ino0, q0, ino1) * D))(dirs) ↔ ((abs|(tree, ino0, q0, ino1) * D))(dirs)) ∨ p = ε ⊦ ((abs|(tree[p, tree0], ino0, str ' + q0, ino1) * D))(dirs) ↔ ((abs|(tree, ino0, str ' + q0, ino1) * D))(dirs), p = ε |
⊦ abs|(dnode(md, sdt), ino, str ' + p, ino0) = _∃(λ ad. ino => ad * abs|(sdt, ad.entries, str ' + p, ino0) ∧ ⌜ad.meta = md⌝ ∧ ⌜ad.size = # ad.entries⌝ )
⊦ abs|(sdt, entries, str ' + p, ino0) = (⌜str ∈ entries⌝ ∧ abs|(sdt[str], entries[str], p, ino0) * abs(sdt -- str, entries -- str))
dnode(md, sdt)[parent(p)].dir?, parent(p) ∈ dnode(md, sdt), str ' + q0 ⊑ p, ∀ tree, p, tree0, ino0, ino1, D, dirs. tree[parent(p)].dir? ∧ parent(p) ∈ tree ∧ q0 ⊑ p → (((abs|(tree[p, tree0], ino0, q0, ino1) * D))(dirs) ↔ ((abs|(tree, ino0, q0, ino1) * D))(dirs)) ∨ p = ε ⊦ ((abs|(dnode(md, sdt)[p, tree0], ino0, str ' + q0, ino1) * D))(dirs) ↔ (∃ ad. str ∈ ad.entries ∧ ad.meta = md ∧ ad.size = # ad.entries ∧ ((((abs|(sdt[str], ad.entries[str], q0, ino1) * abs(sdt -- str, ad.entries -- str)) * ino0 => ad) * D))(dirs)), p = ε
Used simplifier rules: absc-dnode-rec: ⊦ abs|(dnode(md, sdt), ino, str ' + p, ino0) = _∃ (λ ad. ino => ad * abs|(sdt, ad.entries, str ' + p, ino0) ∧ ⌜ad.meta = md⌝ ∧ ⌜ad.size = # ad.entries⌝ );%absc-entries: ⊦ abs|(sdt, entries, str ' + p, ino0) = ( ⌜str ∈ entries⌝ ∧ abs|(sdt[str], entries[str], p, ino0) * abs(sdt -- str, entries -- str));% ⊦ ⌜bv⌝ (dirs) ↔ bv; (s)% ⊦ ((D ∧ D0))(dirs) ↔ D(dirs) ∧ D0(dirs); (s)% ⊦ ((_∃ adD * D))(dirs) ↔ (∃ ad. ((adD(ad) * D))(dirs)); (s)%sep-com: ⊦ D * D0 = D0 * D; from specification heap-sep[dir-heap]%sep-ass: ⊦ (D * D0) * D1 = D * D0 * D1; from specification heap-sep[dir-heap]%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]% ⊦ (⌜bv⌝ ∧ D) * D0 = (⌜bv⌝ ∧ D * D0); (s)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]