src/HOL/PreList.thy
author kleing
Mon, 15 Oct 2001 21:04:32 +0200
changeset 11787 85b3735a51e1
parent 10733 59f82484e000
child 11803 30f2104953a1
permissions -rw-r--r--
canonical 'cases'/'induct' rules for n-tuples (n=3..7) (really belongs to theory Product_Type, but doesn't work there yet)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10519
ade64af4c57c hide many names from Datatype_Universe.
nipkow
parents: 10261
diff changeset
     1
(*  Title:      HOL/PreList.thy
8563
2746bc9a7ef2 comments
nipkow
parents: 8490
diff changeset
     2
    ID:         $Id$
10733
59f82484e000 hide type node item;
wenzelm
parents: 10680
diff changeset
     3
    Author:     Tobias Nipkow and Markus Wenzel
8563
2746bc9a7ef2 comments
nipkow
parents: 8490
diff changeset
     4
    Copyright   2000 TU Muenchen
2746bc9a7ef2 comments
nipkow
parents: 8490
diff changeset
     5
2746bc9a7ef2 comments
nipkow
parents: 8490
diff changeset
     6
A basis for building theory List on. Is defined separately to serve as a
2746bc9a7ef2 comments
nipkow
parents: 8490
diff changeset
     7
basis for theory ToyList in the documentation.
2746bc9a7ef2 comments
nipkow
parents: 8490
diff changeset
     8
*)
8490
6e0f23304061 added HOL/PreLIst.thy;
wenzelm
parents:
diff changeset
     9
6e0f23304061 added HOL/PreLIst.thy;
wenzelm
parents:
diff changeset
    10
theory PreList =
10212
33fe2d701ddd *** empty log message ***
nipkow
parents: 9619
diff changeset
    11
  Option + Wellfounded_Relations + NatSimprocs + Recdef + Record +
10261
bb2f1e859177 tuned declarations;
wenzelm
parents: 10212
diff changeset
    12
  Relation_Power + Calculation + SVC_Oracle:
8490
6e0f23304061 added HOL/PreLIst.thy;
wenzelm
parents:
diff changeset
    13
10261
bb2f1e859177 tuned declarations;
wenzelm
parents: 10212
diff changeset
    14
(*belongs to theory HOL*)
bb2f1e859177 tuned declarations;
wenzelm
parents: 10212
diff changeset
    15
declare case_split [cases type: bool]
bb2f1e859177 tuned declarations;
wenzelm
parents: 10212
diff changeset
    16
bb2f1e859177 tuned declarations;
wenzelm
parents: 10212
diff changeset
    17
(*belongs to theory Wellfounded_Recursion*)
bb2f1e859177 tuned declarations;
wenzelm
parents: 10212
diff changeset
    18
declare wf_induct [induct set: wf]
9066
b1e874e38dab theorems [cases type: bool] = case_split;
wenzelm
parents: 8862
diff changeset
    19
10519
ade64af4c57c hide many names from Datatype_Universe.
nipkow
parents: 10261
diff changeset
    20
(*belongs to theory Datatype_Universe; hides popular names *)
ade64af4c57c hide many names from Datatype_Universe.
nipkow
parents: 10261
diff changeset
    21
hide const Node Atom Leaf Numb Lim Funs Split Case
10733
59f82484e000 hide type node item;
wenzelm
parents: 10680
diff changeset
    22
hide type node item
10519
ade64af4c57c hide many names from Datatype_Universe.
nipkow
parents: 10261
diff changeset
    23
11787
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    24
(*belongs to theory Product_Type; canonical case/induct rules for 3-7 tuples*)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    25
lemma prod_cases3 [cases type: *]: "(!!a b c. y = (a, b, c) ==> P) ==> P"
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    26
apply (cases y)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    27
apply (case_tac b)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    28
apply blast
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    29
done
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    30
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    31
lemma prod_induct3 [induct type: *]: "(!!a b c. P (a, b, c)) ==> P x"
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    32
apply (cases x)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    33
apply blast
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    34
done
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    35
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    36
lemma prod_cases4 [cases type: *]: "(!!a b c d. y = (a, b, c, d) ==> P) ==> P"
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    37
apply (cases y)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    38
apply (case_tac c)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    39
apply blast
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    40
done
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    41
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    42
lemma prod_induct4 [induct type: *]: "(!!a b c d. P (a, b, c, d)) ==> P x"
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    43
apply (cases x)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    44
apply blast
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    45
done
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    46
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    47
lemma prod_cases5 [cases type: *]: "(!!a b c d e. y = (a, b, c, d, e) ==> P) ==> P"
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    48
apply (cases y)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    49
apply (case_tac d)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    50
apply blast
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    51
done
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    52
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    53
lemma prod_induct5 [induct type: *]: "(!!a b c d e. P (a, b, c, d, e)) ==> P x"
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    54
apply (cases x)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    55
apply blast
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    56
done
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    57
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    58
lemma prod_cases6 [cases type: *]: "(!!a b c d e f. y = (a, b, c, d, e, f) ==> P) ==> P"
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    59
apply (cases y)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    60
apply (case_tac e)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    61
apply blast
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    62
done
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    63
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    64
lemma prod_induct6 [induct type: *]: "(!!a b c d e f. P (a, b, c, d, e, f)) ==> P x"
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    65
apply (cases x)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    66
apply blast
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    67
done
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    68
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    69
lemma prod_cases7 [cases type: *]: "(!!a b c d e f g. y = (a, b, c, d, e, f, g) ==> P) ==> P"
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    70
apply (cases y)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    71
apply (case_tac f)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    72
apply blast
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    73
done
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    74
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    75
lemma prod_induct7 [induct type: *]: "(!!a b c d e f g. P (a, b, c, d, e, f, g)) ==> P x"
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    76
apply (cases x)
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    77
apply blast
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    78
done
85b3735a51e1 canonical 'cases'/'induct' rules for n-tuples (n=3..7)
kleing
parents: 10733
diff changeset
    79
10671
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    80
10680
26e4aecf3207 tuned comment;
wenzelm
parents: 10671
diff changeset
    81
(* generic summation indexed over nat *)
26e4aecf3207 tuned comment;
wenzelm
parents: 10671
diff changeset
    82
26e4aecf3207 tuned comment;
wenzelm
parents: 10671
diff changeset
    83
(*FIXME move to Ring_and_Field, when it is made part of main HOL (!?)*)
26e4aecf3207 tuned comment;
wenzelm
parents: 10671
diff changeset
    84
(*FIXME port theorems from Algebra/abstract/NatSum*)
26e4aecf3207 tuned comment;
wenzelm
parents: 10671
diff changeset
    85
10671
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    86
consts
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    87
  Summation :: "(nat => 'a::{zero,plus}) => nat => 'a"
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    88
primrec
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    89
  "Summation f 0 = 0"
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    90
  "Summation f (Suc n) = Summation f n + f n"
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    91
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    92
syntax
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    93
  "_Summation" :: "idt => nat => 'a => nat"    ("\<Sum>_<_. _" [0, 51, 10] 10)
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    94
translations
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    95
  "\<Sum>i < n. b" == "Summation (\<lambda>i. b) n"
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    96
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    97
theorem Summation_step:
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    98
    "0 < n ==> (\<Sum>i < n. f i) = (\<Sum>i < n - 1. f i) + f (n - 1)"
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
    99
  by (induct n) simp_all
ac6b3b671198 added Summation;
wenzelm
parents: 10519
diff changeset
   100
8490
6e0f23304061 added HOL/PreLIst.thy;
wenzelm
parents:
diff changeset
   101
end