| remove-refsize0(gstore0) = gstore0, elems nx ∩ ginval1 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ ginval1, nx ≠ [], inv(gstore \ ginval1), inv(gstore0), inv(gstore[nx.last]), ri-inj(fi2), ri-inj(fi1), nx.last ∈ gstore, ¬ dups(nx) ⊦ ∃ lax, err0. (⌊err0⌋ ∨ err0 = ESUCCESS) ∧ ¬ dups(gstore[nx.last].ladrlist + lax) ∧ # lax ≤ # gndx ∧ inv-flashsize(prefixn(# lax, gndx), lax) ∧ (err0 = ESUCCESS ↔ # lax = # gndx) ∧ ⟨ax := lax.to-adr(nx.last), err := err0; gstore2 := gstore[nx.last, gstore[nx.last].gndlist:= (gstore[nx.last].gndlist + prefixn(# lax, gndx))]; gstore2[nx.last].ladrlist := gstore2[nx.last].ladrlist + lax; if err ≠ ESUCCESS then ax := ?; syn := ?⟩ (syn ∧ crash(gstore, gstore0, ginval1, nx) = crash(gstore2, gstore0, ginval1, nx)) |
gstore[nx.last] = groupblock(gndx0, lax0, m), remove-refsize0(gstore0) = gstore0, elems nx ∩ ginval1 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ ginval1, inv(gstore[nx.last]), inv(gstore0), inv(gstore \ ginval1), ri-inj(fi1), ri-inj(fi2), nx.last ∈ gstore ⊦ ∃ lax, err0. (⌊err0⌋ ∨ err0 = ESUCCESS) ∧ ¬ dups(lax0 + lax) ∧ # lax ≤ # gndx ∧ inv-flashsize(prefixn(# lax, gndx), lax) ∧ (err0 = ESUCCESS ↔ # lax = # gndx) ∧ ⟨ax := lax.to-adr(nx.last), err := err0; gstore2 := gstore[nx.last, gstore[nx.last].gndlist:= (gndx0 + prefixn(# lax, gndx))]; gstore2[nx.last].ladrlist := gstore2[nx.last].ladrlist + lax; if err ≠ ESUCCESS then ax := ?; syn := ?⟩ (syn ∧ crash(gstore, gstore0, ginval1, nx) = crash(gstore2, gstore0, ginval1, nx)), nx = [], dups(nx)
Used simplifier rules: ⊦ (gndx = gblock.gndlist ∧ lax = gblock.ladrlist) ∧ m = gblock.ref-size ↔ gblock = groupblock(gndx, lax, m); (elim) Used terms: gstore[nx.last], gndx0, lax0, m