| pstate = journal(nx.last), remove-refsize0(gstore0) = gstore0, remove-refsize0(istore1) = istore1, elems nx ∩ ginval2 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ ginval2, nx ≠ [], btree-inv(rp, adr, istore2, istore1, zh, ri, fi), inv(gstore \ ginval2), inv(gstore0), inv(istore2), inv(istore1), inv(gstore[nx.last]), nx.last ∈ gstore, istore1 ⊑ istore2, ¬ dups(nx) ⊦ ⟪apersistence_add_gnds#(adr, istore2, istore1, ginval2, gstore0, nx, maxino, ginval; gndx, ax, gstore, pstate, syn; err)⟫ ( inv(gstore \ ginval2) ∧ dom gstore0 ∪ elems nx = dom gstore ∪ ginval2 ∧ (pstate.journal? → pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore) ∧ (pstate.index? → pstate.lnum ∈ istore2) ∧ (pstate = unbuffered → syn)) |
inv-journal(nx, gstore, gstore0, ginval), inv-index(istore, istore0), inv-state(pstate, nx, gstore, istore, syn), pstate.journal? ∨ pstate = readonly ⊦ ⟪apersistence_add_gnds#(adr, istore, istore0, ginval, gstore0, nx, maxino, ginval0; gndx, ax, gstore, pstate, syn; 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)% ⊦ journal(m).journal?; (s)% ⊦ journal(m).lnum = m; (s)% ⊦ ¬ journal(m).index?; (s)% ⊦ unbuffered ≠ journal(m); (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)