src/HOL/Induct/Common_Patterns.thy
author wenzelm
Sat, 20 Jun 2015 15:45:02 +0200
changeset 60530 44f9873d6f6f
parent 58889 5b7a9633cfa8
child 62315 ccb42dbf4aa1
permissions -rw-r--r--
isabelle update_cartouches;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Induct/Common_Patterns.thy
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
     3
*)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
     4
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
     5
section \<open>Common patterns of induction\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
     6
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
     7
theory Common_Patterns
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
     8
imports Main
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
     9
begin
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    10
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    11
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    12
  The subsequent Isar proof schemes illustrate common proof patterns
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    13
  supported by the generic @{text "induct"} method.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    14
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    15
  To demonstrate variations on statement (goal) structure we refer to
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    16
  the induction rule of Peano natural numbers: @{thm nat.induct
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    17
  [no_vars]}, which is the simplest case of datatype induction.  We
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    18
  shall also see more complex (mutual) datatype inductions involving
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    19
  several rules.  Working with inductive predicates is similar, but
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    20
  involves explicit facts about membership, instead of implicit
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    21
  syntactic typing.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    22
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    23
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    24
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    25
subsection \<open>Variations on statement structure\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    26
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    27
subsubsection \<open>Local facts and parameters\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    28
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    29
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    30
  Augmenting a problem by additional facts and locally fixed variables
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    31
  is a bread-and-butter method in many applications.  This is where
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    32
  unwieldy object-level @{text "\<forall>"} and @{text "\<longrightarrow>"} used to occur in
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    33
  the past.  The @{text "induct"} method works with primary means of
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    34
  the proof language instead.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    35
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    36
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    37
lemma
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    38
  fixes n :: nat
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    39
    and x :: 'a
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    40
  assumes "A n x"
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    41
  shows "P n x" using \<open>A n x\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    42
proof (induct n arbitrary: x)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    43
  case 0
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    44
  note prem = \<open>A 0 x\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    45
  show "P 0 x" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    46
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    47
  case (Suc n)
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    48
  note hyp = \<open>\<And>x. A n x \<Longrightarrow> P n x\<close>
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    49
    and prem = \<open>A (Suc n) x\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    50
  show "P (Suc n) x" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    51
qed
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    52
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    53
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    54
subsubsection \<open>Local definitions\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    55
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    56
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    57
  Here the idea is to turn sub-expressions of the problem into a
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    58
  defined induction variable.  This is often accompanied with fixing
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    59
  of auxiliary parameters in the original expression, otherwise the
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    60
  induction step would refer invariably to particular entities.  This
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    61
  combination essentially expresses a partially abstracted
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    62
  representation of inductive expressions.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    63
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    64
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    65
lemma
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    66
  fixes a :: "'a \<Rightarrow> nat"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    67
  assumes "A (a x)"
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    68
  shows "P (a x)" using \<open>A (a x)\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    69
proof (induct n \<equiv> "a x" arbitrary: x)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    70
  case 0
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    71
  note prem = \<open>A (a x)\<close>
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    72
    and defn = \<open>0 = a x\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    73
  show "P (a x)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    74
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    75
  case (Suc n)
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    76
  note hyp = \<open>\<And>x. n = a x \<Longrightarrow> A (a x) \<Longrightarrow> P (a x)\<close>
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    77
    and prem = \<open>A (a x)\<close>
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    78
    and defn = \<open>Suc n = a x\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    79
  show "P (a x)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    80
qed
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    81
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    82
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    83
  Observe how the local definition @{text "n = a x"} recurs in the
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    84
  inductive cases as @{text "0 = a x"} and @{text "Suc n = a x"},
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    85
  according to underlying induction rule.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    86
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    87
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    88
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    89
subsubsection \<open>Simple simultaneous goals\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    90
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    91
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    92
  The most basic simultaneous induction operates on several goals
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    93
  one-by-one, where each case refers to induction hypotheses that are
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    94
  duplicated according to the number of conclusions.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
    95
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    96
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    97
lemma
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    98
  fixes n :: nat
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    99
  shows "P n" and "Q n"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   100
