| # lpt = # avol, avol0 = avol, lpt0 = lpt, awbuf-inv(avol, nobuffer), synced(avol) ⊦ ⟪persistence_replay_lpt#(nx, LEB_SIZE, adr, m0, log0, lpt1, ns, nobuffer, boolvar; lpt, avol)⟫ (lpt = replay-lpt(lpt0, nx, # lpt0) ∧ awbuf-inv(avol, nobuffer) ∧ avol-replay-lpt-unchanged(avol0, avol, lpt0, nx)) |
# lpt = # avol, isbuf ↔ boolvar, avol0 = avol, bleb = nobuffer, log = log1, log0 = nx, lpt0 = lpt1, lpt2 = lpt, m = m1, m0 = LEB_SIZE, awbuf-inv(avol, nobuffer), synced(avol) ⊦ ⟪let n = 0 in while n < # lpt do {/* (prepost-replay-lpt : invariant n ≤ # lpt` ∧ awbuf-inv(avol, bleb) ∧ bleb = nobuffer ∧ lpt = replay-lpt(lpt`, log0, n) ∧ # lpt` = # avol` ∧ avol-replay-lpt-unchanged(avol`, avol, lpt`, log0) ∧ synced(avol) wfbound # lpt - n) */; if lpt[n].flags ≠ LP_FREE ∧ ¬ n ∈ log0 then {if lpt[n].flags = LP_INDEX_NODES then lpt[n].size := m0; if lpt[n].ref-size = 0 then {lpt[n].flags := LP_FREE; lpt[n].size := 0; awbuf_unmap#(n, adr, m, log, lpt0, ns, bleb, isbuf; avol)}}; n := n + 1}⟫ (lpt = replay-lpt(lpt2, nx, # lpt2) ∧ awbuf-inv(avol, nobuffer) ∧ avol-replay-lpt-unchanged(avol0, avol, lpt2, nx))
Used simplifier rules: replay-lpt: ⊦ ;