| # ax2 = # gndx2, # lax1 + # lax0 = # gndx0 + # gndx2 + 1, gstore2[lnum] = groupblock(gndx0 + mkgnode(nd, m0, boolvar, boolvar0) ' + gndx2, lax1 + lax0, m), inv(groupblock(gndx0 + mkgnode(nd, m0, boolvar, boolvar0) ' + gndx2, lax1 + lax0, m)), inv(gstore2 \ ginval), ri-cons(ri, nodes(gstore2 ↓, ginval)), ri[nd.key] ∈ lax0.to-adr(lnum), lnum ∈ gstore2, nd.key ∈ ri, ∃ lax2, lax1. lax0 = lax2 + lax1 ∧ ri[nd.key] ' = lax2.to-adr(lnum) ∧ ax2 = lax1.to-adr(lnum) ⊦ nd = nodes(gstore2 ↓, ginval)[ri[nd.key]], lnum ∈ ginval |
# gndx0 = # lax1, # lax = # gndx2, gstore2[ri[nd.key].lnum] = groupblock(gndx0 + mkgnode(nd, m0, boolvar, boolvar0) ' + gndx2, lax1 + @(ri[nd.key].pos, ri[nd.key].size) ' + lax, m), inv(groupblock(gndx0 + mkgnode(nd, m0, boolvar, boolvar0) ' + gndx2, lax1 + @(ri[nd.key].pos, ri[nd.key].size) ' + lax, m)), inv(gstore2 \ ginval), ri-cons(ri, nodes(gstore2 ↓, ginval)), nd.key ∈ ri, ri[nd.key].lnum ∈ gstore2, ri[nd.key] = @(ri[nd.key].lnum, ri[nd.key].pos, ri[nd.key].size) ∨ ri[nd.key] ∈ lax.to-adr(ri[nd.key].lnum) ⊦ nd = nodes(gstore2 ↓, ginval)[ri[nd.key]], ri[nd.key].lnum ∈ ginval
Used simplifier rules: lf-inv-append-sizes: ⊦ # gndx1 = # lax1 ∧ inv(groupblock(gndx0 + gndx1, lax0 + lax1, m)) → # gndx0 = # lax0;% ⊦ adr ∈ adr0 ' ↔ adr = adr0; (s)% ⊦ @(m, m0).size = m0; (s)% ⊦ @(m, m0).off = m; (s)% ⊦ ladr '.to-adr(n) = @(n, ladr.off, ladr.size) '; (s)%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ m + n = m + n0 ↔ n = n0; (s)% ⊦ # ladr ' = 0 +1; (s)% ⊦ # gnd ' = 0 +1; (s)% ⊦ #(gndx + gndx0) = # gndx + # gndx0; (s)%fwd-inv-gblock-rem: ⊦ inv(gstore \ ginval) ∧ n ∈ gstore ∧ ¬ n ∈ ginval ∧ gstore[n] = gblock → inv(gblock); (forward) from specification apersistence-base%a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]%a: ⊦ (ax + ax0) + ax1 = ax + ax0 + ax1; from specification list[address-list-set]% ⊦ adr ∈ ax + ax0 ↔ adr ∈ ax ∨ adr ∈ ax0; (s)% ⊦ (lax0 + lax1).to-adr(n) = lax0.to-adr(n) + lax1.to-adr(n); (s)% ⊦ # lax.to-adr(n) = # lax; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ #(lax + lax0) = # lax + # lax0; (s)% ⊦ adr ' = lax.to-adr(n) ↔ lax = @(adr.pos, adr.size) ' ∧ adr.lnum = n; (s)