doc-src/IsarRef/Thy/Synopsis.thy
author wenzelm
Wed, 01 Jun 2011 12:39:04 +0200
changeset 44123 6e83c2f73240
parent 44122 36daee4cc9c9
child 44124 8c0a49d72857
permissions -rw-r--r--
some material on "Calculational reasoning";
wenzelm@44121
     1
theory Synopsis
wenzelm@44121
     2
imports Base Main
wenzelm@44121
     3
begin
wenzelm@44121
     4
wenzelm@44121
     5
chapter {* Synopsis *}
wenzelm@44121
     6
wenzelm@44121
     7
section {* Notepad *}
wenzelm@44121
     8
wenzelm@44121
     9
text {*
wenzelm@44121
    10
  An Isar proof body serves as mathematical notepad to compose logical
wenzelm@44122
    11
  content, consisting of types, terms, facts.
wenzelm@44121
    12
*}
wenzelm@44121
    13
wenzelm@44121
    14
wenzelm@44122
    15
subsection {* Types and terms *}
wenzelm@44122
    16
wenzelm@44122
    17
notepad
wenzelm@44122
    18
begin
wenzelm@44122
    19
  txt {* Locally fixed entities: *}
wenzelm@44122
    20
  fix x   -- {* local constant, without any type information yet *}
wenzelm@44122
    21
  fix x :: 'a  -- {* variant with explicit type-constraint for subsequent use*}
wenzelm@44122
    22
wenzelm@44122
    23
  fix a b
wenzelm@44122
    24
  assume "a = b"  -- {* type assignment at first occurrence in concrete term *}
wenzelm@44122
    25
wenzelm@44122
    26
  txt {* Definitions (non-polymorphic): *}
wenzelm@44122
    27
  def x \<equiv> "t::'a"
wenzelm@44122
    28
wenzelm@44122
    29
  txt {* Abbreviations (polymorphic): *}
wenzelm@44122
    30
  let ?f = "\<lambda>x. x"
wenzelm@44122
    31
  term "?f ?f"
wenzelm@44122
    32
wenzelm@44122
    33
  txt {* Notation: *}
wenzelm@44122
    34
  write x  ("***")
wenzelm@44122
    35
end
wenzelm@44122
    36
wenzelm@44122
    37
wenzelm@44121
    38
subsection {* Facts *}
wenzelm@44121
    39
wenzelm@44121
    40
text {*
wenzelm@44121
    41
  A fact is a simultaneous list of theorems.
wenzelm@44121
    42
*}
wenzelm@44121
    43
wenzelm@44121
    44
wenzelm@44121
    45
subsubsection {* Producing facts *}
wenzelm@44121
    46
wenzelm@44121
    47
notepad
wenzelm@44121
    48
begin
wenzelm@44121
    49
wenzelm@44121
    50
  txt {* Via assumption (``lambda''): *}
wenzelm@44121
    51
  assume a: A
wenzelm@44121
    52
wenzelm@44121
    53
  txt {* Via proof (``let''): *}
wenzelm@44121
    54
  have b: B sorry
wenzelm@44121
    55
wenzelm@44121
    56
  txt {* Via abbreviation (``let''): *}
wenzelm@44121
    57
  note c = a b
wenzelm@44121
    58
wenzelm@44121
    59
end
wenzelm@44121
    60
wenzelm@44121
    61
wenzelm@44121
    62
subsubsection {* Referencing facts *}
wenzelm@44121
    63
wenzelm@44121
    64
notepad
wenzelm@44121
    65
begin
wenzelm@44121
    66
  txt {* Via explicit name: *}
wenzelm@44121
    67
  assume a: A
wenzelm@44121
    68
  note a
wenzelm@44121
    69
wenzelm@44121
    70
  txt {* Via implicit name: *}
wenzelm@44121
    71
  assume A
wenzelm@44121
    72
  note this
wenzelm@44121
    73
wenzelm@44121
    74
  txt {* Via literal proposition (unification with results from the proof text): *}
wenzelm@44121
    75
  assume A
wenzelm@44121
    76
  note `A`
wenzelm@44121
    77
wenzelm@44121
    78
  assume "\<And>x. B x"
wenzelm@44121
    79
  note `B a`
wenzelm@44121
    80
  note `B b`
wenzelm@44121
    81
end
wenzelm@44121
    82
wenzelm@44121
    83
wenzelm@44121
    84
subsubsection {* Manipulating facts *}
wenzelm@44121
    85
wenzelm@44121
    86
notepad
wenzelm@44121
    87
begin
wenzelm@44121
    88
  txt {* Instantiation: *}
wenzelm@44121
    89
  assume a: "\<And>x. B x"
