| tree[p] = dnode(md, sdt), tree.dir?, p ∈ tree, q ∈ tree[p, dnode(md, sdt[str, tree0])] ⊦ tree[p, dnode(md, sdt[str, tree0])][q] = (p + str ' ⊑ q ⊃ tree0[restn(# p + 1, q)];(q ⊑ p ⊃ tree[q][restn(# q, p + str '), tree0];tree[q])) |
p ≠ ε ⊦ restn(n + 1, p) = restn(n, p.tail)
⊦ p ⊑ q0 → restn(# p, q0 + q1) = restn(# p, q0) + q1
⊦ tree.dir? ↔ (∃ md, sdt. tree = dnode(md, sdt))
dnode(md0, sdt0)[p] = dnode(md, sdt), p ∈ dnode(md0, sdt0), q ∈ dnode(md0, sdt0)[p, dnode(md, sdt[str, tree0])] ⊦ dnode(md0, sdt0)[p, dnode(md, sdt[str, tree0])][q] = (p + str ' ⊑ q ⊃ tree0[restn(# p, q.tail)];(q ⊑ p ⊃ dnode(md0, sdt0)[q][restn(# q, p) + str ', tree0];dnode(md0, sdt0)[q]))
Used simplifier rules: one-restn: p ≠ ε ⊦ restn(n + 1, p) = restn(n, p.tail);%split-restn: ⊦ p ⊑ q0 → restn(# p, q0 + q1) = restn(# p, q0) + q1;%dnode-elim-strong: ⊦ tree.dir? ↔ (∃ md, sdt. tree = dnode(md, sdt));%c: ⊦ m + n = n + m; from specification nat-basic[directory-tree-inst]%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic[directory-tree-inst]%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ str ' ≠ ε; (s)% ⊦ p + p0 = ε ↔ p = ε ∧ p0 = ε; (as)% ⊦ p ⊑ ε ↔ p = ε; (s)