| # gndx0 = # lax0, # gndx1 = # lax1, gstore[n].gndlist = gndx0, gstore[n].ladrlist = lax0, transaction(ndx, gndx1), n ∈ gstore ⊦ dups(lax0 + lax1), nodes-cons(lax1.to-adr(n), ndx, gstore[n, groupblock(gndx0 + gndx1, lax0 + lax1, m)], ginval), n ∈ ginval |
# ndx = # lax1, # gstore[n].gndlist = # gstore[n].ladrlist, # gndx1 = # lax1, n ∈ gstore, ∀ n. n < # lax1 → gndx1[n].nd = ndx[n], gndx1 = [] ∨ gndx1.head.start ∧ gndx1.last.end ∧ (∀ n0. (n0 ≠ 0 ∧ n0 < # lax1 → ¬ gndx1[n0].start) ∧ (n0 + 1 < # lax1 → ¬ gndx1[n0].end)) ⊦ dups(gstore[n].ladrlist + lax1), dups(gstore[n].ladrlist), dups(lax1), nodes-cons(lax1.to-adr(n), ndx, gstore[n, groupblock(gstore[n].gndlist + gndx1, gstore[n].ladrlist + lax1, m)], ginval), n ∈ ginval
Used simplifier rules: transaction: ⊦ transaction(ndx, gndx) ↔ # gndx = # ndx ∧ ( gndx = [] ∨ gndx.head.start ∧ gndx.last.end ∧ (∀ n. (0 < n ∧ n < # gndx → ¬ gndx[n].start) ∧ (n + 1 < # gndx → ¬ gndx[n].end))) ∧ (∀ n. n < # gndx → gndx[n].nd = ndx[n]);%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]%a: ⊦ ¬ dups(lax + lax0) → ¬ dups(lax) ∧ ¬ dups(lax0); (forward) from specification list-dup[laddress-list]% ⊦ 0 < m ↔ m ≠ 0; (s)