wenzelm@44121
    90
  note a
wenzelm@44121
    91
  note a [of b]
wenzelm@44121
    92
  note a [where x = b]
wenzelm@44121
    93
wenzelm@44121
    94
  txt {* Backchaining: *}
wenzelm@44121
    95
  assume 1: A
wenzelm@44121
    96
  assume 2: "A \<Longrightarrow> C"
wenzelm@44121
    97
  note 2 [OF 1]
wenzelm@44121
    98
  note 1 [THEN 2]
wenzelm@44121
    99
wenzelm@44121
   100
  txt {* Symmetric results: *}
wenzelm@44121
   101
  assume "x = y"
wenzelm@44121
   102
  note this [symmetric]
wenzelm@44121
   103
wenzelm@44121
   104
  assume "x \<noteq> y"
wenzelm@44121
   105
  note this [symmetric]
wenzelm@44121
   106
wenzelm@44121
   107
  txt {* Adhoc-simplication (take care!): *}
wenzelm@44121
   108
  assume "P ([] @ xs)"
wenzelm@44121
   109
  note this [simplified]
wenzelm@44121
   110
end
wenzelm@44121
   111
wenzelm@44121
   112
wenzelm@44121
   113
subsubsection {* Projections *}
wenzelm@44121
   114
wenzelm@44121
   115
text {*
wenzelm@44121
   116
  Isar facts consist of multiple theorems.  There is notation to project
wenzelm@44121
   117
  interval ranges.
wenzelm@44121
   118
*}
wenzelm@44121
   119
wenzelm@44121
   120
notepad
wenzelm@44121
   121
begin
wenzelm@44121
   122
  assume stuff: A B C D
wenzelm@44121
   123
  note stuff(1)
wenzelm@44121
   124
  note stuff(2-3)
wenzelm@44121
   125
  note stuff(2-)
wenzelm@44121
   126
end
wenzelm@44121
   127
wenzelm@44121
   128
wenzelm@44121
   129
subsubsection {* Naming conventions *}
wenzelm@44121
   130
wenzelm@44121
   131
text {*
wenzelm@44121
   132
  \begin{itemize}
wenzelm@44121
   133
wenzelm@44121
   134
  \item Lower-case identifiers are usually preferred.
wenzelm@44121
   135
wenzelm@44121
   136
  \item Facts can be named after the main term within the proposition.
wenzelm@44121
   137
wenzelm@44121
   138
  \item Facts should \emph{not} be named after the command that
wenzelm@44121
   139
  introduced them (@{command "assume"}, @{command "have"}).  This is
wenzelm@44121
   140
  misleading and hard to maintain.
wenzelm@44121
   141
wenzelm@44121
   142
  \item Natural numbers can be used as ``meaningless'' names (more
wenzelm@44121
   143
  appropriate than @{text "a1"}, @{text "a2"} etc.)
wenzelm@44121
   144
wenzelm@44121
   145
  \item Symbolic identifiers are supported (e.g. @{text "*"}, @{text
wenzelm@44121
   146
  "**"}, @{text "***"}).
wenzelm@44121
   147
wenzelm@44121
   148
  \end{itemize}
wenzelm@44121
   149
*}
wenzelm@44121
   150
wenzelm@44121
   151
wenzelm@44121
   152
subsection {* Block structure *}
wenzelm@44121
   153
wenzelm@44121
   154
text {*
wenzelm@44121
   155
  The formal notepad is block structured.  The fact produced by the last
wenzelm@44121
   156
  entry of a block is exported into the outer context.
wenzelm@44121
   157
*}
wenzelm@44121
   158
wenzelm@44121
   159
notepad
wenzelm@44121
   160
begin
wenzelm@44121
   161
  {
wenzelm@44121
   162
    have a: A sorry
wenzelm@44121
   163
    have b: B sorry
wenzelm@44121
   164
    note a b
wenzelm@44121
   165
  }
wenzelm@44121
   166
  note this
wenzelm@44121
   167
  note `A`
wenzelm@44121
   168
  note `B`
wenzelm@44121
   169
end
wenzelm@44121
   170
wenzelm@44121
   171
text {* Explicit blocks as well as implicit blocks of nested goal
wenzelm@44121
   172
  statements (e.g.\ @{command have}) automatically introduce one extra
wenzelm@44121
   173
  pair of parentheses in reserve.  The @{command next} command allows
wenzelm@44121
   174
  to ``jump'' between these sub-blocks. *}
wenzelm@44121
   175
wenzelm@44121
   176
notepad
wenzelm@44121
   177
begin
wenzelm@44121
   178
