doc-src/IsarRef/Thy/Synopsis.thy
author wenzelm
Wed, 01 Jun 2011 12:20:48 +0200
changeset 44122 36daee4cc9c9
parent 44121 ba23e83b0868
child 44123 6e83c2f73240
permissions -rw-r--r--
tuned;
wenzelm@44121
     1
theory Synopsis
wenzelm@44121
     2
imports Base Main
wenzelm@44121
     3
begin
wenzelm@44121
     4
wenzelm@44121
     5
chapter {* Synopsis *}
wenzelm@44121
     6
wenzelm@44121
     7
section {* Notepad *}
wenzelm@44121
     8
wenzelm@44121
     9
text {*
wenzelm@44121
    10
  An Isar proof body serves as mathematical notepad to compose logical
wenzelm@44122
    11
  content, consisting of types, terms, facts.
wenzelm@44121
    12
*}
wenzelm@44121
    13
wenzelm@44121
    14
wenzelm@44122
    15
subsection {* Types and terms *}
wenzelm@44122
    16
wenzelm@44122
    17
notepad
wenzelm@44122
    18
begin
wenzelm@44122
    19
  txt {* Locally fixed entities: *}
wenzelm@44122
    20
  fix x   -- {* local constant, without any type information yet *}
wenzelm@44122
    21
  fix x :: 'a  -- {* variant with explicit type-constraint for subsequent use*}
wenzelm@44122
    22
wenzelm@44122
    23
  fix a b
wenzelm@44122
    24
  assume "a = b"  -- {* type assignment at first occurrence in concrete term *}
wenzelm@44122
    25
wenzelm@44122
    26
  txt {* Definitions (non-polymorphic): *}
wenzelm@44122
    27
  def x \<equiv> "t::'a"
wenzelm@44122
    28
wenzelm@44122
    29
  txt {* Abbreviations (polymorphic): *}
wenzelm@44122
    30
  let ?f = "\<lambda>x. x"
wenzelm@44122
    31
  term "?f ?f"
wenzelm@44122
    32
wenzelm@44122
    33
  txt {* Notation: *}
wenzelm@44122
    34
  write x  ("***")
wenzelm@44122
    35
end
wenzelm@44122
    36
wenzelm@44122
    37
wenzelm@44121
    38
subsection {* Facts *}
wenzelm@44121
    39
wenzelm@44121
    40
text {*
wenzelm@44121
    41
  A fact is a simultaneous list of theorems.
wenzelm@44121
    42
*}
wenzelm@44121
    43
wenzelm@44121
    44
wenzelm@44121
    45
subsubsection {* Producing facts *}
wenzelm@44121
    46
wenzelm@44121
    47
notepad
wenzelm@44121
    48
begin
wenzelm@44121
    49
wenzelm@44121
    50
  txt {* Via assumption (``lambda''): *}
wenzelm@44121
    51
  assume a: A
wenzelm@44121
    52
wenzelm@44121
    53
  txt {* Via proof (``let''): *}
wenzelm@44121
    54
  have b: B sorry
wenzelm@44121
    55
wenzelm@44121
    56
  txt {* Via abbreviation (``let''): *}
wenzelm@44121
    57
  note c = a b
wenzelm@44121
    58
wenzelm@44121
    59
end
wenzelm@44121
    60
wenzelm@44121
    61
wenzelm@44121
    62
subsubsection {* Referencing facts *}
wenzelm@44121
    63
wenzelm@44121
    64
notepad
wenzelm@44121
    65
begin
wenzelm@44121
    66
  txt {* Via explicit name: *}
wenzelm@44121
    67
  assume a: A
wenzelm@44121
    68
  note a
wenzelm@44121
    69
wenzelm@44121
    70
  txt {* Via implicit name: *}
wenzelm@44121
    71
  assume A
wenzelm@44121
    72
  note this
wenzelm@44121
    73
wenzelm@44121
    74
  txt {* Via literal proposition (unification with results from the proof text): *}
wenzelm@44121
    75
  assume A
wenzelm@44121
    76
  note `A`
wenzelm@44121
    77
wenzelm@44121
    78
  assume "\<And>x. B x"
wenzelm@44121
    79
  note `B a`
wenzelm@44121
    80
  note `B b`
wenzelm@44121
    81
end
wenzelm@44121
    82
wenzelm@44121
    83
wenzelm@44121
    84
subsubsection {* Manipulating facts *}
wenzelm@44121
    85
wenzelm@44121
    86
notepad
wenzelm@44121
    87
begin
wenzelm@44121
    88
  txt {* Instantiation: *}
wenzelm@44121
    89
  assume a: "\<And>x. B x"
wenzelm@44121
    90
  note a
wenzelm@44121
    91
  note a [of b]
wenzelm@44121
    92
  note a [where x = b]
wenzelm@44121
    93
wenzelm@44121
    94
  txt {* Backchaining: *}
wenzelm@44121
    95
  assume 1: A
wenzelm@44121
    96
  assume 2: "A \<Longrightarrow> C"
wenzelm@44121
    97
  note 2 [OF 1]
wenzelm@44121
    98
  note 1 [THEN 2]
wenzelm@44121
    99
wenzelm@44121
   100
  txt {* Symmetric results: *}
wenzelm@44121
   101
  assume "x = y"
wenzelm@44121
   102
  note this [symmetric]
wenzelm@44121
   103