proof (induct n)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   101
  case 0 case 1
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   102
  show "P 0" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   103
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   104
  case 0 case 2
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   105
  show "Q 0" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   106
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   107
  case (Suc n) case 1
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   108
  note hyps = \<open>P n\<close> \<open>Q n\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   109
  show "P (Suc n)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   110
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   111
  case (Suc n) case 2
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   112
  note hyps = \<open>P n\<close> \<open>Q n\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   113
  show "Q (Suc n)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   114
qed
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   115
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   116
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   117
  The split into subcases may be deferred as follows -- this is
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   118
  particularly relevant for goal statements with local premises.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   119
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   120
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   121
lemma
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   122
  fixes n :: nat
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   123
  shows "A n \<Longrightarrow> P n"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   124
    and "B n \<Longrightarrow> Q n"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   125
proof (induct n)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   126
  case 0
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   127
  {
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   128
    case 1
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   129
    note \<open>A 0\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   130
    show "P 0" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   131
  next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   132
    case 2
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   133
    note \<open>B 0\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   134
    show "Q 0" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   135
  }
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   136
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   137
  case (Suc n)
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   138
  note \<open>A n \<Longrightarrow> P n\<close>
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   139
    and \<open>B n \<Longrightarrow> Q n\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   140
  {
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   141
    case 1
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   142
    note \<open>A (Suc n)\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   143
    show "P (Suc n)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   144
  next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   145
    case 2
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   146
    note \<open>B (Suc n)\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   147
    show "Q (Suc n)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   148
  }
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   149
qed
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   150
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   151
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   152
subsubsection \<open>Compound simultaneous goals\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   153
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   154
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   155
  The following pattern illustrates the slightly more complex
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   156
  situation of simultaneous goals with individual local assumptions.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   157
  In compound simultaneous statements like this, local assumptions
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   158
  need to be included into each goal, using @{text "\<Longrightarrow>"} of the Pure
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   159
  framework.  In contrast, local parameters do not require separate
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   160
  @{text "\<And>"} prefixes here, but may be moved into the common context
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   161
  of the whole statement.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   162
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   163
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   164
lemma
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   165
  fixes n :: nat
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   166
    and x :: 'a
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   167
    and y :: 'b
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   168
  shows "A n x \<Longrightarrow> P n x"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   169
    and "B n y \<Longrightarrow> Q n y"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   170
proof (induct n arbitrary: x y)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   171
  case 0
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   172
  {
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   173
    case 1
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   174
    note prem = \<open>A 0 x\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   175
    show "P 0 x" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   176
  }
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   177
  {
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   178
    case 2
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   179
    note prem = \<open>B 0 y\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   180
    show "Q 0 y" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   181
  }
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   182
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   183
  case (Suc n)
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   184
  note hyps = \<open>\<And>x. A n x \<Longrightarrow> P n x\<close> \<open>\<And>y. B n y \<Longrightarrow> Q n y\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   185
  then have some_intermediate_result sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   186
  {
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   187
    case 1
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   188
    note prem = \<open>A (Suc n) x\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   189
    show "P (Suc n) x" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   190
  }
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   191
  {
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   192
    case 2
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   193
    note prem = \<open>B (Suc n) y\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   194
    show "Q (Suc n) y" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   195
  }
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   196
qed
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   197
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   198
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   199
  Here @{text "induct"} provides again nested cases with numbered
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   200
  sub-cases, which allows to share common parts of the body context.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   201
  In typical applications, there could be a long intermediate proof of
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   202
  general consequences of the induction hypotheses, before finishing
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   203
  each conclusion separately.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   204
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   205
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   206
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   207
subsection \<open>Multiple rules\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   208
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   209
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   210
  Multiple induction rules emerge from mutual definitions of
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   211
  datatypes, inductive predicates, functions etc.  The @{text
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   212
  "induct"} method accepts replicated arguments (with @{text "and"}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   213
  separator), corresponding to each projection of the induction
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   214
  principle.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   215
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   216
  The goal statement essentially follows the same arrangement,
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   217
  although it might be subdivided into simultaneous sub-problems as
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   218
  before!
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   219
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   220
58310
91ea607a34d8 updated news
blanchet
parents: 58270
diff changeset
   221
