| gstore2[n] = groupblock(gndx0, lax, m), ax = ax0 + lax.to-adr(n), gndx = gndx0, ¬ jvalid, inv(gstore2 \ ginval), inv(groupblock(gndx0, lax, m)), n ∈ gstore2, ¬ n ∈ ginval ⊦ ⟪while ¬ jvalid ∧ gndx ≠ [] do {/* (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}}⟫ (ax = ax0 + prefixn(valid-group-nodes(gndx0), lax).to-adr(n)) |
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
Used simplifier rules: ⊦ 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)% ⊦ # lax.to-adr(n) = # lax; (s)% ⊦ #(gndx + gndx0) = # gndx + # gndx0; (s)%a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]% ⊦ prefixn(n, lax.to-adr(m)) = prefixn(n, lax).to-adr(m); (s)% ⊦ ax + ax0 = ax + ax1 ↔ ax0 = ax1; (s)% ⊦ lax0.to-adr(n) = lax1.to-adr(n) ↔ lax0 = lax1; (s)%a: ⊦ (ax + ax0) + ax1 = ax + ax0 + ax1; from specification list[address-list-set]% ⊦ [] + gndx = gndx; (s)% ⊦ # [] = 0; (s)% ⊦ n + 0 = n; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ valid-group-nodes([]) = 0; (s)% ⊦ prefixn(0, lax) = []; (s)% ⊦ prefixn(n, lax) = [] ↔ n = 0 ∨ lax = []; (ss)%fwd-inv-gblock-rem: ⊦ inv(gstore \ ginval) ∧ n ∈ gstore ∧ ¬ n ∈ ginval ∧ gstore[n] = gblock → inv(gblock); (forward) from specification apersistence-base% ⊦ inv(groupblock(gndx, lax, m0)) → (# gndx = # lax ↔ true); (ss)% ⊦ gndx = gndx + gndx0 ↔ gndx0 = []; (s)% ⊦ inv(groupblock(gndx, lax, m0)) → prefixn(# gndx, lax) = lax; (s) Used formulas: remove-nonend-inv(ax, ax0, lax.to-adr(n), gndx0, gndx, jvalid), (jvalid ⊃ 0;# gndx) = (jvalid ⊃ 0;# gndx)