| # links(fid1, dnode(md, sdt0)) = count(fid1, sdt0.fids), ∀ str0. str0 ∈ sdt0[str, tree] → (∀ fid1. # links(fid1, sdt0[str, tree][str0]) = count(fid1, sdt0[str, tree][str0].fids)), ∀ sdt1, fid1, md. # sdt1 < # sdt0[str, tree] → (∀ str. str ∈ sdt1 → (∀ fid1. # links(fid1, sdt1[str]) = count(fid1, sdt1[str].fids))) → # links(fid1, dnode(md, sdt1)) = count(fid1, sdt1.fids) ⊦ #(links(fid1, dnode(md, sdt0)) ∪ (str + links(fid1, tree))) = count(fid1, sdt0.fids) + # links(fid1, tree), #(links(fid1, dnode(md, sdt0)) ∩ (str + links(fid1, tree))) = 0, str ∈ sdt0, ∀ p. p ∈ links(fid1, dnode(md, sdt0)) ∩ (str + links(fid1, tree)) ↔ p ∈ ∅ |
⊦ p ∈ str + ps ↔ p ≠ ε ∧ p.head = str ∧ p.tail ∈ ps
⊦ p ∈ links(fid, tree) ↔ p ∈ tree ∧ tree[p] = fnode(fid)
# links(fid1, dnode(md, sdt0)) = count(fid1, sdt0.fids), dnode(md, sdt0)[p] = fnode(fid1), tree[p.tail] = fnode(fid1), p ∈ dnode(md, sdt0), p.tail ∈ tree, ∀ str0. str0 ∈ sdt0[p.head, tree] → (∀ fid1. # links(fid1, sdt0[p.head, tree][str0]) = count(fid1, sdt0[p.head, tree][str0].fids)), ∀ sdt1, fid1, md. # sdt1 < # sdt0[p.head, tree] → (∀ str. str ∈ sdt1 → (∀ fid1. # links(fid1, sdt1[str]) = count(fid1, sdt1[str].fids))) → # links(fid1, dnode(md, sdt1)) = count(fid1, sdt1.fids) ⊦ #(links(fid1, dnode(md, sdt0)) ∩ (p.head + links(fid1, tree))) = 0, #(links(fid1, dnode(md, sdt0)) ∪ (p.head + links(fid1, tree))) = count(fid1, sdt0.fids) + # links(fid1, tree), p = ε, links(fid1, dnode(md, sdt0)) ∩ (p.head + links(fid1, tree)) = ∅, p.head ∈ sdt0
Used simplifier rules: in-consp: ⊦ p ∈ str + ps ↔ p ≠ ε ∧ p.head = str ∧ p.tail ∈ ps;%in-plinks: ⊦ p ∈ links(fid, tree) ↔ p ∈ tree ∧ tree[p] = fnode(fid);%size-zero-01: ⊦ ps ≠ ∅ → # ps ≠ 0; (forward) from specification set-basic[pathset]%size-zero: ⊦ # ps ≠ 0 → ps ≠ ∅; (forward) from specification set-basic[pathset]%int-c: ⊦ ps ∩ ps0 = ps0 ∩ ps; from specification set-union[pathset]%int-a: ⊦ (ps ∩ ps0) ∩ ps1 = ps ∩ ps0 ∩ ps1; from specification set-union[pathset]% ⊦ p ∈ ps ∩ ps0 ↔ p ∈ ps ∧ p ∈ ps0; (ws)% ⊦ ¬ p ∈ ∅; (s)