| dnode(md, sdt0[str, tree])[parent(str ' + p0)].dir?, p0 ∈ tree, ∀ tree0, tree1. tree0[parent(p0)].dir? ∧ p0 ∈ tree0 → tree0[p0, tree1].fids = (tree0.fids ∪ tree1.fids) \ tree0[p0].fids ∨ p0 = ε ⊦ dnode(md, sdt0[str, tree])[str ' + p0, tree1].fids = ((sdt0.fids ∪ tree.fids) ∪ tree1.fids) \ tree[p0].fids, str ∈ sdt0 |
⊦ p ≠ ε → parent(p0 + p) = p0 + parent(p)
⊦ dnode(md, sdt).fids = sdt.fids
⊦ ¬ str ∈ sdt → sdt[str, tree].fids = sdt.fids ∪ tree.fids
dnode(md, sdt0[str, tree])[str ' + parent(p0)].dir?, p0 ∈ tree, ∀ tree0, tree1. tree0[parent(p0)].dir? ∧ p0 ∈ tree0 → tree0[p0, tree1].fids = (tree0.fids ∪ tree1.fids) \ tree0[p0].fids ∨ p0 = ε ⊦ dnode(md, sdt0[str, tree])[str ' + p0, tree1].fids = ((sdt0.fids ∪ tree.fids) ∪ tree1.fids) \ tree[p0].fids, p0 = ε, str ∈ sdt0
Used simplifier rules: fids-dnode: ⊦ dnode(md, sdt).fids = sdt.fids;%fids-ins: ⊦ ¬ str ∈ sdt → sdt[str, tree].fids = sdt.fids ∪ tree.fids;% ⊦ p + ε = p; (s)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ dnode(md, sdt)[str ', tree0] = dnode(md, sdt[str, tree0]); (s)% ⊦ sdt[str, tree0][str, tree] = sdt[str, tree]; (s)% ⊦ tree[ε] = tree; (s)% ⊦ (fidb ∪ fidb0) \ fidb0 = fidb; (s)%union-ass: ⊦ fidb ∪ fidb0 ∪ fidb1 = (fidb ∪ fidb0) ∪ fidb1; from specification bag-union[fidbag]%union-com: ⊦ fidb ∪ fidb0 = fidb0 ∪ fidb; from specification bag-union[fidbag]% ⊦ fidb ∪ fidb0 = fidb ∪ fidb1 ↔ fidb0 = fidb1; (s) Used terms: p0, str '