| (elems nx0 ∪ dom gstore0) ++ n = dom gstore ∪ ginval1, gstore[n] = groupblock(gndx0, lax0, m), gndx = [], remove-refsize0(istore1) = istore1, remove-refsize0(gstore0) = gstore0, ginval1 ∩ elems nx0 = ∅, inv(groupblock(gndx0, lax0, m)), inv(istore1), inv(istore2), inv(gstore0), inv(gstore \ ginval1), n ∈ gstore, istore1 ⊑ istore2 ⊦ ∃ 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 ')), dups(nx0), n ∈ ginval1, n ∈ nx0 |
(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 ∈ nx0, ¬ n ∈ ginval1 ⊦ ⟨ax := ([]).to-adr(journal((nx0 + n ').last).lnum), err0 := ESUCCESS; gstore2 := gstore[journal((nx0 + n ').last).lnum, gstore[journal((nx0 + n ').last).lnum].gndlist:= gstore[journal((nx0 + n ').last).lnum].gndlist]; gstore2[journal((nx0 + n ').last).lnum].ladrlist := gstore2[journal((nx0 + n ').last).lnum].ladrlist; if err0 ≠ ESUCCESS then ax := ?, pstate := readonly; syn := ?⟩ (syn ∧ crash(gstore, gstore0, ginval1, nx0 + n ') = crash(gstore2, gstore0, ginval1, nx0 + n '))
Used simplifier rules: ⊦ inv(groupblock(gndx, lax, m0)) → ¬ dups(lax); (s)% ⊦ ¬ ⌊ESUCCESS⌋ ; (s)%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ lax + [] = lax; (s)%a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]% ⊦ gndx + [] = gndx; (s)% ⊦ inv-flashsize([], lax) ↔ lax = []; (s)% ⊦ prefixn(0, gndx) = []; (s)% ⊦ # [] = 0; (s)% ⊦ # lax = 0 ↔ lax = []; (s)% ⊦ m ≤ 0 ↔ m = 0; (s)% ⊦ # [] = 0; (s)