| str + p0 ⊑ q0, ∀ q0, q1. p0 ⊑ q0 → restn(# p0, q0 + q1) = restn(# p0, q0) + q1 ⊦ restn(#(str + p0), q0 + q1) = restn(#(str + p0), q0) + q1 |
p ≠ ε ⊦ restn(n + 1, p) = restn(n, p.tail)
str ' + p0 ⊑ q0, ∀ q0, q1. p0 ⊑ q0 → restn(# p0, q0 + q1) = restn(# p0, q0) + q1 ⊦ restn(# p0 + 1, q0 + q1) = restn(# p0, q0.tail) + q1
Used simplifier rules: one-restn: p ≠ ε ⊦ restn(n + 1, p) = restn(n, p.tail);%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]% ⊦ str ' ≠ ε; (s)% ⊦ p + p0 = ε ↔ p = ε ∧ p0 = ε; (as)% ⊦ p ⊑ ε ↔ p = ε; (s)%a: ⊦ (p + p0) + p1 = p + p0 + p1; from specification list[path]% ⊦ m +1 = m + 1; (s)% ⊦ #(str ' + p) = (# p)+1; (s)% ⊦ str + p = str ' + p; (s)