| gstore[nx.last] = groupblock(gndx0, lax0, m), remove-refsize0(gstore0) = gstore0, elems nx ∩ ginval1 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ ginval1, inv(groupblock(gndx0, lax0, m)), inv(gstore0), inv(gstore \ ginval1), ri-inj(fi1), ri-inj(fi2), nx.last ∈ gstore ⊦ (⌊EIO⌋ ∨ EIO = ESUCCESS) ∧ ¬ dups(lax0 + []) ∧ # [] ≤ # gndx ∧ inv-flashsize(prefixn(# [], gndx), []) ∧ (EIO = ESUCCESS ↔ # [] = # gndx) ∧ ⟨ax := ([]).to-adr(nx.last), err := EIO; gstore2 := gstore[nx.last, gstore[nx.last].gndlist:= (gndx0 + prefixn(# [], gndx))]; gstore2[nx.last].ladrlist := gstore2[nx.last].ladrlist + []; if err ≠ ESUCCESS then ax := ?; syn := ?⟩ (syn ∧ crash(gstore, gstore0, ginval1, nx) = crash(gstore2, gstore0, ginval1, nx)), gndx = [], nx = [], dups(nx) |
gstore[nx.last] = groupblock(gndx0, lax0, m), remove-refsize0(gstore0) = gstore0, elems nx ∩ ginval1 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ ginval1, gndx ≠ [], nx ≠ [], inv(gstore \ ginval1), inv(gstore0), inv(groupblock(gndx0, lax0, m)), ri-inj(fi2), ri-inj(fi1), nx.last ∈ gstore, ¬ dups(nx) ⊦ ⟨ax := [], err := EIO; gstore2 := gstore[nx.last, gstore[nx.last].gndlist:= gndx0]; gstore2[nx.last].ladrlist := gstore2[nx.last].ladrlist; if err ≠ ESUCCESS then ax := ?; syn := ?⟩ (syn ∧ crash(gstore, gstore0, ginval1, nx) = crash(gstore2, gstore0, ginval1, nx))
Used simplifier rules: a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]% ⊦ gndx + [] = gndx; (s)% ⊦ ([]).to-adr(n) = []; (s)% ⊦ # gndx = 0 ↔ gndx = []; (s)% ⊦ ESUCCESS ≠ EIO; (s)% ⊦ inv-flashsize([], lax) ↔ lax = []; (s)% ⊦ prefixn(0, gndx) = []; (s)% ⊦ 0 ≤ m; (s)% ⊦ # [] = 0; (s)% ⊦ inv(groupblock(gndx, lax, m0)) → ¬ dups(lax); (s)%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ lax + [] = lax; (s)% ⊦ ⌊EIO⌋ ; (s)