src/HOL/Induct/Common_Patterns.thy
author haftmann
Wed, 18 Feb 2009 08:23:11 +0100
changeset 29961 c7849326100e
parent 24609 3f238d4987c0
child 34915 7894c7dab132
permissions -rw-r--r--
stripped ID
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
     5
header {* Common patterns of induction *}
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    11
text {*
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.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    22
*}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    23
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    24
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    25
subsection {* Variations on statement structure *}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    26
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    27
subsubsection {* Local facts and parameters *}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    28
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    29
text {*
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.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    35
*}
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"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    41
  shows "P n x" using `A n x`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    44
  note prem = `A 0 x`
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)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    48
  note hyp = `\<And>x. A n x \<Longrightarrow> P n x`
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    49
    and prem = `A (Suc n) x`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    54
subsubsection {* Local definitions *}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    55
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    56
text {*
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.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    63
*}
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)"
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    68
  shows "P (a x)" using `A (a x)`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    71
  note prem = `A (a x)`
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    72
    and defn = `0 = a x`
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)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    76
  note hyp = `\<And>x. A (a x) \<Longrightarrow> n = a x \<Longrightarrow> P (a x)`
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    77
    and prem = `A (a x)`
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    78
    and defn = `Suc n = a x`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    82
text {*
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.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    86
*}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    87
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    88
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    89
subsubsection {* Simple simultaneous goals *}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    90
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    91
text {*
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.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
    95
*}
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   108
  note hyps = `P n` `Q n`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   112
  note hyps = `P n` `Q n`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   116
text {*
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.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   119
*}
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   129
    note `A 0`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   133
    note `B 0`
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)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   138
  note `A n \<Longrightarrow> P n`
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   139
    and `B n \<Longrightarrow> Q n`
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   140
  {
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   141
    case 1
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   142
    note `A (Suc n)`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   146
    note `B (Suc n)`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   152
subsubsection {* Compound simultaneous goals *}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   153
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   154
text {*
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.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   162
*}
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   174
    note prem = `A 0 x`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   179
    note prem = `B 0 y`
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)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   184
  note hyps = `\<And>x. A n x \<Longrightarrow> P n x` `\<And>y. B n y \<Longrightarrow> Q n y`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   188
    note prem = `A (Suc n) x`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   193
    note prem = `B (Suc n) y`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   198
text {*
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.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   204
*}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   205
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   206
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   207
subsection {* Multiple rules *}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   208
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   209
text {*
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!
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   219
*}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   220
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   221
datatype foo = Foo1 nat | Foo2 bar
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   225
text {*
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   226
  The pack of induction rules for this datatype is: @{thm [display]
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   227
  foo_bar_bazar.inducts [no_vars]}
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:
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   230
*}
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)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   244
  note `Q bar`
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)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   251
  note `R bazar`
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)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   255
  note `P foo`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   259
text {*
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.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   262
*}
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   282
subsection {* Inductive predicates *}
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   283
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   284
text {*
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.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   287
*}
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)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   302
  note `Even n` and `P n`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   306
text {*
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.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   309
*}
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   315
text {*
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   316
  Simultaneous goals do not introduce anything new.
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   317
*}
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)
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   334
  note `Even n` and `P1 n` and `P2 n`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   344
text {*
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:
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   348
*}
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)
24609
wenzelm
parents: 24608
diff changeset
   370
  note `Evn n` and `P1 n` `P2 n` `P3 n`
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)
24609
wenzelm
parents: 24608
diff changeset
   375
  note `Odd n` and `Q1 n` `Q2 n`
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
aae1095dbe3b HOL/Induct/Common_Patterns.thy
wenzelm
parents:
diff changeset
   381
end