| gndx + mkgnode(nd, n, boolvar, true) ' = mkgnode(nd0, m, true, boolvar1) ' + gndx0, (mkgnode(nd0, m, true, boolvar1) ' + gndx0)[# gndx0] = mkgnode(nd1, m0, boolvar0, boolvar2), # gndx + 1 < # ndx, gndx0 ≠ [] ∧ ¬ # gndx < # gndx0 → ¬ boolvar0, ¬ # gndx < # gndx0 → ¬ boolvar2, ∀ n0. ¬ # gndx < n0 → (mkgnode(nd0, m, true, boolvar1) ' + gndx0)[n0].nd = ndx[n0], mkgnode(nd0, m, true, boolvar1) ∈ gndx ∨ mkgnode(nd0, m, true, boolvar1) = mkgnode(nd, n, boolvar, true), mkgnode(nd, n, boolvar, true) = mkgnode(nd0, m, true, boolvar1) ∨ mkgnode(nd, n, boolvar, true) ∈ gndx0 ⊦ ndx = [] |
⊦ ¬ n < # gndx → (gndx + gndx0)[n] = gndx0[n - # gndx]
gndx + mkgnode(nd, n, boolvar, true) ' = mkgnode(nd0, m, true, boolvar1) ' + gndx0, gndx0[# gndx0 - # mkgnode(nd0, m, true, boolvar1) '] = mkgnode(nd1, m0, boolvar0, boolvar2), # gndx + 1 < # ndx, ¬ # gndx < # gndx0 → ¬ boolvar2, gndx0 ≠ [] ∧ ¬ # gndx < # gndx0 → ¬ boolvar0, ∀ n0. ¬ # gndx < n0 → (mkgnode(nd0, m, true, boolvar1) ' + gndx0)[n0].nd = ndx[n0], mkgnode(nd, n, boolvar, true) = mkgnode(nd0, m, true, boolvar1) ∨ mkgnode(nd, n, boolvar, true) ∈ gndx0, mkgnode(nd0, m, true, boolvar1) ∈ gndx ∨ mkgnode(nd0, m, true, boolvar1) = mkgnode(nd, n, boolvar, true) ⊦ ndx = [], # gndx0 < # mkgnode(nd0, m, true, boolvar1) '
Used simplifier rules: ⊦ n < # gndx → (gndx + gndx0)[n] = gndx[n]; (s)%a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]% ⊦ # gnd ' = 0 +1; (s)% ⊦ m < 1 ↔ m = 0; (s)% ⊦ # gndx = 0 ↔ gndx = []; (s)% ⊦ # [] = 0; (s)% ⊦ gnd '[0] = gnd; (s)%⊦ mkgnode(nd, m, boolvar, boolvar0) = mkgnode(nd0, m0, boolvar1, boolvar2) ↔ nd = nd0 ∧ m = m0 ∧ (boolvar ↔ boolvar1) ∧ (boolvar0 ↔ boolvar2); (ws)% ⊦ gndx + [] = gndx; (s)% ⊦ gnd ' = gndx + gnd0 ' ↔ gnd = gnd0 ∧ gndx = []; (ws)% ⊦ ¬ m < 0; (s) Used terms: # gndx0, gndx0, mkgnode(nd0, m, true, boolvar1) '