src/HOL/Isar_examples/NatSum.thy
author wenzelm
Fri, 30 Apr 1999 18:25:10 +0200
changeset 6559 fa203026941c
parent 6526 6b64d1454ee3
child 6746 cf6ad8d22793
permissions -rw-r--r--
tuned;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6526
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Isar_examples/NatSum.thy
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
     3
    Author:     Tobias Nipkow and Markus Wenzel
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
     4
*)
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
     5
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
     6
theory NatSum = Main:;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
     7
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
     8
section "Summing natural numbers";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
     9
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    10
text "A summation operator: sum f (n+1) is the sum of all f(i), i=0...n.";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    11
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    12
consts
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    13
  sum	:: "[nat => nat, nat] => nat";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    14
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    15
primrec 
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    16
  "sum f 0 = 0"
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    17
  "sum f (Suc n) = f n + sum f n";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    18
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    19
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    20
(*theorems [simp] = add_assoc add_commute add_left_commute add_mult_distrib add_mult_distrib2;*)
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    21
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    22
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    23
subsection "The sum of the first n positive integers equals n(n+1)/2";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    24
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    25
text "Emulate Isabelle proof script:";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    26
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    27
(*
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    28
  Goal "2*sum (%i. i) (Suc n) = n*Suc(n)";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    29
  by (Simp_tac 1);
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    30
  by (induct_tac "n" 1);
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    31
  by (Simp_tac 1);
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    32
  by (Asm_simp_tac 1);
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    33
  qed "sum_of_naturals";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    34
*)
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    35
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    36
theorem "2 * sum (%i. i) (Suc n) = n * Suc n";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    37
proof same;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    38
  refine simp_tac;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    39
  refine (induct n);
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    40
  refine simp_tac;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    41
  refine asm_simp_tac;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    42
qed_with sum_of_naturals;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    43
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    44
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    45
text "Proper Isabelle/Isar proof expressing the same reasoning (which
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    46
  is apparently not the most natural one):";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    47
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    48
theorem sum_of_naturals: "2 * sum (%i. i) (Suc n) = n * Suc n";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    49
proof simp;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    50
  show "n + (sum (%i. i) n + sum (%i. i) n) = n * n" (is "??P n");
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    51
  proof (induct ??P n);
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    52
    show "??P 0"; by simp;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    53
    fix m; assume hyp: "??P m"; show "??P (Suc m)"; by (simp, rule hyp);
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    54
  qed;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    55
qed;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    56
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    57
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    58
subsection "The sum of the first n odd numbers equals n squared";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    59
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    60
text "First version: `proof-by-induction'";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    61
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    62
theorem sum_of_odds: "sum (%i. Suc (i + i)) n = n * n" (is "??P n");
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    63
proof (induct n);
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    64
  show "??P 0"; by simp;
6559
wenzelm
parents: 6526
diff changeset
    65
  fix m; assume hyp: "??P m"; show "??P (Suc m)"; by (simp, rule hyp);
6526
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    66
qed;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    67
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    68
text "The second version tells more about what is going on during the
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    69
induction.";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    70
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    71
theorem sum_of_odds': "sum (%i. Suc (i + i)) n = n * n" (is "??P n");
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    72
proof (induct n);
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    73
  show "??P 0" (is "sum (%i. Suc (i + i)) 0 = 0 * 0"); by simp;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    74
  fix m; assume hyp: "??P m";
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    75
  show "??P (Suc m)" (is "sum (%i. Suc (i + i)) (Suc m) = Suc m * Suc m");
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    76
    by (simp, rule hyp);
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    77
qed;
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    78
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    79
6b64d1454ee3 added Isar_examples/NatSum.thy;
wenzelm
parents:
diff changeset
    80
end;