| # gndx1 = m0 + 1, # lax = (m0 + 1) + # gndx, gndx1.last = mkgnode(nd, m1, boolvar, false), gstore2[n] = groupblock(gndx1 + gndx, lax, m), valid-group-nodes(gndx1) = valid-group-nodes(gndx1 + gndx), inv(gstore2 \ ginval), inv(groupblock(gndx1 + gndx, lax, m)), n ∈ gstore2 ⊦ ax0 + prefixn(m0 + 1, lax).to-adr(n) = [], n ∈ ginval, ∀ gndx0, gnd. gndx1 ≠ gndx0 + gnd ', ∃ gndx0. m0 + # gndx0 = # lax ∧ gndx1 + gndx = gndx1.butlast + gndx0 ∧ (ax0 + prefixn(m0 + 1, lax).to-adr(n)).butlast = ax0 + prefixn(m0, lax).to-adr(n) ∧ valid-group-nodes(gndx1.butlast) = valid-group-nodes(gndx1.butlast + gndx0) |
# lax = (# gndx0 + 1) + # gndx, gstore2[n] = groupblock((gndx0 + mkgnode(nd, m1, boolvar, false) ') + gndx, lax, m), valid-group-nodes(gndx0) = valid-group-nodes((gndx0 + mkgnode(nd, m1, boolvar, false) ') + gndx), inv(gstore2 \ ginval), inv(groupblock((gndx0 + mkgnode(nd, m1, boolvar, false) ') + gndx, lax, m)), n ∈ gstore2 ⊦ ax0 + prefixn(# gndx0 + 1, lax).to-adr(n) = [], (ax0 + prefixn(# gndx0 + 1, lax).to-adr(n)).butlast = ax0 + prefixn(# gndx0, lax).to-adr(n), n ∈ ginval
Used simplifier rules: ⊦ mkgnode(nd, m, boolvar, boolvar0).end ↔ boolvar0; (s)%fwd-inv-gblock-rem: ⊦ inv(gstore \ ginval) ∧ n ∈ gstore ∧ ¬ n ∈ ginval ∧ gstore[n] = gblock → inv(gblock); (forward) from specification apersistence-base% ⊦ m +1 = m + 1; (s)% ⊦ #(gnd ' + gndx) = (# gndx)+1; (s)% ⊦ gndx + gndx0 = gndx + gndx1 ↔ gndx0 = gndx1; (s)% ⊦ (gndx + gnd ').butlast = gndx; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + n = m + n0 ↔ n = n0; (s)% ⊦ # gnd ' = 0 +1; (s)% ⊦ #(gndx + gndx0) = # gndx + # gndx0; (s)% ⊦ (gndx + gnd ').last = gnd; (s)%a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]%⊦ valid-group-nodes(gndx + gnd ') = (gnd.end ⊃ # gndx + 1;valid-group-nodes(gndx)); (s)