| err = ESUCCESS, gstore0 = gstore2, log = [], nx0 = nx2, elems nx2 ∩ ginval = ∅, inv(gstore2 \ ginval), elems nx2 ⊆ dom gstore2 ⊦ ⟪while nx0 ≠ [] ∧ err = ESUCCESS do {/* (term-restore-log: invariant elems nx0 ⊆ dom gstore0 ∧ elems nx0 ∩ ginval = ∅ ∧ inv(gstore0) wfbound # nx0) */; gjournal_remove_nonend_blocks#(nx0.head, fi0, fi, ginval, gstore0, gstore, nx, pmaxino, p_os, jvalid; log; err); nx0 := nx0.tail}⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → log = abs-log(nx2, gstore2 ↓))) |
err = ESUCCESS, err0 = ESUCCESS, gstore0 = gstore2, log0 = [], nx0 = nx1, nx3 = nx2, elems nx2 ∩ ginval = ∅, inv(gstore2 \ ginval), restore-log-inv(nx2, nx0, gstore2, ginval, log, err), elems nx2 ⊆ dom gstore2 ⊦ ⟪/* (term-restore-log: invariant elems nx0 ⊆ dom gstore0 ∧ elems nx0 ∩ ginval = ∅ ∧ inv(gstore0) wfbound # nx0) */; gjournal_remove_nonend_blocks#(nx0.head, fi0, fi, ginval, gstore0, gstore, nx, pmaxino, p_os, jvalid; log; err); nx0 := nx0.tail⟫ (restore-log-inv(nx2, nx0, gstore2, ginval, log, err) ∧ # nx0 < # nx1), nx0 = []
Used simplifier rules: ⊦ restore-log-inv(nx, nx1, gstore, ginval, log, err) ↔ (∃ nx0. nx = nx0 + nx1 ∧ inv(gstore \ ginval) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → log = abs-log(nx0, gstore ↓) ∧ elems nx ⊆ dom gstore ∧ elems nx ∩ ginval = ∅)); (s)% ⊦ nx + [] = nx; (s)%a: ⊦ (nx + nx0) + nx1 = nx + nx0 + nx1; from specification list[nat-list-set]% ⊦ nx = nx0 + nx ↔ nx0 = []; (s)% ⊦ abs-log([], gstore) = []; (s) Used formulas: restore-log-inv(nx2, nx0, gstore2, ginval, log, err), # nx0 = # nx0