| # gndx = # lax, # ndx = # lax1, # gndx0 + 1 = # lax1, (mkgnode(nd, m1, true, boolvar0) ' + gndx0).last = mkgnode(nd0, m2, boolvar1, true), gstore[n] = groupblock(gndx, lax, m0), lax1.to-adr(n)[n0] = @(m3, m4, m5), n0 < # lax1, n ∈ gstore, n0 ≤ # gndx0, ∀ n1. (n1 ≠ 0 ∧ n1 < # lax1 → ¬ (mkgnode(nd, m1, true, boolvar0) ' + gndx0)[n1].start) ∧ (n1 + 1 < # lax1 → ¬ (mkgnode(nd, m1, true, boolvar0) ' + gndx0)[n1].end), ∀ n1. n1 < # lax1 → (mkgnode(nd, m1, true, boolvar0) ' + gndx0)[n1].nd = ndx[n1] ⊦ lax1 = [], dups(lax + lax1), dups(lax), dups(lax1), n ∈ ginval, (lax1.to-adr(n)[n0] ∈ gstore ∨ lax1.to-adr(n)[n0] ∈ lax1.to-adr(n)) ∧ ¬ m3 ∈ ginval ∧ gstore[n, groupblock(gndx + mkgnode(nd, m1, true, boolvar0) ' + gndx0, lax + lax1, m)][lax1.to-adr(n)[n0]].nd = ndx[n0] |
# gndx0 = # lax0 + # lax2, # ndx = # lax0 + # lax2 + 1, # gndx = # lax, (mkgnode(nd, m1, true, boolvar0) ' + gndx0).last = mkgnode(nd0, m2, boolvar1, true), gstore[n] = groupblock(gndx, lax, m0), n ∈ gstore, # lax0 ≤ # gndx0, ∀ n0. ¬ # gndx0 < n0 → (mkgnode(nd, m1, true, boolvar0) ' + gndx0)[n0].nd = ndx[n0], ∀ n0. (n0 ≠ 0 ∧ ¬ # gndx0 < n0 → ¬ (mkgnode(nd, m1, true, boolvar0) ' + gndx0)[n0].start) ∧ (n0 < # gndx0 → ¬ (mkgnode(nd, m1, true, boolvar0) ' + gndx0)[n0].end) ⊦ dups(lax + lax0), dups(lax0 + lax2), dups(lax2), dups((lax + lax0) + lax2), dups(lax), dups(lax0), @(m4, m5) ∈ lax2, @(m4, m5) ∈ lax0, @(m4, m5) ∈ lax, n ∈ ginval, ( (lax0.to-adr(n) + @(n, m4, m5) ' + lax2.to-adr(n))[# lax0] ∈ gstore ∨ (lax0.to-adr(n) + @(n, m4, m5) ' + lax2.to-adr(n))[# lax0] ∈ lax0.to-adr(n) ∨ (lax0.to-adr(n) + @(n, m4, m5) ' + lax2.to-adr(n))[# lax0] = @(n, m4, m5) ∨ (lax0.to-adr(n) + @(n, m4, m5) ' + lax2.to-adr(n))[# lax0] ∈ lax2.to-adr(n)) ∧ gstore[n, groupblock(gndx + mkgnode(nd, m1, true, boolvar0) ' + gndx0, lax + lax0 + @(m4, m5) ' + lax2, m)] [(lax0.to-adr(n) + @(n, m4, m5) ' + lax2.to-adr(n))[# lax0] ] .nd = ndx[# lax0]
Used simplifier rules: ladrlist-to-adr-split: n < # lax ⊦ lax.to-adr(m)[n] = adr ↔ (∃ lax0, lax1. lax = lax0 + @(adr.pos, adr.size) ' + lax1 ∧ adr.lnum = m ∧ # lax0 = n);%a: ⊦ ¬ dups(lax + lax0) → ¬ dups(lax) ∧ ¬ dups(lax0); (forward) from specification list-dup[laddress-list]%a: ⊦ (ax + ax0) + ax1 = ax + ax0 + ax1; from specification list[address-list-set]% ⊦ adr ∈ adr0 ' + ax ↔ adr = adr0 ∨ adr ∈ ax; (s)% ⊦ adr ∈ ax + ax0 ↔ adr ∈ ax ∨ adr ∈ ax0; (s)% ⊦ adr + ax = adr ' + ax; (s)% ⊦ @(m, m0).size = m0; (s)% ⊦ @(m, m0).off = m; (s)%⊦ (ladr ' + lax).to-adr(n) = @(n, ladr.off, ladr.size) + lax.to-adr(n); (s)% ⊦ (lax0 + lax1).to-adr(n) = lax0.to-adr(n) + lax1.to-adr(n); (s)% ⊦ m + n < m + n0 ↔ n < n0; (s)%⊦ ¬ ladr ∈ lax ∧ ¬ ladr ∈ lax0 → (dups(lax + ladr ' + lax0) ↔ dups(lax + lax0)); (s)% ⊦ ladr ∈ lax + lax0 ↔ ladr ∈ lax ∨ ladr ∈ lax0; (s)%⊦ dups(lax + ladr ' + lax0) ↔ ladr ∈ lax ∨ ladr ∈ lax0 ∨ dups(lax + lax0); (ws)% ⊦ ¬ m + n < m; (s)% ⊦ m < n + 1 ↔ ¬ n < m; (s)% ⊦ lax + ladr ' + lax0 ≠ []; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + n = m + n0 ↔ n = n0; (s)% ⊦ m +1 = m + 1; (s)% ⊦ #(ladr ' + lax) = (# lax)+1; (s)% ⊦ #(lax + lax0) = # lax + # lax0; (s)%lf-02: ⊦ m < n ∧ m = n0 → n0 < n; (forward) from specification nat-basic% ⊦ @(m, m0, m1).lnum = m; (s)%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ @(m, m0, m1).size = m1; (s)% ⊦ @(m, m0, m1).pos = m0; (s)% ⊦ m < n → (n ≤ m ↔ false); (s)% ⊦ m < n ↔ ¬ n ≤ m; (ss)