| 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, inv-index(istore0, istore1), inv-journal(nx, gstore0, gstore1, ginval0), 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)) |
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, 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 ⊦ ⟪apersistence_recover#(; adr1, maxino1, nx1, ginval3, adr, nx, maxino, ginval1, istore, istore1, ginval0, gstore, gstore1; pstate0, syn0, err)⟫ ( err = ESUCCESS → syn0 ∧ 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)