| gstore[nx.last] = groupblock(gndx0, lax0, m), remove-refsize0(istore1) = istore1, remove-refsize0(gstore0) = gstore0, elems nx ∩ ginval1 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ ginval1, inv(groupblock(gndx0, lax0, m)), inv(istore1), inv(istore2), inv(gstore0), inv(gstore \ ginval1), nx.last ∈ gstore, istore1 ⊑ istore2, ∃ nx0, n. nx = nx0 + n ' ⊦ ∃ lax, err. (⌊err⌋ ∨ err = ESUCCESS) ∧ ¬ dups(lax0 + lax) ∧ # lax ≤ # gndx ∧ inv-flashsize(prefixn(# lax, gndx), lax) ∧ (err = ESUCCESS ↔ # lax = # gndx) ∧ ⟨ax := lax.to-adr(journal(nx.last).lnum), err0 := err; gstore2 := gstore[journal(nx.last).lnum, gstore[journal(nx.last).lnum].gndlist:= (gstore[journal(nx.last).lnum].gndlist + prefixn(# lax, gndx))]; gstore2[journal(nx.last).lnum].ladrlist := gstore2[journal(nx.last).lnum].ladrlist + lax; if err0 ≠ ESUCCESS then ax := ?, pstate := readonly; syn := ?⟩ (syn ∧ crash(gstore, gstore0, ginval1, nx) = crash(gstore2, gstore0, ginval1, nx)), dups(nx) |
(elems nx0 ∪ dom gstore0) ++ n = dom gstore ∪ ginval1, gstore[n] = groupblock(gndx0, lax0, m), remove-refsize0(gstore0) = gstore0, remove-refsize0(istore1) = istore1, ginval1 ∩ elems nx0 = ∅, inv(gstore \ ginval1), inv(gstore0), inv(istore2), inv(istore1), inv(groupblock(gndx0, lax0, m)), n ∈ gstore, istore1 ⊑ istore2, ¬ dups(nx0), ¬ n ∈ ginval1, ¬ n ∈ nx0 ⊦ ∃ lax, err. (⌊err⌋ ∨ err = ESUCCESS) ∧ ¬ dups(lax0 + lax) ∧ # lax ≤ # gndx ∧ inv-flashsize(prefixn(# lax, gndx), lax) ∧ (err = ESUCCESS ↔ # lax = # gndx) ∧ ⟨ax := lax.to-adr(journal((nx0 + n ').last).lnum), err0 := err; gstore2 := gstore [journal((nx0 + n ').last).lnum, gstore[journal((nx0 + n ').last).lnum].gndlist:= (gstore[journal((nx0 + n ').last).lnum].gndlist + prefixn(# lax, gndx)) ]; gstore2[journal((nx0 + n ').last).lnum].ladrlist := gstore2[journal((nx0 + n ').last).lnum].ladrlist + lax; if err0 ≠ ESUCCESS then ax := ?, pstate := readonly; syn := ?⟩ (syn ∧ crash(gstore, gstore0, ginval1, nx0 + n ') = crash(gstore2, gstore0, ginval1, nx0 + n '))
Used simplifier rules: fwd-inv-gblock-rem: ⊦ inv(gstore \ ginval) ∧ n ∈ gstore ∧ ¬ n ∈ ginval ∧ gstore[n] = gblock → inv(gblock); (forward) from specification apersistence-base% ⊦ dups(nx + n ') ↔ n ∈ nx ∨ dups(nx); (ws)% ⊦ (nx + n ').last = n; (s)%int-c: ⊦ ns ∩ ns0 = ns0 ∩ ns; from specification set-union[nat-set]%int-a: ⊦ (ns ∩ ns0) ∩ ns1 = ns ∩ ns0 ∩ ns1; from specification set-union[nat-set]% ⊦ ns ∩ (ns0 ++ n) = ∅ ↔ ns ∩ ns0 = ∅ ∧ ¬ n ∈ ns; (ws)%unc: ⊦ ns ∪ ns0 = ns0 ∪ ns; from specification set-union[nat-set]%una: ⊦ (ns ∪ ns0) ∪ ns1 = ns ∪ ns0 ∪ ns1; from specification set-union[nat-set]% ⊦ (ns ++ n) ∪ ns0 = (ns ∪ ns0) ++ n; (s)%a: ⊦ (nx + nx0) + nx1 = nx + nx0 + nx1; from specification list[nat-list-set]% ⊦ elems(nx0 + n ') = elems nx0 ++ n; (s)