| sdt0[str1] = dnode(md, sdt), q0 ∈ dnode(md, sdt[str, tree0]), str1 ∈ sdt0, str ' ⊑ q0, ∀ md1, sdt1, md2, sdt2, q, str2, tree. dnode(md1, sdt1) = dnode(md2, sdt2) ∧ q ∈ dnode(md2, sdt2[str2, tree]) → dnode(md2, sdt2[str2, tree])[q] = (str2 ' ⊑ q ⊃ tree[q.tail];(q = ε ⊃ dnode(md1, sdt1[str2, tree]);dnode(md1, sdt1)[q])) ⊦ dnode(md, sdt[str, tree0])[q0] = tree0[q0.tail] |
⊦ tree[ε] = tree
⊦ str ' + p ∈ dnode(md, sdt) ↔ str ∈ sdt ∧ p ∈ sdt[str]
⊦ str ∈ sdt → dnode(md, sdt)[str ' + p] = sdt[str][p]
Used simplifier rules: nil-at: ⊦ tree[ε] = tree;%in-dnode: ⊦ str ' + p ∈ dnode(md, sdt) ↔ str ∈ sdt ∧ p ∈ sdt[str];%at-dnode: ⊦ str ∈ sdt → dnode(md, sdt)[str ' + p] = sdt[str][p];% ⊦ str + p = str ' + p; (s)% ⊦ str ' + p ≠ ε; (s)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ str ' ⊑ str0 ' + p ↔ str = str0; (s)% ⊦ str = str0 → sdt[str0, tree][str] = tree; (s)% ⊦ p ⊑ ε ↔ p = ε; (s)% ⊦ str ' ≠ ε; (s)%p ≠ ε ⊦ str = p.head ∧ p0 = p.tail ↔ p = str + p0; (elim) Used terms: q0, str0, p