| gstore[m] = groupblock(gndx, lax, n0), gstore ↓[m, groupblock(prefixn(valid-group-nodes(gndx), gndx), prefixn(valid-group-nodes(gndx), lax), m0)][@(m, m2, m3)] = mkgnode(nd, m1, boolvar, boolvar0), @(m2, m3) ∈ prefixn(valid-group-nodes(gndx), lax), m ∈ gstore, valid-group-nodes(gndx) ≤ m0, n0 ≤ m0, valid-group-nodes(gndx) ≤ n0 ⊦ nd = nodes(gstore ↓, ginval)[@(m, m2, m3)], m ∈ ginval |
⊦ adr ∈ nodes(gstore, ginval) → nodes(gstore, ginval)[adr] = gstore[adr].nd
gstore ↓[m, groupblock(prefixn(valid-group-nodes(gndx), gndx), prefixn(valid-group-nodes(gndx), lax), m0)][@(m, m2, m3)] = mkgnode(nd, m1, boolvar, boolvar0), gstore[m] = groupblock(gndx, lax, n0), m ∈ gstore, @(m2, m3) ∈ prefixn(valid-group-nodes(gndx), lax), @(m, m2, m3) ∈ nodes(gstore ↓, ginval), valid-group-nodes(gndx) ≤ n0, n0 ≤ m0, valid-group-nodes(gndx) ≤ m0 ⊦ nd = gstore ↓[@(m, m2, m3)].nd, m ∈ ginval
Used simplifier rules: nodes-gstore-in: ⊦ adr ∈ nodes(gstore, ginval) ↔ ¬ ¬(adr ∈ gstore ∧ ¬ adr.lnum ∈ ginval);%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] ↓;%down-block-explicit: ⊦ groupblock(gndx, lax, m0) ↓ = groupblock (prefixn(valid-group-nodes(gndx), gndx), prefixn(valid-group-nodes(gndx), lax), m0);%valid-group-nodes-entire: ⊦ # gndx ≤ valid-group-nodes(gndx) ↔ valid-group-nodes(gndx) = # gndx;% ⊦ ¬ adr ∈ fs → fs[adr] = (∅)[adr]; (s)% ⊦ @(m, m0, m1).lnum = m; (s)% ⊦ groupblock(gndx, lax, m).ladrlist = lax; (s)%# gndx ≤ m ⊦ prefixn(m, gndx) = gndx; (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)%# lax ≤ m ⊦ prefixn(m, lax) = lax; (s) Used terms: @(m, m2, m3), ginval, gstore ↓