| # ndx = # gndx, transaction-prefix(ndx + nd ' + ndx1, gndx) ⊦ ndx1 = [], transaction-prefix(ndx + nd ' + ndx1, gndx + mkgnode(nd, n, ndx = [], false) ') |
# ndx = # gndx, ∀ n. n < # gndx → gndx[n].nd = (ndx + nd ' + ndx1)[n], gndx = [] ∨ gndx.head.start ∧ (∀ n0. (n0 ≠ 0 ∧ n0 < # gndx → ¬ gndx[n0].start) ∧ (n0 < # gndx → ¬ gndx[n0].end)) ⊦ ndx1 = [], (gndx + mkgnode(nd, n, ndx = [], false) ').head.start ∧ (n0 ≠ 0 ∧ ¬ # gndx < n0 → ¬ (gndx + mkgnode(nd, n, ndx = [], false) ')[n0].start) ∧ (¬ # gndx < n0 → ¬ (gndx + mkgnode(nd, n, ndx = [], false) ')[n0].end) ∧ (¬ # gndx < n1 → (gndx + mkgnode(nd, n, ndx = [], false) ')[n1].nd = (ndx + nd ' + ndx1)[n1])
Used simplifier rules: transaction-prefix: ⊦ transaction-prefix(ndx, gndx) ↔ # gndx < # ndx ∧ ( gndx = [] ∨ gndx.head.start ∧ (∀ n. (0 < n ∧ n < # gndx → ¬ gndx[n].start) ∧ (n < # gndx → ¬ gndx[n].end))) ∧ (∀ n. n < # gndx → gndx[n].nd = ndx[n]);% ⊦ # ndx = 0 ↔ ndx = []; (s)% ⊦ m < m + n ↔ n ≠ 0; (s)% ⊦ m ≤ m + n; (s)% ⊦ m < n ↔ ¬ n ≤ m; (ss)% ⊦ gndx + gnd ' ≠ []; (s)% ⊦ m + n < m + n0 ↔ n < n0; (s)%a: ⊦ (gndx + gndx0) + gndx1 = gndx + gndx0 + gndx1; from specification list[group-store]% ⊦ # gnd ' = 0 +1; (s)% ⊦ #(gndx + gndx0) = # gndx + # gndx0; (s)% ⊦ 0 < m ↔ m ≠ 0; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m < n + 1 ↔ ¬ n < m; (s)%a: ⊦ (ndx + ndx0) + ndx1 = ndx + ndx0 + ndx1; from specification list[node-list]% ⊦ m +1 = m + 1; (s)% ⊦ #(nd ' + ndx) = (# ndx)+1; (s)% ⊦ #(ndx + ndx0) = # ndx + # ndx0; (s)