wenzelm@44121
   104
  assume "x \<noteq> y"
wenzelm@44121
   105
  note this [symmetric]
wenzelm@44121
   106
wenzelm@44121
   107
  txt {* Adhoc-simplication (take care!): *}
wenzelm@44121
   108
  assume "P ([] @ xs)"
wenzelm@44121
   109
  note this [simplified]
wenzelm@44121
   110
end
wenzelm@44121
   111
wenzelm@44121
   112
wenzelm@44121
   113
subsubsection {* Projections *}
wenzelm@44121
   114
wenzelm@44121
   115
text {*
wenzelm@44121
   116
  Isar facts consist of multiple theorems.  There is notation to project
wenzelm@44121
   117
  interval ranges.
wenzelm@44121
   118
*}
wenzelm@44121
   119
wenzelm@44121
   120
notepad
wenzelm@44121
   121
begin
wenzelm@44121
   122
  assume stuff: A B C D
wenzelm@44121
   123
  note stuff(1)
wenzelm@44121
   124
  note stuff(2-3)
wenzelm@44121
   125
  note stuff(2-)
wenzelm@44121
   126
end
wenzelm@44121
   127
wenzelm@44121
   128
wenzelm@44121
   129
subsubsection {* Naming conventions *}
wenzelm@44121
   130
wenzelm@44121
   131
text {*
wenzelm@44121
   132
  \begin{itemize}
wenzelm@44121
   133
wenzelm@44121
   134
  \item Lower-case identifiers are usually preferred.
wenzelm@44121
   135
wenzelm@44121
   136
  \item Facts can be named after the main term within the proposition.
wenzelm@44121
   137
wenzelm@44121
   138
  \item Facts should \emph{not} be named after the command that
wenzelm@44121
   139
  introduced them (@{command "assume"}, @{command "have"}).  This is
wenzelm@44121
   140
  misleading and hard to maintain.
wenzelm@44121
   141
wenzelm@44121
   142
  \item Natural numbers can be used as ``meaningless'' names (more
wenzelm@44121
   143
  appropriate than @{text "a1"}, @{text "a2"} etc.)
wenzelm@44121
   144
wenzelm@44121
   145
  \item Symbolic identifiers are supported (e.g. @{text "*"}, @{text
wenzelm@44121
   146
  "**"}, @{text "***"}).
wenzelm@44121
   147
wenzelm@44121
   148
  \end{itemize}
wenzelm@44121
   149
*}
wenzelm@44121
   150
wenzelm@44121
   151
wenzelm@44121
   152
subsection {* Block structure *}
wenzelm@44121
   153
wenzelm@44121
   154
text {*
wenzelm@44121
   155
  The formal notepad is block structured.  The fact produced by the last
wenzelm@44121
   156
  entry of a block is exported into the outer context.
wenzelm@44121
   157
*}
wenzelm@44121
   158
wenzelm@44121
   159
notepad
wenzelm@44121
   160
begin
wenzelm@44121
   161
  {
wenzelm@44121
   162
    have a: A sorry
wenzelm@44121
   163
    have b: B sorry
wenzelm@44121
   164
    note a b
wenzelm@44121
   165
  }
wenzelm@44121
   166
  note this
wenzelm@44121
   167
  note `A`
wenzelm@44121
   168
  note `B`
wenzelm@44121
   169
end
wenzelm@44121
   170
wenzelm@44121
   171
text {* Explicit blocks as well as implicit blocks of nested goal
wenzelm@44121
   172
  statements (e.g.\ @{command have}) automatically introduce one extra
wenzelm@44121
   173
  pair of parentheses in reserve.  The @{command next} command allows
wenzelm@44121
   174
  to ``jump'' between these sub-blocks. *}
wenzelm@44121
   175
wenzelm@44121
   176
notepad
wenzelm@44121
   177
begin
wenzelm@44121
   178
wenzelm@44121
   179
  {
wenzelm@44121
   180
    have a: A sorry
wenzelm@44121
   181
  next
wenzelm@44121
   182
    have b: B
wenzelm@44121
   183
    proof -
wenzelm@44121
   184
      show B sorry
wenzelm@44121
   185
    next
wenzelm@44121
   186
      have c: C sorry
wenzelm@44121
   187
    next
wenzelm@44121
   188
      have d: D sorry
wenzelm@44121
   189
    qed
wenzelm@44121
   190
  }
wenzelm@44121
   191
wenzelm@44121
   192
  txt {* Alternative version with explicit parentheses everywhere: *}
wenzelm@44121
   193
wenzelm@44121
   194
  {
wenzelm@44121
   195
    {
wenzelm@44121
   196
      have a: A sorry
wenzelm@44121
   197
    }
wenzelm@44121
   198
    {
wenzelm@44121
   199
      have b: B
wenzelm@44121
   200
      proof -
wenzelm@44121
   201
        {
wenzelm@44121
   202
          show B sorry
wenzelm@44121
   203
        }
wenzelm@44121
   204
        {
wenzelm@44121
   205
          have c: C sorry
wenzelm@44121
   206
        }
wenzelm@44121
   207
        {
wenzelm@44121
   208
          have d: D sorry
wenzelm@44121
   209
        }
wenzelm@44121
   210
      qed
wenzelm@44121
   211
    }
wenzelm@44121
   212
  }
wenzelm@44121
   213
wenzelm@44121
   214
end
wenzelm@44121
   215
wenzelm@44121
   216
end