| dnode(md, sdt)[parent(str ' + p0)].dir?, parent(str ' + p0) ∈ dnode(md, sdt), ∀ tree0, tree1. tree0[parent(p0)].dir? ∧ parent(p0) ∈ tree0 → tree0[p0, tree1].fids = tree0.fids ∪ tree1.fids ∨ p0 = ε ∨ p0 ∈ tree0 ⊦ dnode(md, sdt)[str ' + p0, tree1].fids = sdt.fids ∪ tree1.fids, str ∈ sdt ∧ p0 ∈ sdt[str] |
⊦ 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, sdt)[parent(str ' + p0)].dir?, str ' + parent(p0) ∈ dnode(md, sdt), ∀ tree0, tree1. tree0[parent(p0)].dir? ∧ parent(p0) ∈ tree0 → tree0[p0, tree1].fids = tree0.fids ∪ tree1.fids ∨ p0 = ε ∨ p0 ∈ tree0 ⊦ dnode(md, sdt)[str ' + p0, tree1].fids = sdt.fids ∪ tree1.fids, p0 = ε, str ∈ sdt ∧ p0 ∈ sdt[str]
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)% ⊦ parent(str ') = ε; (s)% ⊦ ε ∈ tree; (s)% ⊦ tree[ε] = tree; (s)% ⊦ dnode(md, sdt).dir?; (s)% ⊦ tree[ε, tree0] = tree0; (s)% ⊦ fidb ∪ fidb0 = fidb ∪ fidb1 ↔ fidb0 = fidb1; (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] Used terms: p0, str '