| tree[p] = dnode(md, sdt), tree.dir?, p ∈ tree ⊦ q ∈ tree[p, dnode(md, sdt[str, tree0])] ↔ (p + str ' ⊑ q ⊃ restn(# p + 1, q) ∈ tree0;q ∈ tree) |
p ≠ ε ⊦ restn(n + 1, p) = restn(n, p.tail)
⊦ 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])] ↔ (p + str ' ⊑ q ⊃ restn(# p, q.tail) ∈ tree0;q ∈ dnode(md0, sdt0))
Used simplifier rules: one-restn: p ≠ ε ⊦ restn(n + 1, p) = restn(n, p.tail);%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)