| syn ↔ syn0, adr = adr2, adr0 = adr1, ginval = ginval2, ginval1 = ginval3, gstore = gstore1, gstore0 = gstore3, gstore3 = crash(gstore2, gstore1, ginval0, nx), istore = istore1, istore0 = istore3, istore3 = remove-refsize0(crash(istore2, istore1)), maxino0 = maxino1, nx0 = nx1, pstate = pstate0, remove-refsize0(istore1) = istore1, remove-refsize0(gstore1) = gstore1, elems nx ∩ ginval0 = ∅, dom gstore1 ∪ elems nx = dom gstore2 ∪ ginval0, btree-inv(rp, adr2, istore2, istore1, zh, ri, fi), inv(istore1), inv(istore2), inv(gstore1), inv(gstore2 \ ginval0), istore1 ⊑ istore2, pstate1.index? → pstate1.lnum ∈ istore2, pstate1.journal? → nx ≠ [] ∧ pstate1.lnum = nx.last ∧ pstate1.lnum ∈ gstore2 ⊦ ⟪apersistence_recover#(; adr0, maxino0, nx0, ginval1, adr, nx, maxino, ginval, istore0, istore, ginval0, gstore0, gstore; pstate, syn, err); rp := null⟫ ( err = ESUCCESS → syn ∧ (∃ ri, fi. btree-inv(rp, adr, istore0, istore, zh0, ri, fi)) ∧ inv(gstore0 \ ginval0) ∧ inv(gstore) ∧ elems nx ∩ ginval0 = ∅ ∧ ¬ dups(nx) ∧ dom gstore ∪ elems nx = dom gstore0 ∪ ginval0 ∧ remove-refsize0(gstore) = gstore ∧ inv(istore0) ∧ inv(istore) ∧ istore ⊑ istore0 ∧ remove-refsize0(istore) = istore ∧ (pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore0) ∧ (pstate.index? → pstate.lnum ∈ istore0)), dups(nx) |
adr = adr0, istore = remove-refsize0(crash(istore0, istore1)), istore2 = istore1, ginval = ginval0, gstore = crash(gstore0, gstore1, ginval0, nx), gstore2 = gstore1, nx0 = nx, maxino = maxino0, ginval1 = ginval2, syn, inv-journal(nx, gstore0, gstore1, ginval0), inv-index(istore0, istore1), inv-state(pstate, nx, gstore0, istore0, syn) ⊦ ⟪apersistence_recover#(; adr1, maxino1, nx1, ginval3, adr, nx0, maxino, ginval1, istore, istore2, ginval, gstore, gstore2; pstate0, syn0, err)⟫ (err = ESUCCESS → syn0 ∧ inv-journal(nx0, gstore, gstore2, ginval) ∧ inv-index(istore, istore2) ∧ inv-state(pstate0, nx0, gstore, istore, syn0))
syn ↔ syn0, syn1 ↔ true, adr = adr2, adr0 = adr1, adr3 = adr2, ginval = ginval2, ginval0 = ginval0, ginval1 = ginval3, ginval4 = ginval0, ginval5 = ginval2, gstore = gstore1, gstore0 = gstore3, gstore0 = crash(gstore2, gstore1, ginval0, nx), gstore3 = crash(gstore2, gstore1, ginval0, nx), gstore4 = gstore2, gstore5 = gstore1, istore = istore1, istore0 = istore3, istore0 = remove-refsize0(crash(istore2, istore1)), istore3 = remove-refsize0(crash(istore2, istore1)), istore4 = istore2, istore5 = istore1, maxino = maxino, maxino0 = maxino1, maxino2 = maxino, nx = nx, nx0 = nx1, nx2 = nx, pstate = pstate0, pstate2 = pstate1, remove-refsize0(gstore1) = gstore1, remove-refsize0(istore1) = istore1, elems nx ∩ ginval0 = ∅, dom gstore1 ∪ elems nx = dom gstore2 ∪ ginval0, btree-inv(rp, adr2, istore2, istore1, zh, ri, fi), inv(gstore2 \ ginval0), inv(gstore1), inv(istore2), inv(istore1), inv-index(istore2, istore1), inv-journal(nx, gstore2, gstore1, ginval0), inv-state(pstate1, nx, gstore2, istore2, true), istore1 ⊑ istore2, pstate1.journal? → nx ≠ [] ∧ pstate1.lnum = nx.last ∧ pstate1.lnum ∈ gstore2, pstate1.index? → pstate1.lnum ∈ istore2 ⊦ [apersistence_recover#(; adr0, maxino0, nx0, ginval1, adr, nx, maxino, ginval, istore0, istore, ginval0, gstore0, gstore; pstate, syn, err)] ( (err = ESUCCESS → syn ∧ inv-journal(nx, gstore0, gstore, ginval0) ∧ inv-index(istore0, istore) ∧ inv-state(pstate, nx, gstore0, istore0, syn)) → ⟪rp := null⟫ ( err = ESUCCESS → syn ∧ (∃ ri, fi. btree-inv(rp, adr, istore0, istore, zh0, ri, fi)) ∧ inv(gstore0 \ ginval0) ∧ inv(gstore) ∧ elems nx ∩ ginval0 = ∅ ∧ ¬ dups(nx) ∧ dom gstore ∪ elems nx = dom gstore0 ∪ ginval0 ∧ remove-refsize0(gstore) = gstore ∧ inv(istore0) ∧ inv(istore) ∧ istore ⊑ istore0 ∧ remove-refsize0(istore) = istore ∧ (pstate.journal? → nx ≠ [] ∧ pstate.lnum = nx.last ∧ pstate.lnum ∈ gstore0) ∧ (pstate.index? → pstate.lnum ∈ istore0))), dups(nx)
Used simplifier rules: ⊦ 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)%⊦ 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)