| err0 = ESUCCESS ↔ # lax = # gndx, err0 = ESUCCESS, fi = fi1, fi0 = fi2, ginval = ginval1, ginval0 = ginval2, remove-refsize0(gstore0) = gstore0, elems nx ∩ ginval2 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ ginval2, inv(gstore[nx.last]), inv(gstore0), inv(gstore \ ginval2), inv-flashsize(prefixn(# lax, gndx), lax), ri-inj(fi1), ri-inj(fi2), nx.last ∈ gstore, nx.last ∈ gstore[nx.last, gstore[nx.last].gndlist:= (gstore[nx.last].gndlist + prefixn(# lax, gndx))], # lax ≤ # gndx, ⌊err0⌋ ∨ err0 = ESUCCESS ⊦ nx = [], dups(nx), dups(gstore[nx.last].ladrlist + lax), inv ( gstore[nx.last, gstore[nx.last].gndlist:= (gstore[nx.last].gndlist + prefixn(# lax, gndx))] [nx.last, gstore[nx.last, gstore[nx.last].gndlist:= (gstore[nx.last].gndlist + prefixn(# lax, gndx))][nx.last] .ladrlist:= (gstore[nx.last, gstore[nx.last].gndlist:= (gstore[nx.last].gndlist + prefixn(# lax, gndx))][nx.last].ladrlist + lax) ] \ ginval2) ∧ dom gstore0 ∪ elems nx = dom gstore[nx.last, gstore[nx.last].gndlist:= (gstore[nx.last].gndlist + prefixn(# lax, gndx))] [nx.last, gstore[nx.last, gstore[nx.last].gndlist:= (gstore[nx.last].gndlist + prefixn(# lax, gndx))][nx.last] .ladrlist:= (gstore[nx.last, gstore[nx.last].gndlist:= (gstore[nx.last].gndlist + prefixn(# lax, gndx))][nx.last].ladrlist + lax) ] ∪ ginval2 |
# lax = # gndx, remove-refsize0(gstore0) = gstore0, elems nx ∩ ginval2 = ∅, dom gstore0 ∪ elems nx = dom gstore ∪ ginval2, inv(gstore[nx.last]), inv(gstore0), inv(gstore \ ginval2), inv-flashsize(gndx, lax), ri-inj(fi1), ri-inj(fi2), nx.last ∈ gstore ⊦ nx = [], dups(lax), dups(gstore[nx.last].ladrlist), dups(nx), dups(gstore[nx.last].ladrlist + lax), inv((gstore[nx.last].gndlist:= (gstore[nx.last].gndlist + gndx)).ladrlist:= (gstore[nx.last].ladrlist + lax)), nx.last ∈ ginval2
Used simplifier rules: ⊦ m ≤ m; (s)%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]%a: ⊦ ¬ dups(lax + lax0) → ¬ dups(lax) ∧ ¬ dups(lax0); (forward) from specification list-dup[laddress-list]%⊦ inv(gstore \ ns) → (inv(gstore[n, gblock] \ ns) ↔ n ∈ ns ∨ inv(gblock)); (ws)% ⊦ n ∈ gstore → dom gstore ++ n = dom gstore; (s)% ⊦ dom gstore[n, gblock] = dom gstore ++ n; (s)% ⊦ gstore[n, gblock][n, gblock0] = gstore[n, gblock0]; (s)% ⊦ (gblock.gndlist:= gndx).ladrlist = gblock.ladrlist; (s)% ⊦ gstore[n, gblock][n] = gblock; (s)% ⊦ ¬ ⌊ESUCCESS⌋ ; (s)% ⊦ n ∈ gstore[n, gblock]; (s)%# gndx ≤ m ⊦ prefixn(m, gndx) = gndx; (s)% ⊦ ¬ n < n; (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)