| gstore[n] = groupblock(gndx, lax, m), ax = ax0, inv(gstore \ ginval), inv(groupblock(gndx, lax, m)), n ∈ gstore, ¬ n ∈ ginval ⊦ ⟪gjournal_remove_nonend_blocks#(n, ri, fi, ginval, gstore, gstore0, nx0, maxino, ns, boolvar0; ax; err)⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → ax = ax0 + prefixn(valid-group-nodes(gndx), lax).to-adr(n))) |
jvalid0 ↔ boolvar0, gstore2[n] = groupblock(gndx, lax, m), ax = ax0, fi0 = ri, gstore = gstore1, gstore0 = gstore2, jro = ginval, lnum = n, log = ax, nx = nx0, p_os = ns, pmaxino = maxino, inv(groupblock(gndx, lax, m)), inv(gstore2 \ ginval), n ∈ gstore2 ⊦ ⟪let gndx = [], jvalid = false in {index_read_gblock_nodes#(lnum, fi0, fi, jro, gstore0, gstore, nx, pmaxino, p_os, jvalid0; log, gndx; err); if err = ESUCCESS then while ¬ jvalid ∧ gndx ≠ [] do {/* (term-remove-nonend-blocks: invariant # gndx ≤ # log ∧ inv(gstore0) wfbound (jvalid ⊃ 0;# gndx)) */; if gndx.last.end then jvalid := true else {log := log.butlast; gndx := gndx.butlast}}}⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → log = ax0 + prefixn(valid-group-nodes(gndx), lax).to-adr(n))), n ∈ ginval
Used simplifier rules: gjournal_remove_nonend_blocks# (LNUM, PRI, PFI, PINVAL, PSTORE, PSTORE0, PNL, PMAXINO, P_OS, ISYNCED ; LOG ; ERR ) {let GNDLIST = [], DONE = false in {index_read_gblock_nodes# (LNUM, PRI, PFI, PINVAL, PSTORE, PSTORE0, PNL, PMAXINO, P_OS, ISYNCED ; LOG, GNDLIST ; ERR); if ERR = ESUCCESS then while ¬ DONE ∧ GNDLIST ≠ [] do {/* (term-remove-nonend-blocks : invariant # GNDLIST ≤ # LOG ∧ inv(PSTORE) wfbound (DONE ⊃ 0;# GNDLIST)) */; if GNDLIST.last.end then DONE := true else {LOG := LOG.butlast; GNDLIST := GNDLIST.butlast}}} };