| # lax = # gndx2, # gndx0 = # lax1, gstore2[m1] = groupblock(gndx0 + mkgnode(nd, m0, boolvar, boolvar0) ' + gndx2, lax1 + @(m2, m3) ' + lax, m), ri[nd.key] = @(m1, m2, m3), inv(gstore2 \ ginval), inv(groupblock(gndx0 + mkgnode(nd, m0, boolvar, boolvar0) ' + gndx2, lax1 + @(m2, m3) ' + lax, m)), ri-cons(ri, nodes(gstore2 ↓, ginval)), m1 ∈ gstore2, nd.key ∈ ri, ri[nd.key] = @(m1, m2, m3) ∨ ri[nd.key] ∈ lax.to-adr(m1) ⊦ nd = nodes(gstore2 ↓, ginval)[ri[nd.key]], m1 ∈ ginval |
# lax = # gndx2, # gndx0 = # lax1, gstore2[m1] = groupblock(gndx0 + mkgnode(nd, m0, boolvar, boolvar0) ' + gndx2, lax1 + @(m2, m3) ' + lax, m), ri[nd.key] = @(m1, m2, m3), inv(groupblock(gndx0 + mkgnode(nd, m0, boolvar, boolvar0) ' + gndx2, lax1 + @(m2, m3) ' + lax, m)), inv(gstore2 \ ginval), ri-cons(ri, nodes(gstore2 ↓, ginval)), m1 ∈ gstore2, nd.key ∈ ri ⊦ nd = nodes(gstore2 ↓, ginval)[@(m1, m2, m3)], m1 ∈ ginval
Used simplifier rules: lf-inv-append-sizes: ⊦ # gndx1 = # lax1 ∧ inv(groupblock(gndx0 + gndx1, lax0 + lax1, m)) → # gndx0 = # lax0;%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)% ⊦ # ladr ' = 0 +1; (s)% ⊦ #(lax + lax0) = # lax + # lax0; (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: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]%a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]