sigma[T: TYPE FROM int]: THEORY %------------------------------------------------------------------------------ % The summations theory introduces and defines properties of the sigma % function that sums an arbitrary function F: [T -> real] over a range % from low to high % % high % ---- % sigma(low, high, F) = \ F(j) % / % ---- % j = low % % % MODIFICATIONS: % % sigma_zero, sigma_with ADDED 8/7/01 %------------------------------------------------------------------------------ BEGIN ASSUMING connected_domain: ASSUMPTION (FORALL (x, y: T), (z: integer): x <= z AND z <= y IMPLIES T_pred(z)) ENDASSUMING low,high, l,h,n,m,i : VAR T rng, nn : VAR nat pn : VAR posnat z : VAR int a,x,B : VAR real F, G: VAR function[T -> real] sigma(low, high, F): RECURSIVE real = IF low > high THEN 0 ELSIF high = low THEN F(low) ELSE F(high) + sigma(low, high-1, F) ENDIF MEASURE (LAMBDA low, high, F: abs(high-low)) sigma_split : THEOREM low <= m AND m < high IMPLIES sigma(low, high, F) = sigma(low, m, F) + sigma(m+1, high, F) sigma_diff : THEOREM low <= m AND m < high IMPLIES sigma(low, high, F) - sigma(low, m, F) = sigma(m+1, high, F) sigma_diff_neg: THEOREM low <= m AND m < high IMPLIES sigma(low, m, F) - sigma(low, high, F) = - sigma(m+1, high, F) sigma_spl : THEOREM T_pred(low + nn + pn) IMPLIES sigma(low, low+nn+pn, F) = sigma(low,low+nn,F) + sigma(low+nn+1,low+nn+pn,F) sigma_first : THEOREM high > low IMPLIES sigma(low, high, F) = F(low) + sigma(low+1, high, F) sigma_last : THEOREM high > low IMPLIES sigma(low, high, F) = sigma(low, high-1, F) + F(high) sigma_eq_arg : THEOREM sigma(low, low, F) = F(low) sigma_const : THEOREM sigma(low, high, (LAMBDA i: x)) = IF high >= low THEN (high-low+1) * x ELSE 0 ENDIF sigma_zero : THEOREM sigma(low, high, (LAMBDA i: 0)) = 0 sigma_scal : THEOREM sigma(low, high, (LAMBDA i: a * F(i))) = a * sigma(low, high, F) sigma_bound : THEOREM low <= high AND (FORALL i: i >= low AND i <= high IMPLIES F(i) <= B) IMPLIES sigma(low, high, F) <= B*abs(high-low+1) sigma_abs : THEOREM abs(sigma(low, high, F)) <= sigma(low, high, LAMBDA (n: T): abs(F(n))) sigma_ge_0 : THEOREM (FORALL (n: subrange(low,high)): F(n) >= 0) IMPLIES sigma(low,high,F) >= 0 sigma_gt_0 : THEOREM low < high AND (FORALL (n: subrange(low,high)): F(n) > 0) IMPLIES sigma(low,high,F) > 0 sigma_shift_T : THEOREM (FORALL (i:T): T_pred(i+z)) IMPLIES sigma(low+z,high+z,F) = sigma(low,high, (LAMBDA (i:T): F(i+z))) % ------------------ Summation Involving Two Functions ------------------ sigma_sum : THEOREM sigma(low, high, F) + sigma(low, high, G) = sigma(low, high, (LAMBDA i: F(i) + G(i))) sigma_minus : THEOREM sigma(low, high, F) - sigma(low, high, G) = sigma(low, high, (LAMBDA i: F(i) - G(i))) sigma_abs_bnd : THEOREM (FORALL (i: subrange(low,high)): abs(F(i)) <= G(i)) IMPLIES sigma(low, high, LAMBDA (n: T): abs(F(n))) <= sigma(low, high, G) restrict(F, low, high): function[T -> real] = (LAMBDA i: IF i < low OR i > high THEN 0 ELSE F(i) ENDIF ) sigma_restrict : THEOREM l <= low AND h >= high IMPLIES sigma(low,high,F) = sigma(low,high,restrict(F,l,h)) sigma_restrict_eq: THEOREM restrict(F,low,high) = restrict(G,low,high) IMPLIES sigma(low,high,F) = sigma(low,high,G) sigma_eq : THEOREM (FORALL (n: subrange(low,high)): F(n) = G(n)) IMPLIES sigma(low,high,F) = sigma(low,high,G) sigma_le : THEOREM (FORALL (n: subrange(low,high)): F(n) <= G(n)) IMPLIES sigma(low,high,F) <= sigma(low,high,G) sigma_lt : THEOREM low < high AND (FORALL (n: subrange(low,high)): F(n) < G(n)) IMPLIES sigma(low,high,F) < sigma(low,high,G) sigma_with : THEOREM low <= i AND i <= high AND F = G WITH [i := a] IMPLIES sigma(low, high,F) = sigma(low,high,G) - G(i) + a % ------------------------------- Judgements -------------------------------- sigma_nonneg : THEOREM (FORALL i: F(i) >= 0) IMPLIES sigma(low, high, F) >= 0 sigma_nonpos : THEOREM (FORALL i: F(i) <= 0) IMPLIES sigma(low, high, F) <= 0 Fnnr: VAR function[T -> nonneg_real] Fnpr: VAR function[T -> nonpos_real] Fnat: VAR function[T -> nat] Fnpi: VAR function[T -> nonpos_int] JUDGEMENT sigma(low,high,Fnnr) HAS_TYPE nonneg_real JUDGEMENT sigma(low,high,Fnpr) HAS_TYPE nonpos_real JUDGEMENT sigma(low,high,Fnat) HAS_TYPE nat JUDGEMENT sigma(low,high,Fnpi) HAS_TYPE nonpos_int sigma_nonneg_eq_0 : THEOREM sigma(low,high,Fnnr) = 0 AND low <= i AND i <= high IMPLIES Fnnr(i) = 0 % ------------------- Iterative Summation (tail recursion) ------------ sum_it_def(low, high, F,a): RECURSIVE real = IF low > high THEN a ELSIF low = high THEN a+F(low) ELSE sum_it_def(low+1,high,F,a+F(low)) ENDIF MEASURE (LAMBDA low, high, F, a: abs(high-low)) sum_it(low,high,F) : real = sum_it_def(low,high,F,0) sum_it_prop : LEMMA low <= i AND i < high => sum_it_def(i+1,high,F,sigma(low,i,F)) = sigma(low,high,F) sum_it_sigma: LEMMA sum_it(low,high,F) = sigma(low,high,F) END sigma