| remove-refsize0(istore1) = istore1, remove-refsize0(gstore0) = gstore0, elems nx ∩ ginval = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ ginval, btree-inv(rp, adr, istore2, istore1, zh, ri, fi), inv(istore1), inv(istore2), inv(gstore0), inv(gstore \ ginval), istore1 ⊑ istore2, ¬ dups(nx), pstate.index? → pstate.lnum ∈ istore2, pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore ⊦ ⟪apersistence_allocate_gnd#(adr, istore2, istore1, gstore0, maxino, ginval0, true; ginval, gstore, nx, pstate; err)⟫ ( inv(gstore \ ginval) ∧ elems nx ∩ ginval = ∅ ∧ ¬ dups(nx) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ ginval ∧ (pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore) ∧ (pstate.index? → pstate.lnum ∈ istore2)) |
inv-journal(nx, gstore, gstore0, ginval), inv-index(istore, istore0), inv-state(pstate, nx, gstore, istore, syn), syn ⊦ ⟪apersistence_allocate_gnd#(adr, istore, istore0, gstore0, maxino, ginval0, syn; ginval, gstore, nx, pstate; err)⟫ (inv-journal(nx, gstore, gstore0, ginval) ∧ inv-state(pstate, nx, gstore, istore, syn))
Used simplifier rules: ⊦ inv-state(pstate, nx, gstore, istore, syn) ↔ ( pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore) ∧ (pstate.index? → pstate.lnum ∈ istore) ∧ (pstate = unbuffered → syn); (s)%⊦ inv-journal(nx, gstore, gstore0, ginval) ↔ inv(gstore \ ginval) ∧ inv(gstore0) ∧ elems nx ∩ ginval = ∅ ∧ ¬ dups(nx) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ ginval ∧ remove-refsize0(gstore0) = gstore0; (s)%⊦ inv-index(istore, istore0) ↔ inv(istore) ∧ inv(istore0) ∧ istore0 ⊑ istore ∧ remove-refsize0(istore0) = istore0; (s)