doc-src/IsarTut/Tutorial/Tutorial.thy
author nipkow
Wed, 25 Sep 2002 07:42:24 +0200
changeset 13575 ecb6ecd9af13
parent 13227 031b119d265d
permissions -rw-r--r--
added nat_split
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13202
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
     1
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
     2
(*<*)
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
     3
theory Tutorial = Main:
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
     4
(*>*)
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
     5
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
     6
chapter {* Introduction *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
     7
13227
wenzelm
parents: 13205
diff changeset
     8
chapter {* Technical issues *}
wenzelm
parents: 13205
diff changeset
     9
wenzelm
parents: 13205
diff changeset
    10
section {* Source texts *}
wenzelm
parents: 13205
diff changeset
    11
wenzelm
parents: 13205
diff changeset
    12
section {* Interaction and debugging *}
wenzelm
parents: 13205
diff changeset
    13
13205
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    14
section {* Step-by-step examples *}
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    15
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    16
subsection {* Summing natural numbers *}
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    17
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    18
theorem "2 * (\<Sum>i < n + 1. i) = n * (n + 1)"  (is "?P n")
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    19
proof (induct n)
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    20
  case 0
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    21
  then show "?P 0" by simp
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    22
next
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    23
  case (Suc n)
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    24
  let "?S n = _" = "?P n"
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    25
  have "?S (n + 1) = ?S n + 2 * (n + 1)" by simp
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    26
  also have "?S n = n * (n + 1)" .
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    27
  also have "\<dots> + 2 * (n + 1) = (n + 1) * (n + 2)" by simp
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    28
  finally show "?P (Suc n)" by simp
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    29
qed
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    30
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    31
theorem "2 * (\<Sum>i < n + 1. i) = n * (n + 1)"
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    32
proof (induct n)
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    33
  case 0
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    34
  then show ?case by simp
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    35
next
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    36
  case Suc
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    37
  then show ?case by simp
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    38
qed
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    39
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    40
theorem "2 * (\<Sum>i < n + 1. i) = n * (n + 1)"
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    41
  by (induct n) simp_all
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    42
    
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    43
theorem "2 * (\<Sum>i < n + 1. i) = n * (n + 1)"
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    44
  apply (induct n)
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    45
   apply simp_all
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    46
  done
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    47
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    48
050cd555d3a2 examples;
wenzelm
parents: 13202
diff changeset
    49
13202
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    50
chapter {* Interaction and debugging *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    51
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    52
chapter {* Calculational reasoning *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    53
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    54
chapter {* Proof by cases and induction *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    55
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    56
chapter {* General natural deduction *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    57
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    58
chapter {* Example: FIXME *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    59
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    60
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    61
chapter FIXME
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    62
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    63
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    64
section {* Formal document preparation *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    65
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    66
subsection {* Example *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    67
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    68
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    69
  See this very document itself.
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    70
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    71
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    72
subsection {* Getting started *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    73
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    74
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    75
  \verb"isatool mkdir Test && isatool make"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    76
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    77
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    78
section {* Human-readable proof composition in Isar *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    79
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    80
subsection {* Getting started *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    81
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    82
text {* Claim a trivial goal in order to enter proof mode @{text \<dots>} *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    83
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    84
lemma True
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    85
proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    86
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    87
  txt {* After the canonical initial refinement step we are left
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    88
    within an \emph{proof body}. *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    89
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    90
  txt {* Here we may augment the present local {proof context} as we
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    91
    please. *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    92
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    93
  fix something
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    94
  assume a: "anything something"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    95
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    96
  txt {* Note that the present configuration may be inspected by
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    97
  several \emph{diagnostic commands}. *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    98
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
    99
  term something  -- "@{term [show_types] something}"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   100
  term anything  -- "@{term [show_types] anything}"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   101
  thm a  -- {* @{thm a} *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   102
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   103
  txt {* We may state local (auxiliary) results as well. *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   104
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   105
  have True proof qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   106
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   107
  txt {* We are now satisfied. *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   108
qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   109
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   110
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   111
subsection {* Calculational Reasoning *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   112
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   113
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   114
  Isar is mainly about Natural Deduction, but Calculational Reasoning
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   115
  turns out as a simplified instance of that, so we demonstrate it
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   116
  first.
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   117
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   118
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   119
subsubsection {* Transitive chains *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   120
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   121
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   122
  Technique: establish a chain of local facts, separated by \cmd{also}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   123
  and terminated by \cmd{finally}; another goal has to follow to point
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   124
  out the final result.
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   125
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   126
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   127
lemma "x1 = x4"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   128
proof -  -- "do nothing yet"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   129
  have "x1 = x2" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   130
  also
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   131
  have "x2 = x3" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   132
  also
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   133
  have "x3 = x4" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   134
  finally
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   135
  show "x1 = x4" .
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   136
qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   137
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   138
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   139
  This may be written more succinctly, using the special term binds
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   140
  ``@{text \<dots>}'' (for the right-hand side of the last statement) and
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   141
  ``@{text ?thesis}'' (for the original claim at the head of the
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   142
  proof).
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   143
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   144
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   145
lemma "x1 = x4"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   146
proof -
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   147
  have "x1 = x2" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   148
  also have "\<dots> = x3" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   149
  also have "\<dots> = x4" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   150
  finally show ?thesis .
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   151
qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   152
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   153
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   154
  The (implicit) forward-chaining steps involved in \cmd{also} and
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   155
  \cmd{finally} are declared in the current context.  The main library
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   156
  of Isabelle/HOL already knows about (mixed) transitivities of @{text
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   157
  "="}, @{text "<"}, @{text "\<le>"} etc.
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   158
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   159
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   160
lemma "(x1::nat) < x6"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   161
  -- {* restriction to type @{typ nat} ensures that @{text "<"} is really transitive *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   162
proof -
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   163
  have "x1 < x2" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   164
  also have "\<dots> \<le> x3" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   165
  also have "\<dots> = x4" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   166
  also have "\<dots> < x5" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   167
  also have "\<dots> = x6" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   168
  finally show ?thesis .
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   169
qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   170
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   171
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   172
  We may also calculate on propositions.
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   173
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   174
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   175
lemma True
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   176
proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   177
  have "A \<longrightarrow> B \<longrightarrow> C" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   178
  also have A sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   179
  also have B sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   180
  finally have C .
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   181
qed    
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   182
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   183
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   184
  This is getting pretty close to Dijkstra's preferred proof style.
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   185
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   186
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   187
lemma True
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   188
proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   189
  have [trans]: "\<And>X Y Z. X \<longrightarrow> Y \<Longrightarrow> Y \<longrightarrow> Z \<Longrightarrow> X \<longrightarrow> Z" by rules
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   190
  have "A \<longrightarrow> B" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   191
  also have "\<dots> \<longrightarrow> C" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   192
  also have "\<dots> \<longrightarrow> D" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   193
  finally have "A \<longrightarrow> D" .
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   194
qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   195
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   196
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   197
subsubsection {* Degenerate calculations and bigstep reasoning *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   198
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   199
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   200
  Instead of \cmd{also}/\cmd{finally} we may use degenerative steps
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   201
  \cmd{moreover}/\cmd{ultimately} to accumulate facts, without
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   202
  applying any forward rules yet.
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   203
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   204
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   205
lemma True
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   206
proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   207
  have A sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   208
  moreover have B sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   209
  moreover have C sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   210
  ultimately have A and B and C .  -- "Pretty obvious, right?"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   211
qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   212
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   213
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   214
  Both kinds of calculational elements may be used together.
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   215
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   216
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   217
lemma True
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   218
proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   219
  assume reasoning_pattern [trans]: "A \<Longrightarrow> B \<Longrightarrow> C \<Longrightarrow> D"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   220
  have A sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   221
  moreover have B sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   222
  moreover have C sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   223
  finally have D .
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   224
qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   225
  
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   226
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   227
subsection {* Natural deduction *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   228
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   229
subsubsection {* Primitive patterns *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   230
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   231
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   232
  The default theory context admits to perform canonical single-step
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   233
  reasoning (similar to Gentzen) without further ado.
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   234
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   235
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   236
lemma True
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   237
proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   238
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   239
  have True ..
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   240
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   241
  { assume False
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   242
    then have C .. }
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   243
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   244
  have "\<not> A"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   245
  proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   246
    assume A
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   247
    show False sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   248
  qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   249
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   250
  { assume "\<not> A" and A
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   251
    then have C .. }
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   252
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   253
  have "A \<longrightarrow> B"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   254
  proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   255
    assume A
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   256
    show B sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   257
  qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   258
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   259
  { assume "A \<longrightarrow> B" and A
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   260
    then have B .. }
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   261
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   262
  have "A \<and> B"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   263
  proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   264
    show A sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   265
    show B sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   266
  qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   267
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   268
  { assume "A \<and> B"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   269
    then have A .. }
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   270
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   271
  { assume "A \<and> B"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   272
    then have B .. }
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   273
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   274
  { assume A
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   275
    then have "A \<or> B" .. }
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   276
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   277
  { assume B
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   278
    then have "A \<or> B" .. }
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   279
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   280
  { assume "A \<or> B"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   281
    then have C
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   282
    proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   283
      assume A
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   284
      then show ?thesis sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   285
    next
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   286
      assume B
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   287
      then show ?thesis sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   288
    qed }
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   289
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   290
  have "\<forall>x. P x"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   291
  proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   292
    fix x
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   293
    show "P x" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   294
  qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   295
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   296
  { assume "\<forall>x. P x"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   297
    then have "P t" .. }
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   298
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   299
  have "\<exists>x. P x"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   300
  proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   301
    show "P t" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   302
  qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   303
  
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   304
  { assume "\<exists>x. P x"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   305
    then obtain x where "P x" ..
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   306
    note nothing  -- "relax" }
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   307
qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   308
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   309
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   310
  Certainly, this works with derived rules for defined concepts in the
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   311
  same manner.  E.g.\ use the simple-typed set-theory of Isabelle/HOL. *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   312
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   313
lemma True
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   314
proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   315
  have "y \<in> (\<Inter>x \<in> A. B x)"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   316
  proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   317
    fix x
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   318
    assume "x \<in> A"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   319
    show "y \<in> B x" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   320
  qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   321
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   322
  have "y \<in> (\<Union>x \<in> A. B x)"
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   323
  proof
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   324
    show "a \<in> A" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   325
    show "y \<in> B a" sorry
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   326
  qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   327
qed
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   328
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   329
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   330
subsubsection {* Variations in structure *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   331
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   332
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   333
  The design of the Isar language takes the user seriously
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   334
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   335
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   336
subsubsection {* Generalized elimination *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   337
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   338
subsubsection {* Scalable cases and induction *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   339
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   340
section {* Assimilating the old tactical style *}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   341
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   342
text {*
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   343
  Improper commands: 
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   344
  Observation: every Isar subproof may start with a ``script'' of
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   345
*}
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   346
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   347
(*<*)
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   348
end
53022e5f73ff initial setup;
wenzelm
parents:
diff changeset
   349
(*>*)