| p = str0 + p0, 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 = ε |
dnode(md, sdt)[parent(str0 ' + p0)].dir?, parent(str0 ' + p0) ∈ dnode(md, sdt), q0 ⊑ p0, ∀ 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)[str0 ' + p0, tree0], ino0, str0 ' + q0, ino1) * D))(dirs) ↔ (∃ ad. str0 ∈ ad.entries ∧ ad.meta = md ∧ ad.size = # ad.entries ∧ ((((abs|(sdt[str0], ad.entries[str0], q0, ino1) * abs(sdt -- str0, ad.entries -- str0)) * ino0 => ad) * D))(dirs))
Used simplifier rules: ⊦ str ' + p ⊑ str0 ' + p0 ↔ str = str0 ∧ p ⊑ p0; (ws)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ str ' + p ≠ ε; (s)% ⊦ str + p = str ' + p; (s)