| gstore[nx.last] = groupblock(gndx0, lax0, m), remove-refsize0(gstore0) = gstore0, remove-refsize0(istore1) = istore1, elems nx ∩ ginval1 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ ginval1, nx ≠ [], inv(gstore \ ginval1), inv(gstore0), inv(istore2), inv(istore1), inv(groupblock(gndx0, lax0, m)), nx.last ∈ gstore, istore1 ⊑ istore2, ¬ dups(nx) ⊦ ∃ 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)) |
⊦ nx = [] ↔ ¬(∃ nx0, n. nx = nx0 + n ')
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)
Used terms: nx