| gstore[m] = groupblock(gndx, lax, m2), (m ∈ nx ∨ ¬ m ∈ ginval ⊃ groupblock(gndx, lax, (m ∈ gstore0 ⊃ gstore0[m].ref-size;0));gstore0[m]) ↓ = groupblock(gndx0, lax0, m3), inv(gstore \ ginval), m ∈ crash(gstore, gstore0, ginval, nx), @(m, m0, m1) ∈ nodes(crash(gstore, gstore0, ginval, nx) ↓, ginval) ⊦ (¬ m ∈ ginval → (m ∈ gstore ∧ @(m0, m1) ∈ prefixn(valid-group-nodes(gndx), lax) ↔ @(m, m0, m1) ∈ gstore ↓)) ∧ (m ∈ gstore ∧ @(m0, m1) ∈ lax0 ∧ ¬ m ∈ ginval → crash(gstore, gstore0, ginval, nx) ↓[@(m, m0, m1)].nd = nodes(gstore ↓, ginval)[@(m, m0, m1)]) |
gstore[m] = groupblock(gndx, lax, m2), inv(groupblock(gndx, lax, m2)), inv(gstore \ ginval), @(m0, m1) ∈ crash(gstore, gstore0, ginval, nx) ↓[m].ladrlist, m ∈ gstore, @(m0, m1) ∈ prefixn(valid-group-nodes(gndx), lax) ⊦ crash(gstore, gstore0, ginval, nx) ↓[@(m, m0, m1)].nd = nodes(gstore ↓, ginval)[@(m, m0, m1)], m ∈ ginval
Used simplifier rules: nodes-gstore-in: ⊦ adr ∈ nodes(gstore, ginval) ↔ ¬ ¬(adr ∈ gstore ∧ ¬ adr.lnum ∈ ginval);%down-block-explicit: ⊦ groupblock(gndx, lax, m0) ↓ = groupblock (prefixn(valid-group-nodes(gndx), gndx), prefixn(valid-group-nodes(gndx), lax), m0);%down-store-adr-in-explicit: ⊦ @(m0, m1, m2) ∈ gstore ↓ ↔ m0 ∈ gstore ∧ @(m1, m2) ∈ gstore ↓[m0].ladrlist;%down-store-at: ⊦ n ∈ gstore → gstore ↓[n] = gstore[n] ↓;% ⊦ groupblock(gndx, lax, m).ladrlist = lax; (s)%fwd-inv-gblock-rem: ⊦ inv(gstore \ ginval) ∧ n ∈ gstore ∧ ¬ n ∈ ginval ∧ gstore[n] = gblock → inv(gblock); (forward) from specification apersistence-base% ⊦ n ∈ crash(gstore, gstore0, ginval, nx) ↔ n ∈ gstore ∨ n ∈ ginval; (ws)%⊦ groupblock(gndx, lax, m) = groupblock(gndx0, lax0, m0) ↔ gndx = gndx0 ∧ lax = lax0 ∧ m = m0; (ws)% ⊦ @(m, m0, m1).lnum = m; (s)