datatype foo = Foo1 nat | Foo2 bar
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   222
  and bar = Bar1 bool | Bar2 bazar
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   223
  and bazar = Bazar foo
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   224
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   225
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   226
  The pack of induction rules for this datatype is: @{thm [display]
58270
16648edf16e3 more porting to new datatypes
blanchet
parents: 58249
diff changeset
   227
  foo.induct [no_vars] bar.induct [no_vars] bazar.induct [no_vars]}
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   228
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   229
  This corresponds to the following basic proof pattern:
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   230
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   231
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   232
lemma
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   233
  fixes foo :: foo
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   234
    and bar :: bar
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   235
    and bazar :: bazar
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   236
  shows "P foo"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   237
    and "Q bar"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   238
    and "R bazar"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   239
proof (induct foo and bar and bazar)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   240
  case (Foo1 n)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   241
  show "P (Foo1 n)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   242
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   243
  case (Foo2 bar)
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   244
  note \<open>Q bar\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   245
  show "P (Foo2 bar)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   246
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   247
  case (Bar1 b)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   248
  show "Q (Bar1 b)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   249
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   250
  case (Bar2 bazar)
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   251
  note \<open>R bazar\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   252
  show "Q (Bar2 bazar)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   253
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   254
  case (Bazar foo)
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   255
  note \<open>P foo\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   256
  show "R (Bazar foo)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   257
qed
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   258
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   259
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   260
  This can be combined with the previous techniques for compound
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   261
  statements, e.g.\ like this.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   262
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   263
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   264
lemma
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   265
  fixes x :: 'a and y :: 'b and z :: 'c
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   266
    and foo :: foo
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   267
    and bar :: bar
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   268
    and bazar :: bazar
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   269
  shows
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   270
    "A x foo \<Longrightarrow> P x foo"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   271
  and
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   272
    "B1 y bar \<Longrightarrow> Q1 y bar"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   273
    "B2 y bar \<Longrightarrow> Q2 y bar"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   274
  and
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   275
    "C1 z bazar \<Longrightarrow> R1 z bazar"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   276
    "C2 z bazar \<Longrightarrow> R2 z bazar"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   277
    "C3 z bazar \<Longrightarrow> R3 z bazar"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   278
proof (induct foo and bar and bazar arbitrary: x and y and z)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   279
  oops
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   280
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   281
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   282
subsection \<open>Inductive predicates\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   283
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   284
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   285
  The most basic form of induction involving predicates (or sets)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   286
  essentially eliminates a given membership fact.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   287
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   288
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   289
inductive Even :: "nat \<Rightarrow> bool" where
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   290
  zero: "Even 0"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   291
| double: "Even n \<Longrightarrow> Even (2 * n)"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   292
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   293
lemma
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   294
  assumes "Even n"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   295
  shows "P n"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   296
  using assms
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   297
proof induct
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   298
  case zero
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   299
  show "P 0" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   300
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   301
  case (double n)
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   302
  note \<open>Even n\<close> and \<open>P n\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   303
  show "P (2 * n)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   304
qed
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   305
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   306
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   307
  Alternatively, an initial rule statement may be proven as follows,
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   308
  performing ``in-situ'' elimination with explicit rule specification.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   309
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   310
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   311
lemma "Even n \<Longrightarrow> P n"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   312
proof (induct rule: Even.induct)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   313
  oops
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   314
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   315
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   316
  Simultaneous goals do not introduce anything new.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   317
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   318
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   319
lemma
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   320
  assumes "Even n"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   321
  shows "P1 n" and "P2 n"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   322
  using assms
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   323
proof induct
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   324
  case zero
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   325
  {
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   326
    case 1
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   327
    show "P1 0" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   328
  next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   329
    case 2
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   330
    show "P2 0" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   331
  }
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   332
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   333
  case (double n)
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   334
  note \<open>Even n\<close> and \<open>P1 n\<close> and \<open>P2 n\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   335
  {
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   336
    case 1
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   337
    show "P1 (2 * n)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   338
  next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   339
    case 2
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   340
    show "P2 (2 * n)" sorry
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   341
  }
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   342
qed
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   343
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   344
text \<open>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   345
  Working with mutual rules requires special care in composing the
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   346
  statement as a two-level conjunction, using lists of propositions
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   347
  separated by @{text "and"}.  For example:
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   348
\<close>
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   349
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   350
inductive Evn :: "nat \<Rightarrow> bool" and Odd :: "nat \<Rightarrow> bool"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   351
where
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   352
  zero: "Evn 0"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   353
