| sdt0[str, tree][str0][p] = fnode(fid), str0 ∈ sdt0[str, tree], p ∈ sdt0[str, tree][str0], ∀ sdt1, fid. # sdt1 < # sdt0[str, tree] → true → (fid ∈ sdt1.fids ↔ (∃ str, p. str ∈ sdt1 ∧ p ∈ sdt1[str] ∧ sdt1[str][p] = fnode(fid))) ⊦ fid ∈ sdt0.fids, str ∈ sdt0, fid ∈ tree.fids, ∃ str, p. str ∈ sdt0 ∧ p ∈ sdt0[str] ∧ sdt0[str][p] = fnode(fid) |
⊦ str ≠ str0 → sdt[str0, tree][str] = sdt[str]
⊦ tree[p] = fnode(fid) ∧ p ∈ tree → fid ∈ tree.fids
sdt0[str0][p] = fnode(fid), p ∈ sdt0[str, tree][str0], str0 ∈ sdt0[str, tree], ∀ sdt1, fid. # sdt1 < # sdt0[str, tree] → true → (fid ∈ sdt1.fids ↔ (∃ str, p. str ∈ sdt1 ∧ p ∈ sdt1[str] ∧ sdt1[str][p] = fnode(fid))) ⊦ str0 = str, fid ∈ tree.fids, str ∈ sdt0, fid ∈ sdt0.fids, ∃ str, p. str ∈ sdt0 ∧ p ∈ sdt0[str] ∧ sdt0[str][p] = fnode(fid)
Used simplifier rules: fids-path: ⊦ tree[p] = fnode(fid) ∧ p ∈ tree → fid ∈ tree.fids;% ⊦ sdt[str, tree][str] = tree; (s)% ⊦ str ∈ sdt[str0, tree] ↔ str = str0 ∨ str ∈ sdt; (ws) Used terms: str0, tree, str, sdt0