wenzelm@44121
   179
  {
wenzelm@44121
   180
    have a: A sorry
wenzelm@44121
   181
  next
wenzelm@44121
   182
    have b: B
wenzelm@44121
   183
    proof -
wenzelm@44121
   184
      show B sorry
wenzelm@44121
   185
    next
wenzelm@44121
   186
      have c: C sorry
wenzelm@44121
   187
    next
wenzelm@44121
   188
      have d: D sorry
wenzelm@44121
   189
    qed
wenzelm@44121
   190
  }
wenzelm@44121
   191
wenzelm@44121
   192
  txt {* Alternative version with explicit parentheses everywhere: *}
wenzelm@44121
   193
wenzelm@44121
   194
  {
wenzelm@44121
   195
    {
wenzelm@44121
   196
      have a: A sorry
wenzelm@44121
   197
    }
wenzelm@44121
   198
    {
wenzelm@44121
   199
      have b: B
wenzelm@44121
   200
      proof -
wenzelm@44121
   201
        {
wenzelm@44121
   202
          show B sorry
wenzelm@44121
   203
        }
wenzelm@44121
   204
        {
wenzelm@44121
   205
          have c: C sorry
wenzelm@44121
   206
        }
wenzelm@44121
   207
        {
wenzelm@44121
   208
          have d: D sorry
wenzelm@44121
   209
        }
wenzelm@44121
   210
      qed
wenzelm@44121
   211
    }
wenzelm@44121
   212
  }
wenzelm@44121
   213
wenzelm@44121
   214
end
wenzelm@44121
   215
wenzelm@44123
   216
wenzelm@44123
   217
section {* Calculational reasoning *}
wenzelm@44123
   218
wenzelm@44123
   219
text {*
wenzelm@44123
   220
  For example, see @{file "~~/src/HOL/Isar_Examples/Group.thy"}.
wenzelm@44123
   221
*}
wenzelm@44123
   222
wenzelm@44123
   223
wenzelm@44123
   224
subsection {* Special names in Isar proofs *}
wenzelm@44123
   225
wenzelm@44123
   226
text {*
wenzelm@44123
   227
  \begin{itemize}
wenzelm@44123
   228
wenzelm@44123
   229
  \item term @{text "?thesis"} --- the main conclusion of the
wenzelm@44123
   230
  innermost pending claim
wenzelm@44123
   231
wenzelm@44123
   232
  \item term @{text "\<dots>"} --- the argument of the last explicitly
wenzelm@44123
   233
    stated result (for infix application this is the right-hand side)
wenzelm@44123
   234
wenzelm@44123
   235
  \item fact @{text "this"} --- the last result produced in the text
wenzelm@44123
   236
wenzelm@44123
   237
  \end{itemize}
wenzelm@44123
   238
*}
wenzelm@44123
   239
wenzelm@44123
   240
notepad
wenzelm@44123
   241
begin
wenzelm@44123
   242
  have "x = y"
wenzelm@44123
   243
  proof -
wenzelm@44123
   244
    term ?thesis
wenzelm@44123
   245
    show ?thesis sorry
wenzelm@44123
   246
    term ?thesis  -- {* static! *}
wenzelm@44123
   247
  qed
wenzelm@44123
   248
  term "\<dots>"
wenzelm@44123
   249
  thm this
wenzelm@44123
   250
end
wenzelm@44123
   251
wenzelm@44123
   252
text {* Calculational reasoning maintains the special fact called
wenzelm@44123
   253
  ``@{text calculation}'' in the background.  Certain language
wenzelm@44123
   254
  elements combine primary @{text this} with secondary @{text
wenzelm@44123
   255
  calculation}. *}
wenzelm@44123
   256
wenzelm@44123
   257
wenzelm@44123
   258
subsection {* Transitive chains *}
wenzelm@44123
   259
wenzelm@44123
   260
text {* The Idea is to combine @{text this} and @{text calculation}
wenzelm@44123
   261
  via typical @{text trans} rules (see also @{command
wenzelm@44123
   262
  print_trans_rules}): *}
wenzelm@44123
   263
wenzelm@44123
   264
thm trans
wenzelm@44123
   265
thm less_trans
wenzelm@44123
   266
thm less_le_trans
wenzelm@44123
   267
wenzelm@44123
   268
notepad
wenzelm@44123
   269
begin
wenzelm@44123
   270
  txt {* Plain bottom-up calculation: *}
wenzelm@44123
   271
  have "a = b" sorry
wenzelm@44123
   272
  also
wenzelm@44123
   273
  have "b = c" sorry
wenzelm@44123
   274
  also
wenzelm@44123
   275
  have "c = d" sorry
