| # lpt0 = # lpt, # avol0 = # lpt, n = # lpt0, dom istore ∩ elems nx = ∅, abs-istore(avol0, lpt, istore), flash-lpt-cons(lpt0, istore0, gstore0), synced(avol0), avol1 ↓ avol0, istore0 ⊑ istore ⊦ abs-istore(avol1, replay-lpt(replay-log(lpt0, nx), nx, n), remove-refsize0(crash(istore, istore0))) |
# avol0 = # lpt, # lpt0 = # lpt, dom istore ∩ elems nx = ∅, flash-lpt-cons(lpt0, istore0, gstore0), synced(avol0), avol1 ↓ avol0, istore0 ⊑ istore, ∀ n. (n < # lpt ∧ lpt[n].flags = LP_INDEX_NODES ↔ n ∈ istore) ∧ (n ∈ istore → abs-leb(avol0[n], istore[n], lpt[n]) ∧ lpt[n].ref-size = istore[n].ref-size) ⊦ ( n < # lpt ∧ replay-lpt(lpt0.mapIndices(elems nx, λ lp. mklp(lp.ref-size, LEB_SIZE, LP_GROUP_NODES, lp.gcheapidx)), nx, # lpt)[n].flags = LP_INDEX_NODES ↔ n ∈ remove-refsize0(crash(istore, istore0))) ∧ ( n ∈ remove-refsize0(crash(istore, istore0)) → abs-leb (avol1[n], remove-refsize0(crash(istore, istore0))[n], replay-lpt(lpt0.mapIndices(elems nx, λ lp. mklp(lp.ref-size, LEB_SIZE, LP_GROUP_NODES, lp.gcheapidx)), nx, # lpt)[n]) ∧ replay-lpt(lpt0.mapIndices(elems nx, λ lp. mklp(lp.ref-size, LEB_SIZE, LP_GROUP_NODES, lp.gcheapidx)), nx, # lpt)[n].ref-size = remove-refsize0(crash(istore, istore0))[n].ref-size)
Used simplifier rules: abs-istore-def: ⊦ abs-istore(avol, lpt, istore) ↔ (∀ n. (n < # lpt ∧ lpt[n].flags = LP_INDEX_NODES ↔ n ∈ istore) ∧ ( n ∈ istore → abs-leb(avol[n], istore[n], lpt[n]) ∧ lpt[n].ref-size = istore[n].ref-size));%replay-log: ⊦ replay-log(lpt, nx) = lpt .mapIndices (elems nx, λ lp. mklp(lp.ref-size, LEB_SIZE, LP_GROUP_NODES, lp.gcheapidx) );%replay-lpt-size: n ≤ # lpt ⊦ # replay-lpt(lpt, nx, n) = # lpt;% ⊦ ¬ n < n; (s)% ⊦ m < n → n ≠ 0; (s)%lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic%lf-02: ⊦ m < n ∧ m = n0 → n0 < n; (forward) from specification nat-basic%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ m ≤ n ↔ ¬ n < m; (ss)% ⊦ # lpt.mapIndices(ns, lptfun) = # lpt; (s)