| jvalid ↔ jvalid0, gstore2[n] = groupblock(gndx0, lax, m), ax1 = ax0 + lax.to-adr(n), gndx = gndx1, gndx2 = gndx0, ¬ jvalid, ¬ jvalid1, inv(groupblock(gndx0, lax, m)), inv(gstore2 \ ginval), remove-nonend-inv(ax, ax0, lax.to-adr(n), gndx0, gndx, jvalid), n ∈ gstore2 ⊦ ⟪/* (term-remove-nonend-blocks: invariant # gndx ≤ # ax ∧ inv(gstore2) wfbound (jvalid ⊃ 0;# gndx)) */; if gndx.last.end then jvalid := true else {ax := ax.butlast; gndx := gndx.butlast}⟫ (remove-nonend-inv(ax, ax0, lax.to-adr(n), gndx0, gndx, jvalid) ∧ (jvalid ⊃ 0;# gndx) < (jvalid0 ⊃ 0;# gndx1)), gndx = [], n ∈ ginval |
# lax = # gndx1 + # gndx, gstore2[n] = groupblock(gndx1 + gndx, lax, m), valid-group-nodes(gndx1) = valid-group-nodes(gndx1 + gndx), gndx1 ≠ [], inv(gstore2 \ ginval), inv(groupblock(gndx1 + gndx, lax, m)), n ∈ gstore2, ¬ n ∈ ginval ⊦ ⟪/* (term-remove-nonend-blocks : invariant # gndx1 ≤ #(ax0 + prefixn(# gndx1, lax).to-adr(n)) ∧ inv(gstore2) wfbound (false ⊃ 0;# gndx1)) */; jvalid := false; gndx2 := gndx1; ax := ax0 + prefixn(# gndx1, lax).to-adr(n); if gndx2.last.end then jvalid := true else {ax := ax.butlast; gndx2 := gndx2.butlast}⟫ ( (∃ gndx3. # lax = # gndx2 + # gndx3 ∧ gndx1 + gndx = gndx2 + gndx3 ∧ ax = ax0 + prefixn(# gndx2, lax).to-adr(n) ∧ valid-group-nodes(gndx2) = valid-group-nodes(gndx2 + gndx3) ∧ (jvalid → # gndx2 = valid-group-nodes(gndx2 + gndx3))) ∧ (jvalid ⊃ 0;# gndx2) < # gndx1)
Used simplifier rules: fwd-inv-gblock-rem: ⊦ inv(gstore \ ginval) ∧ n ∈ gstore ∧ ¬ n ∈ ginval ∧ gstore[n] = gblock → inv(gblock); (forward) from specification apersistence-base% ⊦ prefixn(n, lax.to-adr(m)) = prefixn(n, lax).to-adr(m); (s)%a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]% ⊦ #(gndx + gndx0) = # gndx + # gndx0; (s)% ⊦ # lax.to-adr(n) = # lax; (s)%⊦ remove-nonend-inv(log, log0, ax, gndx, gndx0, boolvar) ↔ (∃ gndx1. # ax = # gndx ∧ gndx = gndx0 + gndx1 ∧ log = log0 + prefixn(# gndx0, ax) ∧ valid-group-nodes(gndx0) = valid-group-nodes(gndx) ∧ (boolvar → # gndx0 = valid-group-nodes(gndx))); (s)