wenzelm@44123
   276
  finally
wenzelm@44123
   277
  have "a = d" .
wenzelm@44123
   278
wenzelm@44123
   279
  txt {* Variant using the @{text "\<dots>"} abbreviation: *}
wenzelm@44123
   280
  have "a = b" sorry
wenzelm@44123
   281
  also
wenzelm@44123
   282
  have "\<dots> = c" sorry
wenzelm@44123
   283
  also
wenzelm@44123
   284
  have "\<dots> = d" sorry
wenzelm@44123
   285
  finally
wenzelm@44123
   286
  have "a = d" .
wenzelm@44123
   287
wenzelm@44123
   288
  txt {* Top-down version with explicit claim at the head: *}
wenzelm@44123
   289
  have "a = d"
wenzelm@44123
   290
  proof -
wenzelm@44123
   291
    have "a = b" sorry
wenzelm@44123
   292
    also
wenzelm@44123
   293
    have "\<dots> = c" sorry
wenzelm@44123
   294
    also
wenzelm@44123
   295
    have "\<dots> = d" sorry
wenzelm@44123
   296
    finally
wenzelm@44123
   297
    show ?thesis .
wenzelm@44123
   298
  qed
wenzelm@44123
   299
next
wenzelm@44123
   300
  txt {* Mixed inequalities (require suitable base type): *}
wenzelm@44123
   301
  fix a b c d :: nat
wenzelm@44123
   302
wenzelm@44123
   303
  have "a < b" sorry
wenzelm@44123
   304
  also
wenzelm@44123
   305
  have "b\<le> c" sorry
wenzelm@44123
   306
  also
wenzelm@44123
   307
  have "c = d" sorry
wenzelm@44123
   308
  finally
wenzelm@44123
   309
  have "a < d" .
wenzelm@44123
   310
end
wenzelm@44123
   311
wenzelm@44123
   312
wenzelm@44123
   313
subsubsection {* Notes *}
wenzelm@44123
   314
wenzelm@44123
   315
text {*
wenzelm@44123
   316
  \begin{itemize}
wenzelm@44123
   317
wenzelm@44123
   318
  \item The notion of @{text trans} rule is very general due to the
wenzelm@44123
   319
  flexibility of Isabelle/Pure rule composition.
wenzelm@44123
   320
wenzelm@44123
   321
  \item User applications may declare there own rules, with some care
wenzelm@44123
   322
  about the operational details of higher-order unification.
wenzelm@44123
   323
wenzelm@44123
   324
  \end{itemize}
wenzelm@44123
   325
*}
wenzelm@44123
   326
wenzelm@44123
   327
wenzelm@44123
   328
subsection {* Degenerate calculations and bigstep reasoning *}
wenzelm@44123
   329
wenzelm@44123
   330
text {* The Idea is to append @{text this} to @{text calculation},
wenzelm@44123
   331
  without rule composition.  *}
wenzelm@44123
   332
wenzelm@44123
   333
notepad
wenzelm@44123
   334
begin
wenzelm@44123
   335
  txt {* A vacous proof: *}
wenzelm@44123
   336
  have A sorry
wenzelm@44123
   337
  moreover
wenzelm@44123
   338
  have B sorry
wenzelm@44123
   339
  moreover
wenzelm@44123
   340
  have C sorry
wenzelm@44123
   341
  ultimately
wenzelm@44123
   342
  have A and B and C .
wenzelm@44123
   343
next
wenzelm@44123
   344
  txt {* Slightly more content (trivial bigstep reasoning): *}
wenzelm@44123
   345
  have A sorry
wenzelm@44123
   346
  moreover
wenzelm@44123
   347
  have B sorry
wenzelm@44123
   348
  moreover
wenzelm@44123
   349
  have C sorry
wenzelm@44123
   350
  ultimately
wenzelm@44123
   351
  have "A \<and> B \<and> C" by blast
wenzelm@44123
   352
next
wenzelm@44123
   353
  txt {* More ambitous bigstep reasoning involving structured results: *}
wenzelm@44123
   354
  have "A \<or> B \<or> C" sorry
wenzelm@44123
   355
  moreover
wenzelm@44123
   356
  { assume A have R sorry }
wenzelm@44123
   357
  moreover
wenzelm@44123
   358
  { assume B have R sorry }
wenzelm@44123
   359
  moreover
wenzelm@44123
   360
  { assume C have R sorry }
wenzelm@44123
   361
  ultimately
wenzelm@44123
   362
  have R by blast  -- {* ``big-bang integration'' of proof blocks (occasionally fragile) *}
wenzelm@44123
   363
end
wenzelm@44123
   364
wenzelm@44121
   365
end