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