| jvalid0 ↔ true, gndx = [], jmaxino = 0, jmaxino0 = jmaxino1, ndx0 = ndx ⊦ ⟪while ndx0 ≠ [] do {/* (inv-transaction : invariant ∃ ndx. ndx0` = ndx + ndx0 ∧ (ndx0 = [] → transaction(ndx0`, gndx)) ∧ (ndx0 ≠ [] → transaction-prefix(ndx0`, gndx) ∧ # gndx = # ndx) ∧ jmaxino = gndx.flashsize ∧ (jvalid0 ↔ ndx = []) wfbound # ndx0) */; let jvalid = # ndx0 = 1 in let gnd = mkgnode(ndx0.head, jmaxino0 + # gndx, jvalid0, jvalid) in {gndx := gndx + gnd; jmaxino := jmaxino + gnd.flashsize; ndx0 := ndx0.tail; jvalid0 := false}}⟫ (transaction(ndx, gndx) ∧ jmaxino = gndx.flashsize) |
jvalid ↔ true, gndx0 = [], jmaxino0 = jmaxino1, jmaxino2 = 0, ndx2 = ndx, ∃ ndx. ( ndx2 = ndx + ndx0 ∧ (ndx0 = [] → transaction(ndx2, gndx)) ∧ (ndx0 ≠ [] → transaction-prefix(ndx2, gndx) ∧ # gndx = # ndx) ∧ jmaxino = gndx.flashsize ∧ (jvalid0 ↔ ndx = [])) ∧ ndx0 = ndx1 ⊦ ⟪let jvalid = # ndx0 = 1 in let gnd = mkgnode(ndx0.head, jmaxino0 + # gndx, jvalid0, jvalid) in {gndx := gndx + gnd; jmaxino := jmaxino + gnd.flashsize; ndx0 := ndx0.tail; jvalid0 := false}⟫ ∃ ndx. ( ndx2 = ndx + ndx0 ∧ (ndx0 = [] → transaction(ndx2, gndx)) ∧ (ndx0 ≠ [] → transaction-prefix(ndx2, gndx) ∧ # gndx = # ndx) ∧ jmaxino = gndx.flashsize ∧ (jvalid0 ↔ ndx = [])) ∧ # ndx0 < # ndx1, ndx0 = []
Used simplifier rules: ⊦ ndx + [] = ndx; (s)%a: ⊦ (ndx + ndx0) + ndx1 = ndx + ndx0 + ndx1; from specification list[node-list]% ⊦ ndx = ndx0 + ndx ↔ ndx0 = []; (s)% ⊦ transaction([], gndx) ↔ gndx = []; (s)% ⊦ transaction-prefix(ndx, []) ↔ ndx ≠ []; (s)% ⊦ # [] = 0; (s)% ⊦ # [] = 0; (s)% ⊦ [].flashsize = 0; (s) Used formulas: ∃ ndx. ndx0` = ndx + ndx0 ∧ (ndx0 = [] → transaction(ndx0`, gndx)) ∧ (ndx0 ≠ [] → transaction-prefix(ndx0`, gndx) ∧ # gndx = # ndx) ∧ jmaxino = gndx.flashsize ∧ (jvalid0 ↔ ndx = []), # ndx0 = # ndx0