| # lax = # gndx1 + # gndx, # gndx1 = m0 + 1, gstore2[n] = groupblock(gndx1 + gndx, lax, m), valid-group-nodes(gndx1) = valid-group-nodes(gndx1 + gndx), inv(groupblock(gndx1 + gndx, lax, m)), inv(gstore2 \ ginval), n ∈ gstore2 ⊦ # gndx1 = 0, ax0 + prefixn(# gndx1, lax).to-adr(n) = [], gndx1 = [], gndx1.last.end, n ∈ ginval, ∃ gndx0. # gndx1 + # gndx0 = 1 + # lax ∧ gndx1 + gndx = gndx1.butlast + gndx0 ∧ (ax0 + prefixn(# gndx1, lax).to-adr(n)).butlast = ax0 + prefixn(m0, lax).to-adr(n) ∧ valid-group-nodes(gndx1.butlast) = valid-group-nodes(gndx1.butlast + gndx0) |
# lax = (m0 + 1) + # gndx, # gndx1 = m0 + 1, gstore2[n] = groupblock(gndx1 + gndx, lax, m), valid-group-nodes(gndx1) = valid-group-nodes(gndx1 + gndx), inv(groupblock(gndx1 + gndx, lax, m)), inv(gstore2 \ ginval), n ∈ gstore2 ⊦ ax0 + prefixn(m0 + 1, lax).to-adr(n) = [], gndx1 = [], gndx1.last.end, n ∈ ginval, ∃ 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)
Used simplifier rules: 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)% ⊦ # gndx = 0 ↔ gndx = []; (s)