| log0 = nx, lpt0 = lpt, m = LEB_SIZE, nx0 = nx, valid-indices(lpt, nx) ⊦ ⟪while log0 ≠ [] do {/* (prepost-replay-log : invariant ∃ log. log0` = log + log0 ∧ lpt = replay-log(lpt`, log) ∧ valid-indices(lpt, log0`) ∧ ¬ dups(log0`) wfbound # log0) */; let n = log0.head in {lpt[n].flags := LP_GROUP_NODES; lpt[n].size := m; log0 := log0.tail}}⟫ (lpt = replay-log(lpt0, nx0)), dups(nx) |
log2 = nx, lpt0 = lpt1, m = LEB_SIZE, nx0 = nx, valid-indices(lpt1, nx), ∃ log. (log2 = log + log0 ∧ lpt = replay-log(lpt1, log) ∧ valid-indices(lpt, log2) ∧ ¬ dups(log2)) ∧ log0 = log1 ⊦ ⟪let n = log0.head in {lpt[n].flags := LP_GROUP_NODES; lpt[n].size := m; log0 := log0.tail}⟫ ∃ log. (log2 = log + log0 ∧ lpt = replay-log(lpt1, log) ∧ valid-indices(lpt, log2) ∧ ¬ dups(log2)) ∧ # log0 < # log1, log0 = [], dups(nx)
Used simplifier rules: ⊦ nx + [] = nx; (s)%a: ⊦ (nx + nx0) + nx1 = nx + nx0 + nx1; from specification list[nat-list-set]% ⊦ nx = nx0 + nx ↔ nx0 = []; (s)% ⊦ replay-log(lpt, []) = lpt; (s) Used formulas: ∃ log. log0` = log + log0 ∧ lpt = replay-log(lpt`, log) ∧ valid-indices(lpt, log0`) ∧ ¬ dups(log0`), # log0 = # log0