| max_ending_here = 0, max_so_far = 0, n = 0, size = # a ⊦ ⟪while n < size do {/* kadane-correct : invariant 0 ≤ max_ending_here ∧ max_ending_here ≤ max_so_far ∧ n ≤ size ∧ maximum-sum(subarray(a, 0, n), max_so_far) ∧ (∃ m. maximum-suffix-sum(subarray(a, 0, n), m, max_ending_here)) wfbound size - n; */; max_ending_here := max_ending_here + a[n]; if max_ending_here < 0 then max_ending_here := 0 else if max_so_far < max_ending_here then max_so_far := max_ending_here; n := n + 1}; res := max_so_far⟫ maximum-sum(a, res) |
max_ending_here = 0, max_so_far = 0, n = 0, size = # a ⊦ 0 ≤ max_ending_here ∧ max_ending_here ≤ max_so_far ∧ n ≤ size ∧ maximum-sum(subarray(a, 0, n), max_so_far) ∧ (∃ m. maximum-suffix-sum(subarray(a, 0, n), m, max_ending_here))
max_ending_here0 = 0, max_so_far0 = 0, n = n0, n1 = 0, size = # a, n < size, maximum-sum(subarray(a, 0, n), max_so_far), 0 ≤ max_ending_here, max_ending_here ≤ max_so_far, n ≤ size, ∃ m. maximum-suffix-sum(subarray(a, 0, n), m, max_ending_here) ⊦ ⟪max_ending_here := max_ending_here + a[n]; if max_ending_here < 0 then max_ending_here := 0 else if max_so_far < max_ending_here then max_so_far := max_ending_here; n := n + 1⟫ ( ( 0 ≤ max_ending_here ∧ max_ending_here ≤ max_so_far ∧ n ≤ size ∧ maximum-sum(subarray(a, 0, n), max_so_far) ∧ (∃ m. maximum-suffix-sum(subarray(a, 0, n), m, max_ending_here))) ∧ size - n < size - n0)
max_ending_here0 = 0, max_so_far0 = 0, n1 = 0, size = # a, maximum-sum(subarray(a, 0, n), max_so_far), 0 ≤ max_ending_here, max_ending_here ≤ max_so_far, n ≤ size, ∃ m. maximum-suffix-sum(subarray(a, 0, n), m, max_ending_here) ⊦ ⟪res := max_so_far⟫ maximum-sum(a, res), n < size
Used formulas: 0 ≤ max_ending_here ∧ max_ending_here ≤ max_so_far ∧ n ≤ size ∧ maximum-sum(subarray(a, 0, n), max_so_far) ∧ (∃ m. maximum-suffix-sum(subarray(a, 0, n), m, max_ending_here)), size - n = size - n