| succ_Evn: "Evn n \<Longrightarrow> Odd (Suc n)"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   354
| succ_Odd: "Odd n \<Longrightarrow> Evn (Suc n)"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   355
24609
wenzelm
parents: 24608
diff changeset
   356
lemma
wenzelm
parents: 24608
diff changeset
   357
    "Evn n \<Longrightarrow> P1 n"
wenzelm
parents: 24608
diff changeset
   358
    "Evn n \<Longrightarrow> P2 n"
wenzelm
parents: 24608
diff changeset
   359
    "Evn n \<Longrightarrow> P3 n"
wenzelm
parents: 24608
diff changeset
   360
  and
wenzelm
parents: 24608
diff changeset
   361
    "Odd n \<Longrightarrow> Q1 n"
wenzelm
parents: 24608
diff changeset
   362
    "Odd n \<Longrightarrow> Q2 n"
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   363
proof (induct rule: Evn_Odd.inducts)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   364
  case zero
24609
wenzelm
parents: 24608
diff changeset
   365
  { case 1 show "P1 0" sorry }
wenzelm
parents: 24608
diff changeset
   366
  { case 2 show "P2 0" sorry }
wenzelm
parents: 24608
diff changeset
   367
  { case 3 show "P3 0" sorry }
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   368
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   369
  case (succ_Evn n)
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   370
  note \<open>Evn n\<close> and \<open>P1 n\<close> \<open>P2 n\<close> \<open>P3 n\<close>
24609
wenzelm
parents: 24608
diff changeset
   371
  { case 1 show "Q1 (Suc n)" sorry }
wenzelm
parents: 24608
diff changeset
   372
  { case 2 show "Q2 (Suc n)" sorry }
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   373
next
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   374
  case (succ_Odd n)
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   375
  note \<open>Odd n\<close> and \<open>Q1 n\<close> \<open>Q2 n\<close>
24609
wenzelm
parents: 24608
diff changeset
   376
  { case 1 show "P1 (Suc n)" sorry }
wenzelm
parents: 24608
diff changeset
   377
  { case 2 show "P2 (Suc n)" sorry }
wenzelm
parents: 24608
diff changeset
   378
  { case 3 show "P3 (Suc n)" sorry }
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   379
qed
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   380
44164
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   381
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   382
text \<open>
44164
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   383
  Cases and hypotheses in each case can be named explicitly.
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   384
\<close>
44164
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   385
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   386
inductive star :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'a \<Rightarrow> bool" for r
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   387
where
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   388
  refl: "star r x x"
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   389
| step: "r x y \<Longrightarrow> star r y z \<Longrightarrow> star r x z"
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   390
60530
44f9873d6f6f isabelle update_cartouches;
wenzelm
parents: 58889
diff changeset
   391
text \<open>Underscores are replaced by the default name hyps:\<close>
44164
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   392
53379
74920496ab71 minor tuning;
wenzelm
parents: 44164
diff changeset
   393
lemmas star_induct = star.induct [case_names base step[r _ IH]]
44164
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   394
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   395
lemma "star r x y \<Longrightarrow> star r y z \<Longrightarrow> star r x z"
53379
74920496ab71 minor tuning;
wenzelm
parents: 44164
diff changeset
   396
proof (induct rule: star_induct) print_cases
74920496ab71 minor tuning;
wenzelm
parents: 44164
diff changeset
   397
  case base
74920496ab71 minor tuning;
wenzelm
parents: 44164
diff changeset
   398
  then show ?case .
44164
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   399
next
53379
74920496ab71 minor tuning;
wenzelm
parents: 44164
diff changeset
   400
  case (step a b c) print_facts
74920496ab71 minor tuning;
wenzelm
parents: 44164
diff changeset
   401
  from step.prems have "star r b z" by (rule step.IH)
74920496ab71 minor tuning;
wenzelm
parents: 44164
diff changeset
   402
  with step.r show ?case by (rule star.step)
44164
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   403
qed
238c5ea1e2ce documented extended version of case_names attribute
nipkow
parents: 34915
diff changeset
   404
24608
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   405
end