doc-src/IsarRef/Thy/Synopsis.thy
author wenzelm
Sat, 09 Jul 2011 21:53:27 +0200
changeset 43721 fad8634cee62
parent 42923 3ba51a3acff0
child 45103 a45121ffcfcb
permissions -rw-r--r--
echo prover input via raw_messages, for improved protocol tracing;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42917
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
     1
theory Synopsis
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
     2
imports Base Main
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
     3
begin
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
     4
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
     5
chapter {* Synopsis *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
     6
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
     7
section {* Notepad *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
     8
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
     9
text {*
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    10
  An Isar proof body serves as mathematical notepad to compose logical
42918
wenzelm
parents: 42917
diff changeset
    11
  content, consisting of types, terms, facts.
42917
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    12
*}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    13
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    14
42918
wenzelm
parents: 42917
diff changeset
    15
subsection {* Types and terms *}
wenzelm
parents: 42917
diff changeset
    16
wenzelm
parents: 42917
diff changeset
    17
notepad
wenzelm
parents: 42917
diff changeset
    18
begin
wenzelm
parents: 42917
diff changeset
    19
  txt {* Locally fixed entities: *}
wenzelm
parents: 42917
diff changeset
    20
  fix x   -- {* local constant, without any type information yet *}
wenzelm
parents: 42917
diff changeset
    21
  fix x :: 'a  -- {* variant with explicit type-constraint for subsequent use*}
wenzelm
parents: 42917
diff changeset
    22
wenzelm
parents: 42917
diff changeset
    23
  fix a b
wenzelm
parents: 42917
diff changeset
    24
  assume "a = b"  -- {* type assignment at first occurrence in concrete term *}
wenzelm
parents: 42917
diff changeset
    25
wenzelm
parents: 42917
diff changeset
    26
  txt {* Definitions (non-polymorphic): *}
wenzelm
parents: 42917
diff changeset
    27
  def x \<equiv> "t::'a"
wenzelm
parents: 42917
diff changeset
    28
wenzelm
parents: 42917
diff changeset
    29
  txt {* Abbreviations (polymorphic): *}
wenzelm
parents: 42917
diff changeset
    30
  let ?f = "\<lambda>x. x"
wenzelm
parents: 42917
diff changeset
    31
  term "?f ?f"
wenzelm
parents: 42917
diff changeset
    32
wenzelm
parents: 42917
diff changeset
    33
  txt {* Notation: *}
wenzelm
parents: 42917
diff changeset
    34
  write x  ("***")
wenzelm
parents: 42917
diff changeset
    35
end
wenzelm
parents: 42917
diff changeset
    36
wenzelm
parents: 42917
diff changeset
    37
42917
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    38
subsection {* Facts *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    39
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    40
text {*
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    41
  A fact is a simultaneous list of theorems.
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    42
*}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    43
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    44
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    45
subsubsection {* Producing facts *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    46
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    47
notepad
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    48
begin
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    49
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    50
  txt {* Via assumption (``lambda''): *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    51
  assume a: A
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    52
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    53
  txt {* Via proof (``let''): *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    54
  have b: B sorry
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    55
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    56
  txt {* Via abbreviation (``let''): *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    57
  note c = a b
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    58
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    59
end
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    60
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    61
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    62
subsubsection {* Referencing facts *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    63
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    64
notepad
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    65
begin
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    66
  txt {* Via explicit name: *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    67
  assume a: A
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    68
  note a
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    69
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    70
  txt {* Via implicit name: *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    71
  assume A
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    72
  note this
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    73
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    74
  txt {* Via literal proposition (unification with results from the proof text): *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    75
  assume A
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    76
  note `A`
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    77
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    78
  assume "\<And>x. B x"
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    79
  note `B a`
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    80
  note `B b`
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    81
end
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    82
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    83
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    84
subsubsection {* Manipulating facts *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    85
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    86
notepad
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    87
begin
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    88
  txt {* Instantiation: *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    89
  assume a: "\<And>x. B x"
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    90
  note a
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    91
  note a [of b]
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    92
  note a [where x = b]
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    93
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    94
  txt {* Backchaining: *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    95
  assume 1: A
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    96
  assume 2: "A \<Longrightarrow> C"
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    97
  note 2 [OF 1]
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    98
  note 1 [THEN 2]
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
    99
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   100
  txt {* Symmetric results: *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   101
  assume "x = y"
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   102
  note this [symmetric]
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   103
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   104
  assume "x \<noteq> y"
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   105
  note this [symmetric]
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   106
42922
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   107
  txt {* Adhoc-simplification (take care!): *}
42917
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   108
  assume "P ([] @ xs)"
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   109
  note this [simplified]
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   110
end
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   111
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   112
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   113
subsubsection {* Projections *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   114
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   115
text {*
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   116
  Isar facts consist of multiple theorems.  There is notation to project
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   117
  interval ranges.
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   118
*}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   119
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   120
notepad
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   121
begin
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   122
  assume stuff: A B C D
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   123
  note stuff(1)
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   124
  note stuff(2-3)
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   125
  note stuff(2-)
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   126
end
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   127
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   128
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   129
subsubsection {* Naming conventions *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   130
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   131
text {*
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   132
  \begin{itemize}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   133
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   134
  \item Lower-case identifiers are usually preferred.
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   135
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   136
  \item Facts can be named after the main term within the proposition.
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   137
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   138
  \item Facts should \emph{not} be named after the command that
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   139
  introduced them (@{command "assume"}, @{command "have"}).  This is
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   140
  misleading and hard to maintain.
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   141
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   142
  \item Natural numbers can be used as ``meaningless'' names (more
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   143
  appropriate than @{text "a1"}, @{text "a2"} etc.)
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   144
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   145
  \item Symbolic identifiers are supported (e.g. @{text "*"}, @{text
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   146
  "**"}, @{text "***"}).
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   147
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   148
  \end{itemize}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   149
*}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   150
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   151
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   152
subsection {* Block structure *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   153
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   154
text {*
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   155
  The formal notepad is block structured.  The fact produced by the last
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   156
  entry of a block is exported into the outer context.
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   157
*}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   158
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   159
notepad
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   160
begin
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   161
  {
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   162
    have a: A sorry
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   163
    have b: B sorry
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   164
    note a b
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   165
  }
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   166
  note this
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   167
  note `A`
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   168
  note `B`
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   169
end
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   170
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   171
text {* Explicit blocks as well as implicit blocks of nested goal
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   172
  statements (e.g.\ @{command have}) automatically introduce one extra
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   173
  pair of parentheses in reserve.  The @{command next} command allows
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   174
  to ``jump'' between these sub-blocks. *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   175
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   176
notepad
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   177
begin
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   178
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   179
  {
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   180
    have a: A sorry
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   181
  next
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   182
    have b: B
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   183
    proof -
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   184
      show B sorry
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   185
    next
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   186
      have c: C sorry
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   187
    next
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   188
      have d: D sorry
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   189
    qed
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   190
  }
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   191
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   192
  txt {* Alternative version with explicit parentheses everywhere: *}
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   193
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   194
  {
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   195
    {
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   196
      have a: A sorry
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   197
    }
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   198
    {
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   199
      have b: B
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   200
      proof -
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   201
        {
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   202
          show B sorry
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   203
        }
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   204
        {
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   205
          have c: C sorry
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   206
        }
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   207
        {
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   208
          have d: D sorry
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   209
        }
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   210
      qed
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   211
    }
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   212
  }
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   213
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   214
end
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
   215
42919
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   216
42921
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   217
section {* Calculational reasoning \label{sec:calculations-synopsis} *}
42919
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   218
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   219
text {*
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   220
  For example, see @{file "~~/src/HOL/Isar_Examples/Group.thy"}.
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   221
*}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   222
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   223
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   224
subsection {* Special names in Isar proofs *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   225
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   226
text {*
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   227
  \begin{itemize}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   228
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   229
  \item term @{text "?thesis"} --- the main conclusion of the
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   230
  innermost pending claim
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   231
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   232
  \item term @{text "\<dots>"} --- the argument of the last explicitly
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   233
    stated result (for infix application this is the right-hand side)
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   234
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   235
  \item fact @{text "this"} --- the last result produced in the text
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   236
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   237
  \end{itemize}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   238
*}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   239
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   240
notepad
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   241
begin
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   242
  have "x = y"
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   243
  proof -
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   244
    term ?thesis
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   245
    show ?thesis sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   246
    term ?thesis  -- {* static! *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   247
  qed
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   248
  term "\<dots>"
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   249
  thm this
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   250
end
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   251
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   252
text {* Calculational reasoning maintains the special fact called
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   253
  ``@{text calculation}'' in the background.  Certain language
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   254
  elements combine primary @{text this} with secondary @{text
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   255
  calculation}. *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   256
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   257
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   258
subsection {* Transitive chains *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   259
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   260
text {* The Idea is to combine @{text this} and @{text calculation}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   261
  via typical @{text trans} rules (see also @{command
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   262
  print_trans_rules}): *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   263
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   264
thm trans
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   265
thm less_trans
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   266
thm less_le_trans
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   267
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   268
notepad
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   269
begin
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   270
  txt {* Plain bottom-up calculation: *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   271
  have "a = b" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   272
  also
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   273
  have "b = c" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   274
  also
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   275
  have "c = d" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   276
  finally
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   277
  have "a = d" .
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   278
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   279
  txt {* Variant using the @{text "\<dots>"} abbreviation: *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   280
  have "a = b" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   281
  also
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   282
  have "\<dots> = c" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   283
  also
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   284
  have "\<dots> = d" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   285
  finally
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   286
  have "a = d" .
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   287
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   288
  txt {* Top-down version with explicit claim at the head: *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   289
  have "a = d"
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   290
  proof -
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   291
    have "a = b" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   292
    also
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   293
    have "\<dots> = c" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   294
    also
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   295
    have "\<dots> = d" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   296
    finally
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   297
    show ?thesis .
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   298
  qed
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   299
next
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   300
  txt {* Mixed inequalities (require suitable base type): *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   301
  fix a b c d :: nat
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   302
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   303
  have "a < b" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   304
  also
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   305
  have "b\<le> c" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   306
  also
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   307
  have "c = d" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   308
  finally
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   309
  have "a < d" .
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   310
end
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   311
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   312
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   313
subsubsection {* Notes *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   314
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   315
text {*
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   316
  \begin{itemize}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   317
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   318
  \item The notion of @{text trans} rule is very general due to the
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   319
  flexibility of Isabelle/Pure rule composition.
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   320
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   321
  \item User applications may declare there own rules, with some care
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   322
  about the operational details of higher-order unification.
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   323
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   324
  \end{itemize}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   325
*}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   326
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   327
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   328
subsection {* Degenerate calculations and bigstep reasoning *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   329
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   330
text {* The Idea is to append @{text this} to @{text calculation},
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   331
  without rule composition.  *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   332
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   333
notepad
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   334
begin
42920
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   335
  txt {* A vacuous proof: *}
42919
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   336
  have A sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   337
  moreover
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   338
  have B sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   339
  moreover
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   340
  have C sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   341
  ultimately
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   342
  have A and B and C .
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   343
next
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   344
  txt {* Slightly more content (trivial bigstep reasoning): *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   345
  have A sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   346
  moreover
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   347
  have B sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   348
  moreover
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   349
  have C sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   350
  ultimately
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   351
  have "A \<and> B \<and> C" by blast
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   352
next
42920
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   353
  txt {* More ambitious bigstep reasoning involving structured results: *}
42919
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   354
  have "A \<or> B \<or> C" sorry
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   355
  moreover
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   356
  { assume A have R sorry }
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   357
  moreover
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   358
  { assume B have R sorry }
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   359
  moreover
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   360
  { assume C have R sorry }
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   361
  ultimately
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   362
  have R by blast  -- {* ``big-bang integration'' of proof blocks (occasionally fragile) *}
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   363
end
6e83c2f73240 some material on "Calculational reasoning";
wenzelm
parents: 42918
diff changeset
   364
42920
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   365
42923
3ba51a3acff0 tuned headings;
wenzelm
parents: 42922
diff changeset
   366
section {* Induction *}
42921
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   367
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   368
subsection {* Induction as Natural Deduction *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   369
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   370
text {* In principle, induction is just a special case of Natural
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   371
  Deduction (see also \secref{sec:natural-deduction-synopsis}).  For
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   372
  example: *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   373
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   374
thm nat.induct
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   375
print_statement nat.induct
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   376
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   377
notepad
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   378
begin
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   379
  fix n :: nat
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   380
  have "P n"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   381
  proof (rule nat.induct)  -- {* fragile rule application! *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   382
    show "P 0" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   383
  next
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   384
    fix n :: nat
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   385
    assume "P n"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   386
    show "P (Suc n)" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   387
  qed
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   388
end
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   389
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   390
text {*
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   391
  In practice, much more proof infrastructure is required.
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   392
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   393
  The proof method @{method induct} provides:
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   394
  \begin{itemize}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   395
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   396
  \item implicit rule selection and robust instantiation
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   397
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   398
  \item context elements via symbolic case names
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   399
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   400
  \item support for rule-structured induction statements, with local
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   401
    parameters, premises, etc.
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   402
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   403
  \end{itemize}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   404
*}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   405
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   406
notepad
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   407
begin
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   408
  fix n :: nat
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   409
  have "P n"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   410
  proof (induct n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   411
    case 0
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   412
    show ?case sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   413
  next
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   414
    case (Suc n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   415
    from Suc.hyps show ?case sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   416
  qed
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   417
end
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   418
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   419
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   420
subsubsection {* Example *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   421
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   422
text {*
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   423
  The subsequent example combines the following proof patterns:
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   424
  \begin{itemize}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   425
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   426
  \item outermost induction (over the datatype structure of natural
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   427
  numbers), to decompose the proof problem in top-down manner
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   428
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   429
  \item calculational reasoning (\secref{sec:calculations-synopsis})
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   430
  to compose the result in each case
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   431
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   432
  \item solving local claims within the calculation by simplification
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   433
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   434
  \end{itemize}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   435
*}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   436
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   437
lemma
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   438
  fixes n :: nat
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   439
  shows "(\<Sum>i=0..n. i) = n * (n + 1) div 2"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   440
proof (induct n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   441
  case 0
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   442
  have "(\<Sum>i=0..0. i) = (0::nat)" by simp
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   443
  also have "\<dots> = 0 * (0 + 1) div 2" by simp
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   444
  finally show ?case .
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   445
next
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   446
  case (Suc n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   447
  have "(\<Sum>i=0..Suc n. i) = (\<Sum>i=0..n. i) + (n + 1)" by simp
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   448
  also have "\<dots> = n * (n + 1) div 2 + (n + 1)" by (simp add: Suc.hyps)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   449
  also have "\<dots> = (n * (n + 1) + 2 * (n + 1)) div 2" by simp
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   450
  also have "\<dots> = (Suc n * (Suc n + 1)) div 2" by simp
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   451
  finally show ?case .
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   452
qed
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   453
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   454
text {* This demonstrates how induction proofs can be done without
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   455
  having to consider the raw Natural Deduction structure. *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   456
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   457
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   458
subsection {* Induction with local parameters and premises *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   459
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   460
text {* Idea: Pure rule statements are passed through the induction
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   461
  rule.  This achieves convenient proof patterns, thanks to some
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   462
  internal trickery in the @{method induct} method.
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   463
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   464
  Important: Using compact HOL formulae with @{text "\<forall>/\<longrightarrow>"} is a
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   465
  well-known anti-pattern! It would produce useless formal noise.
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   466
*}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   467
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   468
notepad
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   469
begin
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   470
  fix n :: nat
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   471
  fix P :: "nat \<Rightarrow> bool"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   472
  fix Q :: "'a \<Rightarrow> nat \<Rightarrow> bool"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   473
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   474
  have "P n"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   475
  proof (induct n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   476
    case 0
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   477
    show "P 0" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   478
  next
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   479
    case (Suc n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   480
    from `P n` show "P (Suc n)" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   481
  qed
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   482
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   483
  have "A n \<Longrightarrow> P n"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   484
  proof (induct n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   485
    case 0
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   486
    from `A 0` show "P 0" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   487
  next
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   488
    case (Suc n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   489
    from `A n \<Longrightarrow> P n`
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   490
      and `A (Suc n)` show "P (Suc n)" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   491
  qed
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   492
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   493
  have "\<And>x. Q x n"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   494
  proof (induct n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   495
    case 0
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   496
    show "Q x 0" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   497
  next
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   498
    case (Suc n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   499
    from `\<And>x. Q x n` show "Q x (Suc n)" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   500
    txt {* Local quantification admits arbitrary instances: *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   501
    note `Q a n` and `Q b n`
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   502
  qed
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   503
end
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   504
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   505
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   506
subsection {* Implicit induction context *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   507
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   508
text {* The @{method induct} method can isolate local parameters and
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   509
  premises directly from the given statement.  This is convenient in
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   510
  practical applications, but requires some understanding of what is
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   511
  going on internally (as explained above).  *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   512
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   513
notepad
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   514
begin
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   515
  fix n :: nat
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   516
  fix Q :: "'a \<Rightarrow> nat \<Rightarrow> bool"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   517
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   518
  fix x :: 'a
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   519
  assume "A x n"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   520
  then have "Q x n"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   521
  proof (induct n arbitrary: x)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   522
    case 0
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   523
    from `A x 0` show "Q x 0" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   524
  next
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   525
    case (Suc n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   526
    from `\<And>x. A x n \<Longrightarrow> Q x n`  -- {* arbitrary instances can be produced here *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   527
      and `A x (Suc n)` show "Q x (Suc n)" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   528
  qed
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   529
end
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   530
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   531
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   532
subsection {* Advanced induction with term definitions *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   533
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   534
text {* Induction over subexpressions of a certain shape are delicate
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   535
  to formalize.  The Isar @{method induct} method provides
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   536
  infrastructure for this.
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   537
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   538
  Idea: sub-expressions of the problem are turned into a defined
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   539
  induction variable; often accompanied with fixing of auxiliary
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   540
  parameters in the original expression.  *}
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   541
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   542
notepad
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   543
begin
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   544
  fix a :: "'a \<Rightarrow> nat"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   545
  fix A :: "nat \<Rightarrow> bool"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   546
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   547
  assume "A (a x)"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   548
  then have "P (a x)"
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   549
  proof (induct "a x" arbitrary: x)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   550
    case 0
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   551
    note prem = `A (a x)`
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   552
      and defn = `0 = a x`
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   553
    show "P (a x)" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   554
  next
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   555
    case (Suc n)
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   556
    note hyp = `\<And>x. n = a x \<Longrightarrow> A (a x) \<Longrightarrow> P (a x)`
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   557
      and prem = `A (a x)`
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   558
      and defn = `Suc n = a x`
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   559
    show "P (a x)" sorry
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   560
  qed
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   561
end
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   562
ec270c6cb942 some material on "Structured induction proofs";
wenzelm
parents: 42920
diff changeset
   563
42923
3ba51a3acff0 tuned headings;
wenzelm
parents: 42922
diff changeset
   564
section {* Natural Deduction \label{sec:natural-deduction-synopsis} *}
42920
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   565
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   566
subsection {* Rule statements *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   567
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   568
text {*
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   569
  Isabelle/Pure ``theorems'' are always natural deduction rules,
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   570
  which sometimes happen to consist of a conclusion only.
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   571
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   572
  The framework connectives @{text "\<And>"} and @{text "\<Longrightarrow>"} indicate the
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   573
  rule structure declaratively.  For example: *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   574
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   575
thm conjI
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   576
thm impI
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   577
thm nat.induct
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   578
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   579
text {*
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   580
  The object-logic is embedded into the Pure framework via an implicit
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   581
  derivability judgment @{term "Trueprop :: bool \<Rightarrow> prop"}.
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   582
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   583
  Thus any HOL formulae appears atomic to the Pure framework, while
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   584
  the rule structure outlines the corresponding proof pattern.
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   585
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   586
  This can be made explicit as follows:
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   587
*}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   588
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   589
notepad
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   590
begin
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   591
  write Trueprop  ("Tr")
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   592
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   593
  thm conjI
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   594
  thm impI
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   595
  thm nat.induct
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   596
end
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   597
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   598
text {*
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   599
  Isar provides first-class notation for rule statements as follows.
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   600
*}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   601
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   602
print_statement conjI
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   603
print_statement impI
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   604
print_statement nat.induct
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   605
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   606
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   607
subsubsection {* Examples *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   608
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   609
text {*
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   610
  Introductions and eliminations of some standard connectives of
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   611
  the object-logic can be written as rule statements as follows.  (The
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   612
  proof ``@{command "by"}~@{method blast}'' serves as sanity check.)
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   613
*}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   614
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   615
lemma "(P \<Longrightarrow> False) \<Longrightarrow> \<not> P" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   616
lemma "\<not> P \<Longrightarrow> P \<Longrightarrow> Q" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   617
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   618
lemma "P \<Longrightarrow> Q \<Longrightarrow> P \<and> Q" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   619
lemma "P \<and> Q \<Longrightarrow> (P \<Longrightarrow> Q \<Longrightarrow> R) \<Longrightarrow> R" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   620
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   621
lemma "P \<Longrightarrow> P \<or> Q" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   622
lemma "Q \<Longrightarrow> P \<or> Q" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   623
lemma "P \<or> Q \<Longrightarrow> (P \<Longrightarrow> R) \<Longrightarrow> (Q \<Longrightarrow> R) \<Longrightarrow> R" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   624
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   625
lemma "(\<And>x. P x) \<Longrightarrow> (\<forall>x. P x)" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   626
lemma "(\<forall>x. P x) \<Longrightarrow> P x" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   627
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   628
lemma "P x \<Longrightarrow> (\<exists>x. P x)" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   629
lemma "(\<exists>x. P x) \<Longrightarrow> (\<And>x. P x \<Longrightarrow> R) \<Longrightarrow> R" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   630
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   631
lemma "x \<in> A \<Longrightarrow> x \<in> B \<Longrightarrow> x \<in> A \<inter> B" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   632
lemma "x \<in> A \<inter> B \<Longrightarrow> (x \<in> A \<Longrightarrow> x \<in> B \<Longrightarrow> R) \<Longrightarrow> R" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   633
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   634
lemma "x \<in> A \<Longrightarrow> x \<in> A \<union> B" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   635
lemma "x \<in> B \<Longrightarrow> x \<in> A \<union> B" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   636
lemma "x \<in> A \<union> B \<Longrightarrow> (x \<in> A \<Longrightarrow> R) \<Longrightarrow> (x \<in> B \<Longrightarrow> R) \<Longrightarrow> R" by blast
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   637
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   638
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   639
subsection {* Isar context elements *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   640
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   641
text {* We derive some results out of the blue, using Isar context
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   642
  elements and some explicit blocks.  This illustrates their meaning
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   643
  wrt.\ Pure connectives, without goal states getting in the way.  *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   644
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   645
notepad
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   646
begin
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   647
  {
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   648
    fix x
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   649
    have "B x" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   650
  }
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   651
  have "\<And>x. B x" by fact
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   652
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   653
next
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   654
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   655
  {
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   656
    assume A
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   657
    have B sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   658
  }
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   659
  have "A \<Longrightarrow> B" by fact
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   660
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   661
next
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   662
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   663
  {
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   664
    def x \<equiv> t
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   665
    have "B x" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   666
  }
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   667
  have "B t" by fact
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   668
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   669
next
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   670
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   671
  {
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   672
    obtain x :: 'a where "B x" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   673
    have C sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   674
  }
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   675
  have C by fact
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   676
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   677
end
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   678
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   679
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   680
subsection {* Pure rule composition *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   681
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   682
text {*
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   683
  The Pure framework provides means for:
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   684
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   685
  \begin{itemize}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   686
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   687
    \item backward-chaining of rules by @{inference resolution}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   688
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   689
    \item closing of branches by @{inference assumption}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   690
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   691
  \end{itemize}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   692
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   693
  Both principles involve higher-order unification of @{text \<lambda>}-terms
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   694
  modulo @{text "\<alpha>\<beta>\<eta>"}-equivalence (cf.\ Huet and Miller).  *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   695
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   696
notepad
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   697
begin
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   698
  assume a: A and b: B
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   699
  thm conjI
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   700
  thm conjI [of A B]  -- "instantiation"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   701
  thm conjI [of A B, OF a b]  -- "instantiation and composition"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   702
  thm conjI [OF a b]  -- "composition via unification (trivial)"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   703
  thm conjI [OF `A` `B`]
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   704
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   705
  thm conjI [OF disjI1]
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   706
end
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   707
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   708
text {* Note: Low-level rule composition is tedious and leads to
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   709
  unreadable~/ unmaintainable expressions in the text.  *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   710
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   711
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   712
subsection {* Structured backward reasoning *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   713
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   714
text {* Idea: Canonical proof decomposition via @{command fix}~/
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   715
  @{command assume}~/ @{command show}, where the body produces a
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   716
  natural deduction rule to refine some goal.  *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   717
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   718
notepad
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   719
begin
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   720
  fix A B :: "'a \<Rightarrow> bool"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   721
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   722
  have "\<And>x. A x \<Longrightarrow> B x"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   723
  proof -
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   724
    fix x
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   725
    assume "A x"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   726
    show "B x" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   727
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   728
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   729
  have "\<And>x. A x \<Longrightarrow> B x"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   730
  proof -
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   731
    {
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   732
      fix x
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   733
      assume "A x"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   734
      show "B x" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   735
    } -- "implicit block structure made explicit"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   736
    note `\<And>x. A x \<Longrightarrow> B x`
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   737
      -- "side exit for the resulting rule"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   738
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   739
end
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   740
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   741
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   742
subsection {* Structured rule application *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   743
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   744
text {*
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   745
  Idea: Previous facts and new claims are composed with a rule from
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   746
  the context (or background library).
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   747
*}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   748
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   749
notepad
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   750
begin
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   751
  assume r1: "A \<Longrightarrow> B \<Longrightarrow> C"  -- {* simple rule (Horn clause) *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   752
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   753
  have A sorry  -- "prefix of facts via outer sub-proof"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   754
  then have C
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   755
  proof (rule r1)
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   756
    show B sorry  -- "remaining rule premises via inner sub-proof"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   757
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   758
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   759
  have C
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   760
  proof (rule r1)
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   761
    show A sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   762
    show B sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   763
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   764
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   765
  have A and B sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   766
  then have C
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   767
  proof (rule r1)
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   768
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   769
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   770
  have A and B sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   771
  then have C by (rule r1)
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   772
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   773
next
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   774
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   775
  assume r2: "A \<Longrightarrow> (\<And>x. B1 x \<Longrightarrow> B2 x) \<Longrightarrow> C"  -- {* nested rule *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   776
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   777
  have A sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   778
  then have C
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   779
  proof (rule r2)
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   780
    fix x
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   781
    assume "B1 x"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   782
    show "B2 x" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   783
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   784
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   785
  txt {* The compound rule premise @{prop "\<And>x. B1 x \<Longrightarrow> B2 x"} is better
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   786
    addressed via @{command fix}~/ @{command assume}~/ @{command show}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   787
    in the nested proof body.  *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   788
end
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   789
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   790
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   791
subsection {* Example: predicate logic *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   792
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   793
text {*
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   794
  Using the above principles, standard introduction and elimination proofs
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   795
  of predicate logic connectives of HOL work as follows.
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   796
*}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   797
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   798
notepad
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   799
begin
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   800
  have "A \<longrightarrow> B" and A sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   801
  then have B ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   802
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   803
  have A sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   804
  then have "A \<or> B" ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   805
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   806
  have B sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   807
  then have "A \<or> B" ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   808
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   809
  have "A \<or> B" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   810
  then have C
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   811
  proof
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   812
    assume A
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   813
    then show C sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   814
  next
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   815
    assume B
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   816
    then show C sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   817
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   818
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   819
  have A and B sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   820
  then have "A \<and> B" ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   821
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   822
  have "A \<and> B" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   823
  then have A ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   824
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   825
  have "A \<and> B" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   826
  then have B ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   827
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   828
  have False sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   829
  then have A ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   830
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   831
  have True ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   832
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   833
  have "\<not> A"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   834
  proof
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   835
    assume A
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   836
    then show False sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   837
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   838
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   839
  have "\<not> A" and A sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   840
  then have B ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   841
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   842
  have "\<forall>x. P x"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   843
  proof
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   844
    fix x
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   845
    show "P x" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   846
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   847
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   848
  have "\<forall>x. P x" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   849
  then have "P a" ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   850
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   851
  have "\<exists>x. P x"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   852
  proof
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   853
    show "P a" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   854
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   855
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   856
  have "\<exists>x. P x" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   857
  then have C
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   858
  proof
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   859
    fix a
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   860
    assume "P a"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   861
    show C sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   862
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   863
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   864
  txt {* Less awkward version using @{command obtain}: *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   865
  have "\<exists>x. P x" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   866
  then obtain a where "P a" ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   867
end
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   868
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   869
text {* Further variations to illustrate Isar sub-proofs involving
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   870
  @{command show}: *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   871
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   872
notepad
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   873
begin
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   874
  have "A \<and> B"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   875
  proof  -- {* two strictly isolated subproofs *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   876
    show A sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   877
  next
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   878
    show B sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   879
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   880
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   881
  have "A \<and> B"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   882
  proof  -- {* one simultaneous sub-proof *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   883
    show A and B sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   884
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   885
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   886
  have "A \<and> B"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   887
  proof  -- {* two subproofs in the same context *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   888
    show A sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   889
    show B sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   890
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   891
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   892
  have "A \<and> B"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   893
  proof  -- {* swapped order *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   894
    show B sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   895
    show A sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   896
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   897
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   898
  have "A \<and> B"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   899
  proof  -- {* sequential subproofs *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   900
    show A sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   901
    show B using `A` sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   902
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   903
end
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   904
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   905
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   906
subsubsection {* Example: set-theoretic operators *}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   907
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   908
text {* There is nothing special about logical connectives (@{text
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   909
  "\<and>"}, @{text "\<or>"}, @{text "\<forall>"}, @{text "\<exists>"} etc.).  Operators from
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   910
  set-theory or lattice-theory for analogously.  It is only a matter
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   911
  of rule declarations in the library; rules can be also specified
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   912
  explicitly.
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   913
*}
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   914
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   915
notepad
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   916
begin
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   917
  have "x \<in> A" and "x \<in> B" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   918
  then have "x \<in> A \<inter> B" ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   919
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   920
  have "x \<in> A" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   921
  then have "x \<in> A \<union> B" ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   922
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   923
  have "x \<in> B" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   924
  then have "x \<in> A \<union> B" ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   925
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   926
  have "x \<in> A \<union> B" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   927
  then have C
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   928
  proof
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   929
    assume "x \<in> A"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   930
    then show C sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   931
  next
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   932
    assume "x \<in> B"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   933
    then show C sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   934
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   935
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   936
next
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   937
  have "x \<in> \<Inter>A"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   938
  proof
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   939
    fix a
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   940
    assume "a \<in> A"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   941
    show "x \<in> a" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   942
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   943
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   944
  have "x \<in> \<Inter>A" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   945
  then have "x \<in> a"
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   946
  proof
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   947
    show "a \<in> A" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   948
  qed
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   949
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   950
  have "a \<in> A" and "x \<in> a" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   951
  then have "x \<in> \<Union>A" ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   952
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   953
  have "x \<in> \<Union>A" sorry
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   954
  then obtain a where "a \<in> A" and "x \<in> a" ..
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   955
end
8c0a49d72857 some material on "Structured Natural Deduction";
wenzelm
parents: 42919
diff changeset
   956
42922
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   957
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   958
section {* Generalized elimination and cases *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   959
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   960
subsection {* General elimination rules *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   961
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   962
text {*
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   963
  The general format of elimination rules is illustrated by the
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   964
  following typical representatives:
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   965
*}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   966
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   967
thm exE     -- {* local parameter *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   968
thm conjE   -- {* local premises *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   969
thm disjE   -- {* split into cases *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   970
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   971
text {*
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   972
  Combining these characteristics leads to the following general scheme
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   973
  for elimination rules with cases:
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   974
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   975
  \begin{itemize}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   976
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   977
  \item prefix of assumptions (or ``major premises'')
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   978
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   979
  \item one or more cases that enable to establish the main conclusion
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   980
    in an augmented context
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   981
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   982
  \end{itemize}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   983
*}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   984
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   985
notepad
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   986
begin
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   987
  assume r:
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   988
    "A1 \<Longrightarrow> A2 \<Longrightarrow>  (* assumptions *)
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   989
      (\<And>x y. B1 x y \<Longrightarrow> C1 x y \<Longrightarrow> R) \<Longrightarrow>  (* case 1 *)
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   990
      (\<And>x y. B2 x y \<Longrightarrow> C2 x y \<Longrightarrow> R) \<Longrightarrow>  (* case 2 *)
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   991
      R  (* main conclusion *)"
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   992
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   993
  have A1 and A2 sorry
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   994
  then have R
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   995
  proof (rule r)
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   996
    fix x y
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   997
    assume "B1 x y" and "C1 x y"
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   998
    show ?thesis sorry
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
   999
  next
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1000
    fix x y
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1001
    assume "B2 x y" and "C2 x y"
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1002
    show ?thesis sorry
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1003
  qed
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1004
end
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1005
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1006
text {* Here @{text "?thesis"} is used to refer to the unchanged goal
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1007
  statement.  *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1008
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1009
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1010
subsection {* Rules with cases *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1011
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1012
text {*
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1013
  Applying an elimination rule to some goal, leaves that unchanged
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1014
  but allows to augment the context in the sub-proof of each case.
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1015
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1016
  Isar provides some infrastructure to support this:
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1017
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1018
  \begin{itemize}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1019
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1020
  \item native language elements to state eliminations
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1021
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1022
  \item symbolic case names
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1023
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1024
  \item method @{method cases} to recover this structure in a
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1025
  sub-proof
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1026
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1027
  \end{itemize}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1028
*}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1029
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1030
print_statement exE
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1031
print_statement conjE
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1032
print_statement disjE
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1033
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1034
lemma
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1035
  assumes A1 and A2  -- {* assumptions *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1036
  obtains
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1037
    (case1)  x y where "B1 x y" and "C1 x y"
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1038
  | (case2)  x y where "B2 x y" and "C2 x y"
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1039
  sorry
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1040
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1041
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1042
subsubsection {* Example *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1043
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1044
lemma tertium_non_datur:
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1045
  obtains
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1046
    (T)  A
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1047
  | (F)  "\<not> A"
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1048
  by blast
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1049
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1050
notepad
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1051
begin
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1052
  fix x y :: 'a
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1053
  have C
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1054
  proof (cases "x = y" rule: tertium_non_datur)
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1055
    case T
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1056
    from `x = y` show ?thesis sorry
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1057
  next
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1058
    case F
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1059
    from `x \<noteq> y` show ?thesis sorry
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1060
  qed
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1061
end
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1062
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1063
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1064
subsubsection {* Example *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1065
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1066
text {*
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1067
  Isabelle/HOL specification mechanisms (datatype, inductive, etc.)
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1068
  provide suitable derived cases rules.
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1069
*}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1070
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1071
datatype foo = Foo | Bar foo
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1072
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1073
notepad
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1074
begin
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1075
  fix x :: foo
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1076
  have C
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1077
  proof (cases x)
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1078
    case Foo
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1079
    from `x = Foo` show ?thesis sorry
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1080
  next
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1081
    case (Bar a)
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1082
    from `x = Bar a` show ?thesis sorry
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1083
  qed
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1084
end
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1085
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1086
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1087
subsection {* Obtaining local contexts *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1088
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1089
text {* A single ``case'' branch may be inlined into Isar proof text
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1090
  via @{command obtain}.  This proves @{prop "(\<And>x. B x \<Longrightarrow> thesis) \<Longrightarrow>
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1091
  thesis"} on the spot, and augments the context afterwards.  *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1092
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1093
notepad
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1094
begin
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1095
  fix B :: "'a \<Rightarrow> bool"
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1096
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1097
  obtain x where "B x" sorry
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1098
  note `B x`
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1099
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1100
  txt {* Conclusions from this context may not mention @{term x} again! *}
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1101
  {
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1102
    obtain x where "B x" sorry
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1103
    from `B x` have C sorry
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1104
  }
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1105
  note `C`
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1106
end
91e229959d4c some material on "Generalized elimination and cases";
wenzelm
parents: 42921
diff changeset
  1107
42917
ba23e83b0868 added Synopsis, with some "Notepad" material;
wenzelm
parents:
diff changeset
  1108
end