| log2 = nx, lpt0 = lpt1, m = LEB_SIZE, n = log0.head, nx0 = nx, n < # lpt, n < # lpt[n, lpt[n].flags:= LP_GROUP_NODES], valid-indices(lpt1, nx), ∃ log. (log2 = log + log0 ∧ lpt = replay-log(lpt1, log) ∧ valid-indices(lpt, log2) ∧ ¬ dups(log2)) ∧ log0 = log1 ⊦ log0 = [], dups(nx), ∃ log. ( log2 = log + log0.tail ∧ lpt[n, lpt[n].flags:= LP_GROUP_NODES][n, lpt[n, lpt[n].flags:= LP_GROUP_NODES][n].size:= m] = replay-log(lpt1, log) ∧ valid-indices(lpt[n, lpt[n].flags:= LP_GROUP_NODES][n, lpt[n, lpt[n].flags:= LP_GROUP_NODES][n].size:= m], log2) ∧ ¬ dups(log2)) ∧ # log0.tail < # log1 |
log1.head < # lpt1, valid-indices(lpt1, log1), valid-indices(lpt1, log), valid-indices(replay-log(lpt1, log), log1), valid-indices(replay-log(lpt1, log), log) ⊦ log1 = [], dups(log1), dups(log), dups(log + log1), ∃ log0. log + log1 = log0 + log1.tail ∧ replay-log(lpt1, log) [log1.head, mklp(replay-log(lpt1, log)[log1.head].ref-size, LEB_SIZE, LP_GROUP_NODES, replay-log(lpt1, log)[log1.head].gcheapidx) ] = replay-log(lpt1, log0)
Used simplifier rules: elim-lp-upd-size: ⊦ lp.size:= n = mklp(lp.ref-size, n, lp.flags, lp.gcheapidx);% ⊦ m < n → n ≠ 0; (s)%a: ⊦ ¬ dups(nx + nx0) → ¬ dups(nx) ∧ ¬ dups(nx0); (forward) from specification list-dup[nat-list-set]%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ ¬ n < n; (s)% ⊦ m < n + 1 ↔ ¬ n < m; (s)%n0 ≤ n ⊦ n - n0 < m ↔ n < m + n0; (s)% ⊦ # nx = 0 ↔ nx = []; (s)% ⊦ m < 1 ↔ m = 0; (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)% ⊦ n -1 = n - 1; (s)% ⊦ nx ≠ [] → # nx.tail = (# nx)-1; (s)% ⊦ valid-indices(lpt[n, lp], nx) ↔ valid-indices(lpt, nx); (s)%m < # lpt ⊦ lpt[m, lp][m, lp0] = lpt[m, lp0]; (s)% ⊦ (lp.flags:= lpf).gcheapidx = lp.gcheapidx; (s)% ⊦ (lp.flags:= lpf).flags = lpf; (s)% ⊦ (lp.flags:= lpf).ref-size = lp.ref-size; (s)%m < # lpt ⊦ lpt[m, lp][m] = lp; (s)% ⊦ m < n → (n ≤ m ↔ false); (s)% ⊦ m < n ↔ ¬ n ≤ m; (ss)% ⊦ # replay-log(lpt, nx) = # lpt; (s)% ⊦ # lpt[n, lp] = # lpt; (s)%a: ⊦ (nx + nx0) + nx1 = nx + nx0 + nx1; from specification list[nat-list-set]%⊦ valid-indices(lpt, nx0 + nx1) ↔ valid-indices(lpt, nx0) ∧ valid-indices(lpt, nx1); (ws)