| adr = adr0, ginval = ginval0, ginval1 = ginval2, gstore = crash(gstore0, gstore1, ginval0, nx), gstore2 = gstore1, istore = remove-refsize0(crash(istore0, istore1)), istore2 = istore1, maxino = maxino0, nx0 = nx, syn, btree-inv(rp, adr0, istore0, istore1, zh, ri, fi), inv-index(istore0, istore1), inv-journal(nx, gstore0, gstore1, ginval0), inv-state(pstate, nx, gstore0, istore0, syn) ⊦ ⟪btree_recover#(; maxino1, nx1, ginval3, adr1, adr, istore, istore2, ginval, gstore, gstore2, nx0, maxino, ginval1, pstate0, syn0; rp0, err)⟫ ( err = ESUCCESS → syn0 ∧ (∃ ri, fi. btree-inv(rp0, adr, istore, istore2, zh0, ri, fi)) ∧ inv-journal(nx0, gstore, gstore2, ginval) ∧ inv-index(istore, istore2) ∧ inv-state(pstate0, nx0, gstore, istore, syn0)) |
gstore = crash(gstore0, gstore1, ginval0, nx), istore = remove-refsize0(crash(istore0, istore1)), remove-refsize0(gstore1) = gstore1, remove-refsize0(istore1) = istore1, elems nx ∩ ginval0 = ∅, dom gstore1 ∪ elems nx = dom gstore0 ∪ ginval0, btree-inv(rp, adr0, istore0, istore1, zh, ri, fi), inv(gstore0 \ ginval0), inv(gstore1), inv(istore0), inv(istore1), istore1 ⊑ istore0, ¬ dups(nx), pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore0, pstate.index? → pstate.lnum ∈ istore0 ⊦ ⟪btree_recover#(; maxino1, nx1, ginval3, adr1, adr0, istore, istore1, ginval0, gstore, gstore1, nx, maxino, ginval1, pstate0, syn0; rp0, err)⟫ ( err = ESUCCESS → syn0 ∧ (∃ ri, fi. btree-inv(rp0, adr0, istore, istore1, zh0, ri, fi)) ∧ inv(gstore \ ginval0) ∧ inv(gstore1) ∧ elems nx ∩ ginval0 = ∅ ∧ ¬ dups(nx) ∧ dom gstore1 ∪ elems nx = dom gstore ∪ ginval0 ∧ remove-refsize0(gstore1) = gstore1 ∧ inv(istore) ∧ inv(istore1) ∧ istore1 ⊑ istore ∧ remove-refsize0(istore1) = istore1 ∧ (pstate0.journal? → nx ≠ [] ∧ pstate0.lnum = nx.last ∧ pstate0.lnum ∈ gstore) ∧ (pstate0.index? → pstate0.lnum ∈ istore))
Used simplifier rules: ⊦ inv-index(istore, istore0) ↔ inv(istore) ∧ inv(istore0) ∧ istore0 ⊑ istore ∧ remove-refsize0(istore0) = istore0; (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-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)