ProgTutorial/Parsing.thy
author Norbert Schirmer <norbert.schirmer@web.de>
Wed, 22 May 2019 12:38:51 +0200
changeset 574 034150db9d91
parent 573 321e220a6baa
child 575 c3dbc04471a9
permissions -rw-r--r--
polish document
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
2a69b119cdee added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     1
theory Parsing
556
3c214b215f7e some small updates for Isabelle and corrections in the Parsing chapter
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 555
diff changeset
     2
imports Base "Package/Simple_Inductive_Package"
3c214b215f7e some small updates for Isabelle and corrections in the Parsing chapter
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 555
diff changeset
     3
keywords "foobar" "foobar_trace" :: thy_decl and
3c214b215f7e some small updates for Isabelle and corrections in the Parsing chapter
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 555
diff changeset
     4
         "foobar_goal" "foobar_prove" :: thy_goal
4
2a69b119cdee added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     5
begin
2a69b119cdee added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     6
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
     7
chapter \<open>Parsing\label{chp:parsing}\<close>
4
2a69b119cdee added verbatim the notes by Jeremy
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     8
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
     9
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
    10
text \<open>
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
    11
  \begin{flushright}
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
    12
  {\em An important principle underlying the success and popularity of Unix\\ is
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
    13
  the philosophy of building on the work of others.} \\[1ex]
539
12861a362099 updated to new isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 529
diff changeset
    14
  Tony Travis in an email about the\\ ``LINUX is obsolete'' debate 
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
    15
  \end{flushright}
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
    16
541
96d10631eec2 added readme and fixed output in Subgoal.FOCUS section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 539
diff changeset
    17
  \begin{flushright}
96d10631eec2 added readme and fixed output in Subgoal.FOCUS section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 539
diff changeset
    18
  {\em
96d10631eec2 added readme and fixed output in Subgoal.FOCUS section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 539
diff changeset
    19
  Document your code as if someone else might have to take it over at any 
96d10631eec2 added readme and fixed output in Subgoal.FOCUS section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 539
diff changeset
    20
  moment and know what to do with it. That person might actually be you -- 
96d10631eec2 added readme and fixed output in Subgoal.FOCUS section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 539
diff changeset
    21
  how often have you had to revisit your own code and thought to yourself, 
96d10631eec2 added readme and fixed output in Subgoal.FOCUS section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 539
diff changeset
    22
  what was I trying to do here?} \\[1ex]
96d10631eec2 added readme and fixed output in Subgoal.FOCUS section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 539
diff changeset
    23
  Phil Chu in ``Seven Habits of Highly Effective Programmers'' 
96d10631eec2 added readme and fixed output in Subgoal.FOCUS section
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 539
diff changeset
    24
  \end{flushright}
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
    25
321
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
    26
  Isabelle distinguishes between \emph{outer} and \emph{inner}
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
    27
  syntax. Commands, such as \isacommand{definition}, \isacommand{inductive}
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
    28
  and so on, belong to the outer syntax, whereas terms, types and so on belong
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
    29
  to the inner syntax. For parsing inner syntax, Isabelle uses a rather
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
    30
  general and sophisticated algorithm, which is driven by priority
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
    31
  grammars. Parsers for outer syntax are built up by functional parsing
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
    32
  combinators. These combinators are a well-established technique for parsing,
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
    33
  which has, for example, been described in Paulson's classic ML-book
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
    34
  \cite{paulson-ml2}.  Isabelle developers are usually concerned with writing
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
    35
  these outer syntax parsers, either for new definitional packages or for
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
    36
  calling methods with specific arguments.
42
cd612b489504 tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents: 41
diff changeset
    37
cd612b489504 tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents: 41
diff changeset
    38
  \begin{readmore}
236
7b6d81ff9d9a some polishing
Christian Urban <urbanc@in.tum.de>
parents: 230
diff changeset
    39
  The library for writing parser combinators is split up, roughly, into two
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
    40
  parts: The first part consists of a collection of generic parser combinators
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
    41
  defined in the structure @{ML_structure Scan} in the file @{ML_file
236
7b6d81ff9d9a some polishing
Christian Urban <urbanc@in.tum.de>
parents: 230
diff changeset
    42
  "Pure/General/scan.ML"}. The second part of the library consists of
7b6d81ff9d9a some polishing
Christian Urban <urbanc@in.tum.de>
parents: 230
diff changeset
    43
  combinators for dealing with specific token types, which are defined in the
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
    44
  structure @{ML_structure Parse} in the file @{ML_file
424
5e0a2b50707e updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 422
diff changeset
    45
  "Pure/Isar/parse.ML"}. In addition specific parsers for packages are 
5e0a2b50707e updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 422
diff changeset
    46
  defined in @{ML_file "Pure/Isar/parse_spec.ML"}. Parsers for method arguments 
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
    47
  are defined in @{ML_file "Pure/Isar/args.ML"}.
42
cd612b489504 tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents: 41
diff changeset
    48
  \end{readmore}
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
    49
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
    50
\<close>
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
    51
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
    52
section \<open>Building Generic Parsers\<close>
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
    53
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
    54
text \<open>
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
    55
240
d111f5988e49 replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents: 236
diff changeset
    56
  Let us first have a look at parsing strings using generic parsing
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
    57
  combinators. The function @{ML_ind "$$" in Scan} takes a string as argument and will
240
d111f5988e49 replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents: 236
diff changeset
    58
  ``consume'' this string from a given input list of strings. ``Consume'' in
d111f5988e49 replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents: 236
diff changeset
    59
  this context means that it will return a pair consisting of this string and
d111f5988e49 replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents: 236
diff changeset
    60
  the rest of the input list. For example:
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
    61
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
    62
  @{ML_matchresult [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
    63
  \<open>($$ "h") (Symbol.explode "hello")\<close> \<open>("h", ["e", "l", "l", "o"])\<close>}
72
7b8c4fe235aa added an antiquotation option [gray] for gray boxes around displays
Christian Urban <urbanc@in.tum.de>
parents: 69
diff changeset
    64
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
    65
  @{ML_matchresult [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
    66
  \<open>($$ "w") (Symbol.explode "world")\<close> \<open>("w", ["o", "r", "l", "d"])\<close>}
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
    67
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
    68
  The function @{ML \<open>$$\<close>} will either succeed (as in the two examples above)
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
    69
  or raise the exception \<open>FAIL\<close> if no string can be consumed. For
240
d111f5988e49 replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents: 236
diff changeset
    70
  example trying to parse
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
    71
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
    72
  @{ML_response [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
    73
  \<open>($$ "x") (Symbol.explode "world")\<close> 
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
    74
  \<open>exception FAIL NONE raised\<close>}
41
b11653b11bd3 further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents: 40
diff changeset
    75
  
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
    76
  will raise the exception \<open>FAIL\<close>. The function @{ML_ind "$$" in Scan} will also
556
3c214b215f7e some small updates for Isabelle and corrections in the Parsing chapter
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 555
diff changeset
    77
  fail if you try to consume more than a single character.
3c214b215f7e some small updates for Isabelle and corrections in the Parsing chapter
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 555
diff changeset
    78
3c214b215f7e some small updates for Isabelle and corrections in the Parsing chapter
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 555
diff changeset
    79
  There are three exceptions that are raised by the parsing combinators:
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
    80
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
    81
  \begin{itemize}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
    82
  \item \<open>FAIL\<close> indicates that alternative routes of parsing 
41
b11653b11bd3 further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents: 40
diff changeset
    83
  might be explored. 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
    84
  \item \<open>MORE\<close> indicates that there is not enough input for the parser. For example 
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
    85
  in \<open>($$ "h") []\<close>.
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
    86
  \item \<open>ABORT\<close> indicates that a dead end is reached. 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
    87
  It is used for example in the function @{ML \<open>!!\<close>} (see below).
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
    88
  \end{itemize}
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
    89
50
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
    90
  However, note that these exceptions are private to the parser and cannot be accessed
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
    91
  by the programmer (for example to handle them).
240
d111f5988e49 replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents: 236
diff changeset
    92
357
80b56d9b322f included a comment from Tim Bourke
Christian Urban <urbanc@in.tum.de>
parents: 346
diff changeset
    93
  In the examples above we use the function @{ML_ind explode in Symbol} from the
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
    94
  structure @{ML_structure Symbol}, instead of the more standard library function
369
74ba778b09c9 tuned index
Christian Urban <urbanc@in.tum.de>
parents: 366
diff changeset
    95
  @{ML_ind explode in String}, for obtaining an input list for the parser. The reason is
458
242e81f4d461 updated to post-2011 Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 451
diff changeset
    96
  that @{ML explode in Symbol} is aware of character
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
    97
  sequences, for example \<open>\<foo>\<close>, that have a special meaning in
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
    98
  Isabelle. To see the difference consider
240
d111f5988e49 replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents: 236
diff changeset
    99
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   100
@{ML_matchresult [display,gray]
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   101
\<open>String.explode "\<foo> bar"\<close>
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   102
\<open>[#"\\", #"<", #"f", #"o", #"o", #">", #" ", #"b", #"a", #"r"]\<close>}
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   103
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   104
@{ML_matchresult [display,gray]
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   105
\<open>Symbol.explode "\<foo> bar"\<close>
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   106
\<open>["\<foo>", " ", "b", "a", "r"]\<close>}
240
d111f5988e49 replaced explode by Symbol.explode
Christian Urban <urbanc@in.tum.de>
parents: 236
diff changeset
   107
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   108
  Slightly more general than the parser @{ML \<open>$$\<close>} is the function 
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   109
  @{ML_ind one in Scan}, in that it takes a predicate as argument and 
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 250
diff changeset
   110
  then parses exactly
52
Christian Urban <urbanc@in.tum.de>
parents: 50
diff changeset
   111
  one item from the input list satisfying this predicate. For example the
58
f3794c231898 fixed typos
Christian Urban <urbanc@in.tum.de>
parents: 56
diff changeset
   112
  following parser either consumes an @{text [quotes] "h"} or a @{text
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   113
  [quotes] "w"}:
41
b11653b11bd3 further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents: 40
diff changeset
   114
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   115
@{ML_matchresult [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   116
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   117
  val hw = Scan.one (fn x => x = "h" orelse x = "w")
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   118
  val input1 = Symbol.explode "hello"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   119
  val input2 = Symbol.explode "world"
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   120
in
236
7b6d81ff9d9a some polishing
Christian Urban <urbanc@in.tum.de>
parents: 230
diff changeset
   121
  (hw input1, hw input2)
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   122
end\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   123
    \<open>(("h", ["e", "l", "l", "o"]),("w", ["o", "r", "l", "d"]))\<close>}
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   124
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   125
  Two parsers can be connected in sequence by using the function @{ML_ind "--" in Scan}. 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   126
  For example parsing \<open>h\<close>, \<open>e\<close> and \<open>l\<close> (in this 
220
fbcb89d84ba6 polishing
griff
parents: 211
diff changeset
   127
  order) you can achieve by:
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   128
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   129
  @{ML_matchresult [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   130
  \<open>($$ "h" -- $$ "e" -- $$ "l") (Symbol.explode "hello")\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   131
  \<open>((("h", "e"), "l"), ["l", "o"])\<close>}
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   132
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   133
  Note how the result of consumed strings builds up on the left as nested pairs.  
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   134
102
5e309df58557 general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents: 101
diff changeset
   135
  If, as in the previous example, you want to parse a particular string, 
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   136
  then you can use the function @{ML_ind this_string in Scan}.
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   137
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   138
  @{ML_matchresult [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   139
  \<open>Scan.this_string "hell" (Symbol.explode "hello")\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   140
  \<open>("hell", ["o"])\<close>}
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   141
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 250
diff changeset
   142
  Parsers that explore alternatives can be constructed using the function 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   143
  @{ML_ind  "||" in Scan}. The parser @{ML \<open>(p || q)\<close> for p q} returns the
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   144
  result of \<open>p\<close>, in case it succeeds; otherwise it returns the
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   145
  result of \<open>q\<close>. For example:
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   146
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   147
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   148
@{ML_matchresult [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   149
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   150
  val hw = $$ "h" || $$ "w"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   151
  val input1 = Symbol.explode "hello"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   152
  val input2 = Symbol.explode "world"
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   153
in
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   154
  (hw input1, hw input2)
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   155
end\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   156
  \<open>(("h", ["e", "l", "l", "o"]), ("w", ["o", "r", "l", "d"]))\<close>}
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   157
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   158
  The functions @{ML_ind "|--" in Scan} and @{ML_ind "--|" in Scan} work like the sequencing
321
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
   159
  function for parsers, except that they discard the item being parsed by the
357
80b56d9b322f included a comment from Tim Bourke
Christian Urban <urbanc@in.tum.de>
parents: 346
diff changeset
   160
  first (respectively second) parser. That means the item being dropped is the 
80b56d9b322f included a comment from Tim Bourke
Christian Urban <urbanc@in.tum.de>
parents: 346
diff changeset
   161
  one that @{ML_ind "|--" in Scan} and @{ML_ind "--|" in Scan} ``point'' away.
80b56d9b322f included a comment from Tim Bourke
Christian Urban <urbanc@in.tum.de>
parents: 346
diff changeset
   162
  For example:
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   163
  
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   164
@{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   165
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   166
  val just_e = $$ "h" |-- $$ "e" 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   167
  val just_h = $$ "h" --| $$ "e" 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   168
  val input = Symbol.explode "hello"  
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   169
in 
47
4daf913fdbe1 hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents: 44
diff changeset
   170
  (just_e input, just_h input)
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   171
end\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   172
  \<open>(("e", ["l", "l", "o"]), ("h", ["l", "l", "o"]))\<close>}
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   173
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   174
  The parser @{ML \<open>Scan.optional p x\<close> for p x} returns the result of the parser 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   175
  \<open>p\<close>, in case it succeeds; otherwise it returns 
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   176
  the default value \<open>x\<close>. For example:
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   177
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   178
@{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   179
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   180
  val p = Scan.optional ($$ "h") "x"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   181
  val input1 = Symbol.explode "hello"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   182
  val input2 = Symbol.explode "world"  
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   183
in 
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   184
  (p input1, p input2)
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   185
end\<close> 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   186
 \<open>(("h", ["e", "l", "l", "o"]), ("x", ["w", "o", "r", "l", "d"]))\<close>}
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   187
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   188
  The function @{ML_ind option in Scan} works similarly, except no default value can
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   189
  be given. Instead, the result is wrapped as an \<open>option\<close>-type. For example:
50
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   190
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   191
@{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   192
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   193
  val p = Scan.option ($$ "h")
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   194
  val input1 = Symbol.explode "hello"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   195
  val input2 = Symbol.explode "world"  
50
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   196
in 
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   197
  (p input1, p input2)
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   198
end\<close> \<open>((SOME "h", ["e", "l", "l", "o"]), (NONE, ["w", "o", "r", "l", "d"]))\<close>}
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   199
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   200
  The function @{ML_ind ahead in Scan} parses some input, but leaves the original
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   201
  input unchanged. For example:
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   202
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   203
  @{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   204
  \<open>Scan.ahead (Scan.this_string "foo") (Symbol.explode "foo")\<close> 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   205
  \<open>("foo", ["f", "o", "o"])\<close>} 
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   206
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   207
  The function @{ML_ind "!!" in Scan} helps with producing appropriate error messages
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   208
  during parsing. For example if you want to parse \<open>p\<close> immediately 
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   209
  followed by \<open>q\<close>, or start a completely different parser \<open>r\<close>,
104
5dcad9348e4d polished
Christian Urban <urbanc@in.tum.de>
parents: 102
diff changeset
   210
  you might write:
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   211
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   212
  @{ML [display,gray] \<open>(p -- q) || r\<close> for p q r}
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   213
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   214
  However, this parser is problematic for producing a useful error
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   215
  message, if the parsing of @{ML \<open>(p -- q)\<close> for p q} fails. Because with the
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   216
  parser above you lose the information that \<open>p\<close> should be followed by \<open>q\<close>.
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   217
  To see this assume that \<open>p\<close> is present in the input, but it is not
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   218
  followed by \<open>q\<close>. That means @{ML \<open>(p -- q)\<close> for p q} will fail and
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   219
  hence the alternative parser \<open>r\<close> will be tried. However, in many
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   220
  circumstances this will be the wrong parser for the input ``\<open>p\<close>-followed-by-something''
220
fbcb89d84ba6 polishing
griff
parents: 211
diff changeset
   221
  and therefore will also fail. The error message is then caused by the failure
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   222
  of \<open>r\<close>, not by the absence of \<open>q\<close> in the input. Such
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   223
  situation can be avoided when using the function @{ML \<open>!!\<close>}.  This function
220
fbcb89d84ba6 polishing
griff
parents: 211
diff changeset
   224
  aborts the whole process of parsing in case of a failure and prints an error
fbcb89d84ba6 polishing
griff
parents: 211
diff changeset
   225
  message. For example if you invoke the parser
102
5e309df58557 general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents: 101
diff changeset
   226
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   227
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   228
  @{ML [display,gray] \<open>!! (fn _ => fn _ =>"foo") ($$ "h")\<close>}
556
3c214b215f7e some small updates for Isabelle and corrections in the Parsing chapter
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 555
diff changeset
   229
58
f3794c231898 fixed typos
Christian Urban <urbanc@in.tum.de>
parents: 56
diff changeset
   230
  on @{text [quotes] "hello"}, the parsing succeeds
39
631d12c25bde substantial changes to the antiquotations (preliminary version)
Christian Urban <urbanc@in.tum.de>
parents: 38
diff changeset
   231
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   232
  @{ML_matchresult [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   233
  \<open>(!! (fn _ => fn _ => "foo") ($$ "h")) (Symbol.explode "hello")\<close> 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   234
  \<open>("h", ["e", "l", "l", "o"])\<close>}
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   235
102
5e309df58557 general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents: 101
diff changeset
   236
  but if you invoke it on @{text [quotes] "world"}
472
1bbe4268664d updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 458
diff changeset
   237
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   238
  @{ML_response [display,gray] \<open>(!! (fn _ => fn _ => "foo") ($$ "h")) (Symbol.explode "world")\<close>
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   239
                               \<open>exception ABORT fn raised\<close>}
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   240
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   241
  then the parsing aborts and the error message \<open>foo\<close> is printed. In order to
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 116
diff changeset
   242
  see the error message properly, you need to prefix the parser with the function 
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   243
  @{ML_ind error in Scan}. For example:
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   244
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   245
  @{ML_response [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   246
  \<open>Scan.error (!! (fn _ => fn _ => "foo") ($$ "h")) (Symbol.explode "world")\<close>
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   247
  \<open>foo\<close>}
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   248
556
3c214b215f7e some small updates for Isabelle and corrections in the Parsing chapter
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 555
diff changeset
   249
  This kind of ``prefixing'' to see the correct error message is usually done by wrappers 
3c214b215f7e some small updates for Isabelle and corrections in the Parsing chapter
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 555
diff changeset
   250
  such as @{ML_ind local_theory in Outer_Syntax} 
102
5e309df58557 general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents: 101
diff changeset
   251
  (see Section~\ref{sec:newcommand} which explains this function in more detail). 
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   252
  
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   253
  Let us now return to our example of parsing @{ML \<open>(p -- q) || r\<close> for p q
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   254
  r}. If you want to generate the correct error message for failure
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   255
  of parsing \<open>p\<close>-followed-by-\<open>q\<close>, then you have to write:
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   256
\<close>
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   257
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   258
ML %grayML\<open>fun p_followed_by_q p q r =
133
3e94ccc0f31e polishing and start of the section about attributes
Christian Urban <urbanc@in.tum.de>
parents: 132
diff changeset
   259
let 
236
7b6d81ff9d9a some polishing
Christian Urban <urbanc@in.tum.de>
parents: 230
diff changeset
   260
  val err_msg = fn _ => p ^ " is not followed by " ^ q
133
3e94ccc0f31e polishing and start of the section about attributes
Christian Urban <urbanc@in.tum.de>
parents: 132
diff changeset
   261
in
472
1bbe4268664d updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 458
diff changeset
   262
  ($$ p -- (!! (fn _ => err_msg) ($$ q))) || ($$ r -- $$ r)
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   263
end\<close>
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   264
41
b11653b11bd3 further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents: 40
diff changeset
   265
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   266
text \<open>
220
fbcb89d84ba6 polishing
griff
parents: 211
diff changeset
   267
  Running this parser with the arguments
fbcb89d84ba6 polishing
griff
parents: 211
diff changeset
   268
  @{text [quotes] "h"}, @{text [quotes] "e"} and @{text [quotes] "w"}, and 
65
c8e9a4f97916 tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents: 60
diff changeset
   269
  the input @{text [quotes] "holle"} 
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   270
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   271
  @{ML_response [display,gray] \<open>Scan.error (p_followed_by_q "h" "e" "w") (Symbol.explode "holle")\<close>
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   272
                               \<open>h is not followed by e\<close>} 
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   273
65
c8e9a4f97916 tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents: 60
diff changeset
   274
  produces the correct error message. Running it with
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   275
 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   276
  @{ML_matchresult [display,gray] \<open>Scan.error (p_followed_by_q "h" "e" "w") (Symbol.explode "wworld")\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   277
                          \<open>(("w", "w"), ["o", "r", "l", "d"])\<close>}
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   278
  
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   279
  yields the expected parsing. 
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   280
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   281
  The function @{ML \<open>Scan.repeat p\<close> for p} will apply a parser \<open>p\<close> as 
559
ffa5c4ec9611 improvements by Piotr Trojanek
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 558
diff changeset
   282
  long as it succeeds. For example:
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   283
  
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   284
  @{ML_matchresult [display,gray] \<open>Scan.repeat ($$ "h") (Symbol.explode "hhhhello")\<close> 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   285
                \<open>(["h", "h", "h", "h"], ["e", "l", "l", "o"])\<close>}
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   286
  
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   287
  Note that @{ML_ind repeat in Scan} stores the parsed items in a list. The function
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   288
  @{ML_ind repeat1 in Scan} is similar, but requires that the parser \<open>p\<close> 
41
b11653b11bd3 further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents: 40
diff changeset
   289
  succeeds at least once.
48
609f9ef73494 fixed FIXME's in fake responses
Christian Urban <urbanc@in.tum.de>
parents: 47
diff changeset
   290
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   291
  Also note that the parser would have aborted with the exception \<open>MORE\<close>, if
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   292
  you had it run with the string @{text [quotes] "hhhh"}. This can be avoided by using
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   293
  the wrapper @{ML_ind finite in Scan} and the ``stopper-token'' 
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   294
  @{ML_ind stopper in Symbol}. With them you can write:
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   295
  
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   296
  @{ML_matchresult [display,gray] \<open>Scan.finite Symbol.stopper (Scan.repeat ($$ "h")) (Symbol.explode "hhhh")\<close> 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   297
                \<open>(["h", "h", "h", "h"], [])\<close>}
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   298
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   299
  The function @{ML stopper in Symbol} is the ``end-of-input'' indicator for parsing strings;
128
693711a0c702 polished
Christian Urban <urbanc@in.tum.de>
parents: 127
diff changeset
   300
  other stoppers need to be used when parsing, for example, tokens. However, this kind of 
65
c8e9a4f97916 tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents: 60
diff changeset
   301
  manually wrapping is often already done by the surrounding infrastructure. 
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   302
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   303
  The function @{ML_ind repeat in Scan} can be used with @{ML_ind one in Scan} to read any 
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   304
  string as in
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   305
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   306
  @{ML_matchresult [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   307
\<open>let 
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   308
   val p = Scan.repeat (Scan.one Symbol.not_eof)
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   309
   val input = Symbol.explode "foo bar foo"
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   310
in
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   311
   Scan.finite Symbol.stopper p input
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   312
end\<close> 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   313
\<open>(["f", "o", "o", " ", "b", "a", "r", " ", "f", "o", "o"], [])\<close>}
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   314
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   315
  where the function @{ML_ind not_eof in Symbol} ensures that we do not read beyond the 
65
c8e9a4f97916 tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents: 60
diff changeset
   316
  end of the input string (i.e.~stopper symbol).
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   317
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   318
  The function @{ML_ind unless in Scan} takes two parsers: if the first one can 
60
5b9c6010897b doem tuning and made the cookbook work again with recent changes (CookBook/Package/Ind_Interface.thy needs to be looked at to see what the problem with the new parser type is)
Christian Urban <urbanc@in.tum.de>
parents: 59
diff changeset
   319
  parse the input, then the whole parser fails; if not, then the second is tried. Therefore
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   320
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   321
  @{ML_response [display,gray] \<open>Scan.unless ($$ "h") ($$ "w") (Symbol.explode "hello")\<close>
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   322
                               "exception FAIL NONE raised"}
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   323
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   324
  fails, while
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   325
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   326
  @{ML_matchresult [display,gray] \<open>Scan.unless ($$ "h") ($$ "w") (Symbol.explode "world")\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   327
                          \<open>("w",["o", "r", "l", "d"])\<close>}
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   328
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   329
  succeeds. 
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   330
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   331
  The functions @{ML_ind repeat in Scan} and @{ML_ind unless in Scan} can 
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 250
diff changeset
   332
  be combined to read any input until a certain marker symbol is reached. In the 
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 250
diff changeset
   333
  example below the marker symbol is a @{text [quotes] "*"}.
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   334
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   335
  @{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   336
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   337
  val p = Scan.repeat (Scan.unless ($$ "*") (Scan.one Symbol.not_eof))
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   338
  val input1 = Symbol.explode "fooooo"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   339
  val input2 = Symbol.explode "foo*ooo"
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   340
in
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   341
  (Scan.finite Symbol.stopper p input1, 
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   342
   Scan.finite Symbol.stopper p input2)
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   343
end\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   344
\<open>((["f", "o", "o", "o", "o", "o"], []),
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   345
 (["f", "o", "o"], ["*", "o", "o", "o"]))\<close>}
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   346
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 250
diff changeset
   347
  
220
fbcb89d84ba6 polishing
griff
parents: 211
diff changeset
   348
  After parsing is done, you almost always want to apply a function to the parsed 
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   349
  items. One way to do this is the function @{ML_ind ">>" in Scan} where 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   350
  @{ML \<open>(p >> f)\<close> for p f} runs 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   351
  first the parser \<open>p\<close> and upon successful completion applies the 
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   352
  function \<open>f\<close> to the result. For example
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   353
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   354
@{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   355
\<open>let 
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
   356
  fun double (x, y) = (x ^ x, y ^ y) 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   357
  val parser = $$ "h" -- $$ "e"
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   358
in
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   359
  (parser >> double) (Symbol.explode "hello")
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   360
end\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   361
\<open>(("hh", "ee"), ["l", "l", "o"])\<close>}
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   362
104
5dcad9348e4d polished
Christian Urban <urbanc@in.tum.de>
parents: 102
diff changeset
   363
  doubles the two parsed input strings; or
59
Christian Urban <urbanc@in.tum.de>
parents: 58
diff changeset
   364
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   365
  @{ML_matchresult [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   366
\<open>let 
104
5dcad9348e4d polished
Christian Urban <urbanc@in.tum.de>
parents: 102
diff changeset
   367
   val p = Scan.repeat (Scan.one Symbol.not_eof)
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   368
   val input = Symbol.explode "foo bar foo" 
59
Christian Urban <urbanc@in.tum.de>
parents: 58
diff changeset
   369
in
104
5dcad9348e4d polished
Christian Urban <urbanc@in.tum.de>
parents: 102
diff changeset
   370
   Scan.finite Symbol.stopper (p >> implode) input
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   371
end\<close> 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   372
\<open>("foo bar foo",[])\<close>}
59
Christian Urban <urbanc@in.tum.de>
parents: 58
diff changeset
   373
60
5b9c6010897b doem tuning and made the cookbook work again with recent changes (CookBook/Package/Ind_Interface.thy needs to be looked at to see what the problem with the new parser type is)
Christian Urban <urbanc@in.tum.de>
parents: 59
diff changeset
   374
  where the single-character strings in the parsed output are transformed
59
Christian Urban <urbanc@in.tum.de>
parents: 58
diff changeset
   375
  back into one string.
56
126646f2aa88 added a para on Scan.unless and an exercise about scanning comments
Christian Urban <urbanc@in.tum.de>
parents: 54
diff changeset
   376
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
   377
  The function @{ML_ind lift in Scan} takes a parser and a pair as arguments. This function applies
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   378
  the given parser to the second component of the pair and leaves the  first component 
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   379
  untouched. For example
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   380
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   381
@{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   382
\<open>Scan.lift ($$ "h" -- $$ "e") (1, Symbol.explode "hello")\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   383
\<open>(("h", "e"), (1, ["l", "l", "o"]))\<close>}
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   384
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   385
  \footnote{\bf FIXME: In which situations is \<open>lift\<close> useful? Give examples.} 
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   386
397
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   387
  Be aware of recursive parsers. Suppose you want to read strings separated by
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   388
  commas and by parentheses into a tree datastructure; for example, generating
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   389
  the tree corresponding to the string @{text [quotes] "(A, A), (A, A)"} where
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   390
  the \<open>A\<close>s will be the leaves.  We assume the trees are represented by the
397
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   391
  datatype:
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   392
\<close>
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   393
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   394
ML %grayML\<open>datatype tree = 
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   395
    Lf of string 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   396
  | Br of tree * tree\<close>
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   397
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   398
text \<open>
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   399
  Since nested parentheses should be treated in a meaningful way---for example
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   400
  the string @{text [quotes] "((A))"} should be read into a single 
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   401
  leaf---you might implement the following parser.
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   402
\<close>
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   403
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   404
ML %grayML\<open>fun parse_basic s = 
397
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   405
  $$ s >> Lf || $$ "(" |-- parse_tree s --| $$ ")"  
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   406
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   407
and parse_tree s = 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   408
  parse_basic s --| $$ "," -- parse_tree s >> Br || parse_basic s\<close>
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   409
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   410
text \<open>
523
0753bc271fd5 proofread section 5.8 + spell-checked Parsing.thy
Christian Sternagel
parents: 522
diff changeset
   411
  This parser corresponds to the grammar:
397
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   412
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   413
  \begin{center}
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   414
  \begin{tabular}{lcl}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   415
  \<open><Basic>\<close>  & \<open>::=\<close> & \<open><String> | (<Tree>)\<close>\\
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   416
  \<open><Tree>\<close>   & \<open>::=\<close> & \<open><Basic>, <Tree> | <Basic>\<close>\\
397
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   417
  \end{tabular}
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   418
  \end{center}
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   419
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   420
  The parameter \<open>s\<close> is the string over which the tree is parsed. The
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   421
  parser @{ML parse_basic} reads either a leaf or a tree enclosed in
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   422
  parentheses. The parser @{ML parse_tree} reads either a pair of trees
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   423
  separated by a comma, or acts like @{ML parse_basic}. Unfortunately,
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   424
  because of the mutual recursion, this parser will immediately run into a
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   425
  loop, even if it is called without any input. For example
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   426
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   427
  @{ML_matchresult_fake_both [display, gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   428
  \<open>parse_tree "A"\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   429
  \<open>*** Exception- TOPLEVEL_ERROR raised\<close>}
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   430
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   431
  raises an exception indicating that the stack limit is reached. Such
392
47e5b71c7f6c modified the typ-pretty-printer and added parser exercise
Christian Urban <urbanc@in.tum.de>
parents: 391
diff changeset
   432
  looping parser are not useful, because of ML's strict evaluation of
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   433
  arguments. Therefore we need to delay the execution of the
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   434
  parser until an input is given. This can be done by adding the parsed
397
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   435
  string as an explicit argument. So the parser above should be implemented
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   436
  as follows.
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   437
\<close>
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   438
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   439
ML %grayML\<open>fun parse_basic s xs = 
397
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   440
  ($$ s >> Lf || $$ "(" |-- parse_tree s --| $$ ")") xs 
Christian Urban <urbanc@in.tum.de>
parents: 394
diff changeset
   441
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   442
and parse_tree s xs = 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   443
  (parse_basic s --| $$ "," -- parse_tree s >> Br || parse_basic s) xs\<close>
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   444
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   445
text \<open>
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   446
  While the type of the parser is unchanged by the addition, its behaviour 
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   447
  changed: with this version of the parser the execution is delayed until 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   448
  some string is  applied for the argument \<open>xs\<close>. This gives us 
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   449
  exactly the parser what we wanted. An example is as follows:
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   450
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   451
  @{ML_matchresult [display, gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   452
  \<open>let
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   453
  val input = Symbol.explode "(A,((A))),A"
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   454
in
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   455
  Scan.finite Symbol.stopper (parse_tree "A") input
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   456
end\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   457
  \<open>(Br (Br (Lf "A", Lf "A"), Lf "A"), [])\<close>}
390
8ad407e77ea0 added example by Lukas Bulwahn
Christian Urban <urbanc@in.tum.de>
parents: 376
diff changeset
   458
149
253ea99c1441 polished
Christian Urban <urbanc@in.tum.de>
parents: 133
diff changeset
   459
253ea99c1441 polished
Christian Urban <urbanc@in.tum.de>
parents: 133
diff changeset
   460
  \begin{exercise}\label{ex:scancmts}
253ea99c1441 polished
Christian Urban <urbanc@in.tum.de>
parents: 133
diff changeset
   461
  Write a parser that parses an input string so that any comment enclosed
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   462
  within \<open>(*\<dots>*)\<close> is replaced by the same comment but enclosed within
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   463
  \<open>(**\<dots>**)\<close> in the output string. To enclose a string, you can use the
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   464
  function @{ML \<open>enclose s1 s2 s\<close> for s1 s2 s} which produces the string @{ML \<open>s1 ^ s ^ s2\<close> for s1 s2 s}. Hint: To simplify the task ignore the proper 
236
7b6d81ff9d9a some polishing
Christian Urban <urbanc@in.tum.de>
parents: 230
diff changeset
   465
  nesting of comments.
149
253ea99c1441 polished
Christian Urban <urbanc@in.tum.de>
parents: 133
diff changeset
   466
  \end{exercise}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   467
\<close>
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   468
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   469
section \<open>Parsing Theory Syntax\<close>
38
e21b2f888fa2 added a preliminary section about parsing
Christian Urban <urbanc@in.tum.de>
parents: 16
diff changeset
   470
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   471
text \<open>
102
5e309df58557 general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents: 101
diff changeset
   472
  Most of the time, however, Isabelle developers have to deal with parsing
156
e8f11280c762 polished
Christian Urban <urbanc@in.tum.de>
parents: 149
diff changeset
   473
  tokens, not strings.  These token parsers have the type:
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   474
\<close>
128
693711a0c702 polished
Christian Urban <urbanc@in.tum.de>
parents: 127
diff changeset
   475
  
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   476
ML %grayML\<open>type 'a parser = Token.T list -> 'a * Token.T list\<close>
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   477
ML "Thy_Header.get_keywords'"
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   478
text \<open>
514
7e25716c3744 updated to outer syntax / parser changes
Christian Urban <urbanc@in.tum.de>
parents: 473
diff changeset
   479
  {\bf REDO!!}
7e25716c3744 updated to outer syntax / parser changes
Christian Urban <urbanc@in.tum.de>
parents: 473
diff changeset
   480
7e25716c3744 updated to outer syntax / parser changes
Christian Urban <urbanc@in.tum.de>
parents: 473
diff changeset
   481
149
253ea99c1441 polished
Christian Urban <urbanc@in.tum.de>
parents: 133
diff changeset
   482
  The reason for using token parsers is that theory syntax, as well as the
128
693711a0c702 polished
Christian Urban <urbanc@in.tum.de>
parents: 127
diff changeset
   483
  parsers for the arguments of proof methods, use the type @{ML_type
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   484
  Token.T}.
42
cd612b489504 tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents: 41
diff changeset
   485
cd612b489504 tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents: 41
diff changeset
   486
  \begin{readmore}
40
35e1dff0d9bb more on the parsing section
Christian Urban <urbanc@in.tum.de>
parents: 39
diff changeset
   487
  The parser functions for the theory syntax are contained in the structure
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   488
  @{ML_structure Parse} defined in the file @{ML_file  "Pure/Isar/parse.ML"}.
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   489
  The definition for tokens is in the file @{ML_file "Pure/Isar/token.ML"}.
42
cd612b489504 tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents: 41
diff changeset
   490
  \end{readmore}
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   491
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   492
  The structure @{ML_structure  Token} defines several kinds of tokens (for
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   493
  example @{ML_ind Ident in Token} for identifiers, @{ML Keyword in
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   494
  Token} for keywords and @{ML_ind Command in Token} for commands). Some
230
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   495
  token parsers take into account the kind of tokens. The first example shows
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 250
diff changeset
   496
  how to generate a token list out of a string using the function 
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   497
  @{ML_ind explode in Token}. It is given the argument 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   498
  @{ML \<open>Position.none\<close>} since,
230
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   499
  at the moment, we are not interested in generating precise error
376
76b1b679e845 removed comment about compiler bug
Christian Urban <urbanc@in.tum.de>
parents: 374
diff changeset
   500
  messages. The following code
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 52
diff changeset
   501
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   502
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   503
@{ML_response [display,gray] \<open>Token.explode 
566
6103b0eadbf2 tuned parser for patterns in ML_response... antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 565
diff changeset
   504
  (Thy_Header.get_keywords' @{context}) Position.none "hello world"\<close>
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   505
\<open>[Token (\<dots>(Ident, "hello"),\<dots>), 
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   506
 Token (\<dots>(Space, " "),\<dots>), 
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   507
 Token (\<dots>(Ident, "world"),\<dots>)]\<close>}
50
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   508
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   509
  produces three tokens where the first and the last are identifiers, since
58
f3794c231898 fixed typos
Christian Urban <urbanc@in.tum.de>
parents: 56
diff changeset
   510
  @{text [quotes] "hello"} and @{text [quotes] "world"} do not match any
230
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   511
  other syntactic category. The second indicates a space.
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   512
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   513
  We can easily change what is recognised as a keyword with the function
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   514
  @{ML_ind add_keywords in Thy_Header}. For example calling it with 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   515
\<close>
230
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   516
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   517
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   518
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   519
setup \<open>Thy_Header.add_keywords [(("hello", Position.none),Keyword.no_spec)]\<close>
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   520
230
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   521
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   522
text \<open>
230
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   523
  then lexing @{text [quotes] "hello world"} will produce
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   524
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   525
  @{ML_response [display,gray] \<open>Token.explode
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   526
  (Thy_Header.get_keywords' @{context}) Position.none "hello world"\<close> 
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   527
\<open>[Token (\<dots>(Keyword, "hello"),\<dots>), 
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   528
 Token (\<dots>(Space, " "),\<dots>), 
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   529
 Token (\<dots>(Ident, "world"),\<dots>)]\<close>}
50
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   530
241
29d4701c5ee1 polished
Christian Urban <urbanc@in.tum.de>
parents: 240
diff changeset
   531
  Many parsing functions later on will require white space, comments and the like
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 52
diff changeset
   532
  to have already been filtered out.  So from now on we are going to use the 
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   533
  functions @{ML filter} and @{ML_ind is_proper in Token} to do this. 
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 250
diff changeset
   534
  For example:
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   535
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   536
@{ML_response [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   537
\<open>let
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   538
   val input = Token.explode (Thy_Header.get_keywords' @{context}) Position.none "hello world"
50
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   539
in
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   540
   filter Token.is_proper input
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   541
end\<close> 
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   542
\<open>[Token (\<dots>(Keyword, "hello"), \<dots>), Token (\<dots>(Ident, "world"), \<dots>)]\<close>}
50
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   543
102
5e309df58557 general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents: 101
diff changeset
   544
  For convenience we define the function:
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   545
\<close>
50
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   546
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   547
ML %grayML\<open>fun filtered_input str = 
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   548
  filter Token.is_proper (Token.explode (Thy_Header.get_keywords' @{context}) Position.none str)\<close>
50
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   549
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   550
ML \<open>filtered_input "inductive | for"\<close>
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   551
text \<open>
102
5e309df58557 general cleaning up; deleted antiquotation ML_text; adjusted pathnames of various files in the distribution
Christian Urban <urbanc@in.tum.de>
parents: 101
diff changeset
   552
  If you now parse
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   553
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   554
@{ML_response [display,gray] 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   555
\<open>filtered_input "inductive | for"\<close> 
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   556
\<open>[Token (\<dots>(Command, "inductive"),\<dots>), 
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   557
 Token (\<dots>(Keyword, "|"),\<dots>), 
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   558
 Token (\<dots>(Keyword, "for"),\<dots>)]\<close>}
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   559
221
a9eb69749c93 corrected some typos
griff
parents: 220
diff changeset
   560
  you obtain a list consisting of only one command and two keyword tokens.
241
29d4701c5ee1 polished
Christian Urban <urbanc@in.tum.de>
parents: 240
diff changeset
   561
  If you want to see which keywords and commands are currently known to Isabelle, 
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   562
  use the function @{ML_ind get_keywords' in Thy_Header}:
47
4daf913fdbe1 hakked latex so that it does not display ML {* *}; general tuning
Christian Urban <urbanc@in.tum.de>
parents: 44
diff changeset
   563
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   564
  You might have to adjust the \<open>ML_print_depth\<close> in order to
241
29d4701c5ee1 polished
Christian Urban <urbanc@in.tum.de>
parents: 240
diff changeset
   565
  see the complete list.
29d4701c5ee1 polished
Christian Urban <urbanc@in.tum.de>
parents: 240
diff changeset
   566
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   567
  The parser @{ML_ind "$$$" in Parse} parses a single keyword. For example:
50
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   568
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   569
@{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   570
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   571
  val input1 = filtered_input "where for"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   572
  val input2 = filtered_input "| in"
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   573
in 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   574
  (Parse.$$$ "where" input1, Parse.$$$ "|" input2)
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   575
end\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   576
\<open>(("where",_), ("|",_))\<close>}
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   577
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   578
  Any non-keyword string can be parsed with the function @{ML_ind reserved in Parse}.
230
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   579
  For example:
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   580
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   581
  @{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   582
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   583
  val p = Parse.reserved "bar"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   584
  val input = filtered_input "bar"
230
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   585
in
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   586
  p input
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   587
end\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   588
  \<open>("bar",[])\<close>}
230
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   589
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   590
  Like before, you can sequentially connect parsers with @{ML \<open>--\<close>}. For example: 
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   591
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   592
@{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   593
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   594
  val input = filtered_input "| in"
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   595
in 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   596
  (Parse.$$$ "|" -- Parse.$$$ "in") input
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   597
end\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   598
\<open>(("|", "in"), [])\<close>}
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   599
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   600
  The parser @{ML \<open>Parse.enum s p\<close> for s p} parses a possibly empty 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   601
  list of items recognised by the parser \<open>p\<close>, where the items being parsed
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   602
  are separated by the string \<open>s\<close>. For example:
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   603
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   604
@{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   605
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   606
  val input = filtered_input "in | in | in foo"
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   607
in 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   608
  (Parse.enum "|" (Parse.$$$ "in")) input
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   609
end\<close> 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   610
\<open>(["in", "in", "in"], [_])\<close>}
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   611
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   612
  The function @{ML_ind enum1 in Parse} works similarly, except that the
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   613
  parsed list must be non-empty. Note that we had to add a string @{text
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   614
  [quotes] "foo"} at the end of the parsed string, otherwise the parser would
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   615
  have consumed all tokens and then failed with the exception \<open>MORE\<close>. Like in the previous section, we can avoid this exception using the
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   616
  wrapper @{ML Scan.finite}. This time, however, we have to use the
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   617
  ``stopper-token'' @{ML Token.stopper}. We can write:
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   618
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   619
@{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   620
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   621
  val input = filtered_input "in | in | in"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   622
  val p = Parse.enum "|" (Parse.$$$ "in")
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   623
in 
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   624
  Scan.finite Token.stopper p input
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   625
end\<close> 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   626
\<open>(["in", "in", "in"], [])\<close>}
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   627
75
Christian Urban <urbanc@in.tum.de>
parents: 74
diff changeset
   628
  The following function will help to run examples.
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   629
\<close>
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 52
diff changeset
   630
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   631
ML %grayML\<open>fun parse p input = Scan.finite Token.stopper (Scan.error p) input\<close>
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 52
diff changeset
   632
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   633
text \<open>
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   634
  The function @{ML_ind "!!!" in Parse} can be used to force termination
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   635
  of the parser in case of a dead end, just like @{ML \<open>Scan.!!\<close>} (see previous
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   636
  section). A difference, however, is that the error message of @{ML \<open>Parse.!!!\<close>} is fixed to be @{text [quotes] "Outer syntax error"}
221
a9eb69749c93 corrected some typos
griff
parents: 220
diff changeset
   637
  together with a relatively precise description of the failure. For example:
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   638
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   639
@{ML_response [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   640
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   641
  val input = filtered_input "in |"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   642
  val parse_bar_then_in = Parse.$$$ "|" -- Parse.$$$ "in"
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   643
in 
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   644
  parse (Parse.!!! parse_bar_then_in) input 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   645
end\<close>
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   646
\<open>Outer syntax error: keyword "|" expected, 
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   647
but keyword in was found\<close>
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   648
}
42
cd612b489504 tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents: 41
diff changeset
   649
65
c8e9a4f97916 tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents: 60
diff changeset
   650
  \begin{exercise} (FIXME)
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 52
diff changeset
   651
  A type-identifier, for example @{typ "'a"}, is a token of 
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   652
  kind @{ML_ind Keyword in Token}. It can be parsed using 
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   653
  the function @{ML type_ident in Parse}.
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 52
diff changeset
   654
  \end{exercise}
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 52
diff changeset
   655
104
5dcad9348e4d polished
Christian Urban <urbanc@in.tum.de>
parents: 102
diff changeset
   656
  (FIXME: or give parser for numbers)
53
0c3580c831a4 removed the @{ML ...} antiquotation in favour of @{ML_open ...x}
Christian Urban <urbanc@in.tum.de>
parents: 52
diff changeset
   657
125
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   658
  Whenever there is a possibility that the processing of user input can fail, 
221
a9eb69749c93 corrected some typos
griff
parents: 220
diff changeset
   659
  it is a good idea to give all available information about where the error 
220
fbcb89d84ba6 polishing
griff
parents: 211
diff changeset
   660
  occurred. For this Isabelle can attach positional information to tokens
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   661
  and then thread this information up the ``processing chain''. To see this,
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   662
  modify the function @{ML filtered_input}, described earlier, as follows 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   663
\<close>
41
b11653b11bd3 further progress on the parsing section and tuning on the antiqu's
Christian Urban <urbanc@in.tum.de>
parents: 40
diff changeset
   664
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   665
ML %grayML\<open>fun filtered_input' str = 
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   666
       filter Token.is_proper (Token.explode (Thy_Header.get_keywords' @{context}) (Position.line 7) str)\<close>
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   667
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   668
text \<open>
125
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   669
  where we pretend the parsed string starts on line 7. An example is
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   670
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   671
@{ML_response [display,gray]
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   672
\<open>filtered_input' "foo \n bar"\<close>
574
034150db9d91 polish document
Norbert Schirmer <norbert.schirmer@web.de>
parents: 573
diff changeset
   673
\<open>[Token (("foo", ({line=7, offset=1, end_offset=4}, 
034150db9d91 polish document
Norbert Schirmer <norbert.schirmer@web.de>
parents: 573
diff changeset
   674
   {line=7, offset=4})), (Ident, "foo"),\<dots>),
034150db9d91 polish document
Norbert Schirmer <norbert.schirmer@web.de>
parents: 573
diff changeset
   675
  Token (("bar", ({line=8, offset=7, end_offset=10}, 
034150db9d91 polish document
Norbert Schirmer <norbert.schirmer@web.de>
parents: 573
diff changeset
   676
   {line=8, offset=10})), (Ident, "bar"),\<dots>)]\<close>}
125
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   677
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   678
  in which the @{text [quotes] "\\n"} causes the second token to be in 
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   679
  line 8.
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   680
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   681
  By using the parser @{ML position in Parse} you can access the token 
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   682
  position and return it as part of the parser result. For example
125
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   683
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   684
@{ML_response [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   685
\<open>let
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   686
  val input = filtered_input' "where"
125
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   687
in 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   688
  parse (Parse.position (Parse.$$$ "where")) input
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   689
end\<close>
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   690
\<open>(("where", {line=7, offset=1, end_offset=6}), [])\<close>}
125
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   691
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   692
  \begin{readmore}
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   693
  The functions related to positions are implemented in the file
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   694
  @{ML_file "Pure/General/position.ML"}.
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   695
  \end{readmore}
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   696
391
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   697
  \begin{exercise}\label{ex:contextfree}
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   698
  Write a parser for the context-free grammar representing arithmetic 
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   699
  expressions with addition and multiplication. As usual, multiplication 
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   700
  binds stronger than addition, and both of them nest to the right. 
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   701
  The context-free grammar is defined as:
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   702
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   703
  \begin{center}
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   704
  \begin{tabular}{lcl}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   705
  \<open><Basic>\<close>  & \<open>::=\<close> & \<open><Number> | (<Expr>)\<close>\\
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   706
  \<open><Factor>\<close> & \<open>::=\<close> & \<open><Basic> * <Factor> | <Basic>\<close>\\
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   707
  \<open><Expr>\<close>   & \<open>::=\<close> & \<open><Factor> + <Expr>  | <Factor>\<close>\\
391
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   708
  \end{tabular}
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   709
  \end{center}
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   710
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   711
  Hint: Be careful with recursive parsers.
ae2f0b40c840 added exercise
Christian Urban <urbanc@in.tum.de>
parents: 390
diff changeset
   712
  \end{exercise}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   713
\<close>
49
a0edabf14457 added more material
Christian Urban <urbanc@in.tum.de>
parents: 48
diff changeset
   714
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   715
section \<open>Parsers for ML-Code (TBD)\<close>
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   716
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   717
text \<open>
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   718
  @{ML_ind ML_source in Parse}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   719
\<close>
230
8def50824320 added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents: 229
diff changeset
   720
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   721
section \<open>Context Parser (TBD)\<close>
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
   722
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   723
text \<open>
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   724
  @{ML_ind Args.context}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   725
\<close>
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   726
(*
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   727
ML {*
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   728
let
553
c53d74b34123 updated to changes in Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 546
diff changeset
   729
   val parser = Args.context -- Scan.lift Args.name_inner_syntax
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   730
   
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   731
  fun term_pat (ctxt, str) =
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   732
      str |> Syntax.read_prop ctxt
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   733
in
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   734
  (parser >> term_pat) (Context.Proof @{context}, filtered_input "f (a::nat)")
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   735
  |> fst
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   736
end
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   737
*}
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   738
*)
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   739
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   740
text \<open>
326
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   741
  @{ML_ind Args.context}
f76135c6c527 more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents: 324
diff changeset
   742
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
   743
  Used for example in \isacommand{attribute\_setup} and \isacommand{method\_setup}.
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   744
\<close>
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
   745
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   746
section \<open>Argument and Attribute Parsers (TBD)\<close>
207
d3cd633e8240 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 194
diff changeset
   747
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   748
section \<open>Parsing Inner Syntax\<close>
42
cd612b489504 tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents: 41
diff changeset
   749
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   750
text \<open>
125
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   751
  There is usually no need to write your own parser for parsing inner syntax, that is 
285
abe5306cacbe spell checker
griff
parents: 284
diff changeset
   752
  for terms and  types: you can just call the predefined parsers. Terms can 
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   753
  be parsed using the function @{ML_ind term in Parse}. For example:
125
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   754
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   755
@{ML_response [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   756
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   757
  val input = Token.explode (Thy_Header.get_keywords' @{context}) Position.none "foo"
44
dee4b3e66dfe added a readme chapter for prospective authors; added commands for referring to the Isar Reference Manual
Christian Urban <urbanc@in.tum.de>
parents: 43
diff changeset
   758
in 
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   759
  Parse.term input
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   760
end\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   761
\<open>("<markup>", [])\<close>}
553
c53d74b34123 updated to changes in Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 546
diff changeset
   762
125
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   763
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   764
  The function @{ML_ind prop in Parse} is similar, except that it gives a different
127
74846cb0fff9 updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents: 126
diff changeset
   765
  error message, when parsing fails. As you can see, the parser not just returns 
553
c53d74b34123 updated to changes in Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 546
diff changeset
   766
  the parsed string, but also some markup information. You can decode the
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   767
  information with the function @{ML_ind parse in YXML} in @{ML_structure YXML}. 
149
253ea99c1441 polished
Christian Urban <urbanc@in.tum.de>
parents: 133
diff changeset
   768
  The result of the decoding is an XML-tree. You can see better what is going on if
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   769
  you replace @{ML Position.none} by @{ML \<open>Position.line 42\<close>}, say:
101
Christian Urban <urbanc@in.tum.de>
parents: 86
diff changeset
   770
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   771
@{ML_response [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   772
\<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   773
  val input = Token.explode (Thy_Header.get_keywords' @{context}) (Position.line 42) "foo"
125
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   774
in 
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   775
  YXML.parse (fst (Parse.term input))
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   776
end\<close>
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   777
\<open><input delimited="false" line="42" offset="1" end_offset="4">foo</input>\<close>}
445
2f39df9ceb63 updated to new isabelle
Christian Urban <urbanc@in.tum.de>
parents: 426
diff changeset
   778
149
253ea99c1441 polished
Christian Urban <urbanc@in.tum.de>
parents: 133
diff changeset
   779
  The positional information is stored as part of an XML-tree so that code 
253ea99c1441 polished
Christian Urban <urbanc@in.tum.de>
parents: 133
diff changeset
   780
  called later on will be able to give more precise error messages. 
125
748d9c1a32fb polished parser section
Christian Urban <urbanc@in.tum.de>
parents: 124
diff changeset
   781
127
74846cb0fff9 updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents: 126
diff changeset
   782
  \begin{readmore}
128
693711a0c702 polished
Christian Urban <urbanc@in.tum.de>
parents: 127
diff changeset
   783
  The functions to do with input and output of XML and YXML are defined 
473
fea1b7ce5c4a this version works with Isabelle2011-1
Christian Urban <urbanc@in.tum.de>
parents: 472
diff changeset
   784
  in @{ML_file "Pure/PIDE/xml.ML"} and @{ML_file "Pure/PIDE/yxml.ML"}.
127
74846cb0fff9 updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents: 126
diff changeset
   785
  \end{readmore}
160
cc9359bfacf4 redefined the functions warning and tracing in order to properly match more antiquotations
Christian Urban <urbanc@in.tum.de>
parents: 156
diff changeset
   786
  
361
Christian Urban <urbanc@in.tum.de>
parents: 357
diff changeset
   787
  FIXME:
Christian Urban <urbanc@in.tum.de>
parents: 357
diff changeset
   788
  @{ML_ind parse_term in Syntax} @{ML_ind check_term in Syntax}
Christian Urban <urbanc@in.tum.de>
parents: 357
diff changeset
   789
  @{ML_ind parse_typ in Syntax} @{ML_ind check_typ in Syntax}
374
Christian Urban <urbanc@in.tum.de>
parents: 371
diff changeset
   790
  @{ML_ind read_term in Syntax} @{ML_ind read_term in Syntax}
Christian Urban <urbanc@in.tum.de>
parents: 371
diff changeset
   791
361
Christian Urban <urbanc@in.tum.de>
parents: 357
diff changeset
   792
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   793
\<close>
101
Christian Urban <urbanc@in.tum.de>
parents: 86
diff changeset
   794
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   795
section \<open>Parsing Specifications\label{sec:parsingspecs}\<close>
101
Christian Urban <urbanc@in.tum.de>
parents: 86
diff changeset
   796
544
501491d56798 updated to simplifier change
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 541
diff changeset
   797
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   798
text \<open>
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   799
  There are a number of special purpose parsers that help with parsing
156
e8f11280c762 polished
Christian Urban <urbanc@in.tum.de>
parents: 149
diff changeset
   800
  specifications of function definitions, inductive predicates and so on. In
220
fbcb89d84ba6 polishing
griff
parents: 211
diff changeset
   801
  Chapter~\ref{chp:package}, for example, we will need to parse specifications
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   802
  for inductive predicates of the form:
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   803
\<close>
101
Christian Urban <urbanc@in.tum.de>
parents: 86
diff changeset
   804
451
fc074e669f9f disabled foobar_prove; updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 449
diff changeset
   805
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   806
simple_inductive
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   807
  even and odd
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   808
where
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   809
  even0: "even 0"
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   810
| evenS: "odd n \<Longrightarrow> even (Suc n)"
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   811
| oddS: "even n \<Longrightarrow> odd (Suc n)"
101
Christian Urban <urbanc@in.tum.de>
parents: 86
diff changeset
   812
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   813
text \<open>
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   814
  For this we are going to use the parser:
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   815
\<close>
101
Christian Urban <urbanc@in.tum.de>
parents: 86
diff changeset
   816
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   817
ML %linenosgray\<open>val spec_parser = 
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   818
     Parse.vars -- 
126
fcc0e6e54dca polished
Christian Urban <urbanc@in.tum.de>
parents: 125
diff changeset
   819
     Scan.optional 
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   820
       (Parse.$$$ "where" |--
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   821
          Parse.!!! 
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   822
            (Parse.enum1 "|" 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   823
               (Parse_Spec.opt_thm_name ":" -- Parse.prop))) []\<close>
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 116
diff changeset
   824
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   825
text \<open>
241
29d4701c5ee1 polished
Christian Urban <urbanc@in.tum.de>
parents: 240
diff changeset
   826
  Note that the parser must not parse the keyword \simpleinductive, even if it is
126
fcc0e6e54dca polished
Christian Urban <urbanc@in.tum.de>
parents: 125
diff changeset
   827
  meant to process definitions as shown above. The parser of the keyword 
128
693711a0c702 polished
Christian Urban <urbanc@in.tum.de>
parents: 127
diff changeset
   828
  will be given by the infrastructure that will eventually call @{ML spec_parser}.
126
fcc0e6e54dca polished
Christian Urban <urbanc@in.tum.de>
parents: 125
diff changeset
   829
  
fcc0e6e54dca polished
Christian Urban <urbanc@in.tum.de>
parents: 125
diff changeset
   830
124
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 122
diff changeset
   831
  To see what the parser returns, let us parse the string corresponding to the 
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   832
  definition of @{term even} and @{term odd}:
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   833
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
   834
@{ML_matchresult [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   835
\<open>let
101
Christian Urban <urbanc@in.tum.de>
parents: 86
diff changeset
   836
  val input = filtered_input
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   837
     ("even and odd " ^  
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   838
      "where " ^
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   839
      "  even0[intro]: \"even 0\" " ^ 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   840
      "| evenS[intro]: \"odd n \<Longrightarrow> even (Suc n)\" " ^ 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   841
      "| oddS[intro]:  \"even n \<Longrightarrow> odd (Suc n)\"")
101
Christian Urban <urbanc@in.tum.de>
parents: 86
diff changeset
   842
in
120
c39f83d8daeb some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents: 116
diff changeset
   843
  parse spec_parser input
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   844
end\<close>
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   845
\<open>(([(even, NONE, NoSyn), (odd, NONE, NoSyn)],
566
6103b0eadbf2 tuned parser for patterns in ML_response... antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 565
diff changeset
   846
   [((even0,_),_),
6103b0eadbf2 tuned parser for patterns in ML_response... antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 565
diff changeset
   847
    ((evenS,_),_),
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   848
    ((oddS,_),_)]), [])\<close>}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   849
\<close>
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   850
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   851
text \<open>
186
371e4375c994 made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents: 183
diff changeset
   852
  As you see, the result is a pair consisting of a list of
371e4375c994 made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents: 183
diff changeset
   853
  variables with optional type-annotation and syntax-annotation, and a list of
371e4375c994 made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents: 183
diff changeset
   854
  rules where every rule has optionally a name and an attribute.
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   855
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   856
  The function @{ML_ind "vars" in Parse} in Line 2 of the parser reads an 
186
371e4375c994 made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents: 183
diff changeset
   857
  \isacommand{and}-separated 
124
0b9fa606a746 added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents: 122
diff changeset
   858
  list of variables that can include optional type annotations and syntax translations. 
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   859
  For example:\footnote{Note that in the code we need to write 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   860
  \<open>"int \<Rightarrow> bool"\<close> in order to properly escape the double quotes
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   861
  in the compound type.}
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   862
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   863
@{ML_response [display,gray]
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   864
\<open>let
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   865
  val input = filtered_input 
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   866
        "foo::\"int \<Rightarrow> bool\" and bar::nat (\"BAR\" 100) and blonk"
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   867
in
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   868
  parse Parse.vars input
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   869
end\<close>
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   870
\<open>([("foo", SOME \<dots>, NoSyn), 
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   871
  ("bar", SOME \<dots>, Mixfix (Source {\<dots>text = "BAR"}, [], 100, \<dots>)), 
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   872
  ("blonk", NONE, NoSyn)], [])\<close>}  
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   873
\<close>
50
Christian Urban <urbanc@in.tum.de>
parents: 49
diff changeset
   874
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   875
text \<open>
156
e8f11280c762 polished
Christian Urban <urbanc@in.tum.de>
parents: 149
diff changeset
   876
  Whenever types are given, they are stored in the @{ML SOME}s. The types are
e8f11280c762 polished
Christian Urban <urbanc@in.tum.de>
parents: 149
diff changeset
   877
  not yet used to type the variables: this must be done by type-inference later
149
253ea99c1441 polished
Christian Urban <urbanc@in.tum.de>
parents: 133
diff changeset
   878
  on. Since types are part of the inner syntax they are strings with some
241
29d4701c5ee1 polished
Christian Urban <urbanc@in.tum.de>
parents: 240
diff changeset
   879
  encoded information (see previous section). If a mixfix-syntax is
369
74ba778b09c9 tuned index
Christian Urban <urbanc@in.tum.de>
parents: 366
diff changeset
   880
  present for a variable, then it is stored in the 
371
e6f583366779 solved problem with mixfix.
Christian Urban <urbanc@in.tum.de>
parents: 369
diff changeset
   881
  @{ML Mixfix} data structure; no syntax translation is indicated by @{ML_ind NoSyn in Syntax}.
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   882
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   883
  \begin{readmore}
371
e6f583366779 solved problem with mixfix.
Christian Urban <urbanc@in.tum.de>
parents: 369
diff changeset
   884
  The data structure for mixfix annotations are implemented in 
e6f583366779 solved problem with mixfix.
Christian Urban <urbanc@in.tum.de>
parents: 369
diff changeset
   885
  @{ML_file "Pure/Syntax/mixfix.ML"} and @{ML_file "Pure/Syntax/syntax.ML"}.
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   886
  \end{readmore}
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   887
186
371e4375c994 made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents: 183
diff changeset
   888
  Lines 3 to 7 in the function @{ML spec_parser} implement the parser for a
219
98d43270024f more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents: 218
diff changeset
   889
  list of introduction rules, that is propositions with theorem annotations
98d43270024f more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents: 218
diff changeset
   890
  such as rule names and attributes. The introduction rules are propositions
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   891
  parsed by @{ML_ind prop in Parse}. However, they can include an optional
219
98d43270024f more work on the simple inductive chapter
Christian Urban <urbanc@in.tum.de>
parents: 218
diff changeset
   892
  theorem name plus some attributes. For example
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   893
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   894
@{ML_matchresult [display,gray] \<open>let 
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   895
  val input = filtered_input "foo_lemma[intro,dest!]:"
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   896
  val ((name, attrib), _) = parse (Parse_Spec.thm_name ":") input 
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   897
in 
558
84aef87b348a updated to recent isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 556
diff changeset
   898
  (name, map Token.name_of_src attrib)
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
   899
end\<close> \<open>(foo_lemma, [("intro", _), ("dest", _)])\<close>}
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   900
 
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   901
  The function @{ML_ind opt_thm_name in Parse_Spec} is the ``optional'' variant of
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   902
  @{ML_ind thm_name in Parse_Spec}. Theorem names can contain attributes. The name 
131
8db9195bb3e9 polished
Christian Urban <urbanc@in.tum.de>
parents: 128
diff changeset
   903
  has to end with @{text [quotes] ":"}---see the argument of 
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   904
  the function @{ML Parse_Spec.opt_thm_name} in Line 7.
121
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   905
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   906
  \begin{readmore}
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   907
  Attributes and arguments are implemented in the files @{ML_file "Pure/Isar/attrib.ML"} 
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   908
  and @{ML_file "Pure/Isar/args.ML"}.
26e5b41faa74 polishing
Christian Urban <urbanc@in.tum.de>
parents: 120
diff changeset
   909
  \end{readmore}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   910
\<close>
65
c8e9a4f97916 tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents: 60
diff changeset
   911
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   912
text_raw \<open>
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
   913
  \begin{exercise}
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   914
  Have a look at how the parser @{ML Parse_Spec.where_multi_specs} is implemented
424
5e0a2b50707e updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 422
diff changeset
   915
  in file @{ML_file "Pure/Isar/parse_spec.ML"}. This parser corresponds
207
d3cd633e8240 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 194
diff changeset
   916
  to the ``where-part'' of the introduction rules given above. Below
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   917
  we paraphrase the code of @{ML_ind where_multi_specs in Parse_Spec} adapted to our
207
d3cd633e8240 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 194
diff changeset
   918
  purposes. 
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
   919
  \begin{isabelle}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   920
\<close>
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   921
ML %linenosgray\<open>val spec_parser' = 
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   922
     Parse.vars -- 
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
   923
     Scan.optional
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   924
     (Parse.$$$ "where" |-- 
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   925
        Parse.!!! 
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   926
          (Parse.enum1 "|" 
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   927
             ((Parse_Spec.opt_thm_name ":" -- Parse.prop) --| 
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   928
                  Scan.option (Scan.ahead (Parse.name || 
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   929
                  Parse.$$$ "[") -- 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   930
                  Parse.!!! (Parse.$$$ "|"))))) []\<close>
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   931
text_raw \<open>
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
   932
  \end{isabelle}
284
ee139d9d7ab8 comment
griff
parents: 261
diff changeset
   933
  Both parsers accept the same input% that's not true:
ee139d9d7ab8 comment
griff
parents: 261
diff changeset
   934
  % spec_parser accepts input that is refuted by spec_parser'
ee139d9d7ab8 comment
griff
parents: 261
diff changeset
   935
  , but if you look closely, you can notice 
207
d3cd633e8240 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 194
diff changeset
   936
  an additional  ``tail'' (Lines 8 to 10) in @{ML spec_parser'}. What is the purpose of 
d3cd633e8240 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 194
diff changeset
   937
  this additional ``tail''?
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
   938
  \end{exercise}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   939
\<close>
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
   940
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   941
text \<open>
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
   942
  (FIXME: @{ML Parse.type_args}, @{ML Parse.typ}, @{ML Parse.opt_mixfix})
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   943
\<close>
229
abc7f90188af permutation example uses now recent infrastructure
Christian Urban <urbanc@in.tum.de>
parents: 228
diff changeset
   944
abc7f90188af permutation example uses now recent infrastructure
Christian Urban <urbanc@in.tum.de>
parents: 228
diff changeset
   945
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   946
section \<open>New Commands\label{sec:newcommand}\<close>
65
c8e9a4f97916 tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents: 60
diff changeset
   947
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   948
text \<open>
68
e7519207c2b7 added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents: 67
diff changeset
   949
  Often new commands, for example for providing new definitional principles,
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   950
  need to be implemented. 
65
c8e9a4f97916 tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents: 60
diff changeset
   951
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   952
  Let us start with a ``silly'' command that does nothing at all. We
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   953
  shall name this command \isacommand{foobar}.  Before you can
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   954
  implement any new command, you have to ``announce'' it in the
523
0753bc271fd5 proofread section 5.8 + spell-checked Parsing.thy
Christian Sternagel
parents: 522
diff changeset
   955
  \isacommand{keywords}-section of your theory header. For \isacommand{foobar}
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   956
  we need to write something like
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
   957
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
   958
  \begin{graybox}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   959
  \isacommand{theory}~\<open>Foo\<close>\\
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   960
  \isacommand{imports}~\<open>Main\<close>\\
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   961
  \isacommand{keywords} @{text [quotes] "foobar"} \<open>::\<close> \<open>thy_decl\<close>\\
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
   962
  ...
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
   963
  \end{graybox}
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
   964
559
ffa5c4ec9611 improvements by Piotr Trojanek
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 558
diff changeset
   965
  where @{ML_ind "thy_decl" in Keyword} indicates the kind of the
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   966
  command.  Another possible kind is \<open>thy_goal\<close>, or you can
523
0753bc271fd5 proofread section 5.8 + spell-checked Parsing.thy
Christian Sternagel
parents: 522
diff changeset
   967
  also omit the kind entirely, in which case you declare a keyword
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   968
  (something that is part of a command).
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   969
521
9728b0432fb2 polished
Christian Urban <urbanc@in.tum.de>
parents: 520
diff changeset
   970
  Now you can implement \isacommand{foobar} as follows.
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   971
\<close>
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
   972
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   973
ML %grayML\<open>let
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   974
  val do_nothing = Scan.succeed (Local_Theory.background_theory I)
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   975
in
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
   976
  Outer_Syntax.local_theory @{command_keyword "foobar"} 
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   977
    "description of foobar" 
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   978
      do_nothing
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   979
end\<close>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   980
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   981
text \<open>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   982
  The crucial function @{ML_ind local_theory in Outer_Syntax} expects
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   983
  the name for the command, a kind indicator, a short description and 
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   984
  a parser producing a local theory transition (explained later). For the
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   985
  name and the kind, you can use the ML-antiquotation \<open>@{command_spec ...}\<close>.
522
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
   986
  You can now write in your theory 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   987
\<close>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   988
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
   989
foobar
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
   990
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
   991
text \<open>
522
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
   992
  but of course you will not see anything since \isacommand{foobar} is
572
438703674711 prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 569
diff changeset
   993
  not intended to do anything.
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   994
522
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
   995
  As it stands, the command \isacommand{foobar} is not very useful. Let
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
   996
  us refine it a bit next by letting it take a proposition as argument
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
   997
  and printing this proposition inside the tracing buffer. We announce
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
   998
  the command \isacommand{foobar\_trace} in the theory header as
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
   999
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1000
  \begin{graybox}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1001
  \isacommand{keywords} @{text [quotes] "foobar_trace"} \<open>::\<close> \<open>thy_decl\<close>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1002
  \end{graybox}
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1003
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1004
  The crucial part of a command is the function that determines the
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1005
  behaviour of the command. In the code above we used a
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1006
  ``do-nothing''-function, which because of the parser @{ML_ind succeed in Scan}
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1007
  does not parse any argument, but immediately returns the simple
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
  1008
  function @{ML \<open>Local_Theory.background_theory I\<close>}. We can replace
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1009
  this code by a function that first parses a proposition (using the
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1010
  parser @{ML Parse.prop}), then prints out some tracing information
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1011
  (using the function \<open>trace_prop\<close>) and finally does
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1012
  nothing. For this you can write:
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1013
\<close>
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1014
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1015
ML %grayML\<open>let
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1016
  fun trace_prop str = 
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1017
    Local_Theory.background_theory (fn ctxt => (tracing str; ctxt))
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1018
in
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
  1019
  Outer_Syntax.local_theory @{command_keyword "foobar_trace"} 
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1020
    "traces a proposition" 
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1021
      (Parse.prop >> trace_prop)
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1022
end\<close>
65
c8e9a4f97916 tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents: 60
diff changeset
  1023
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1024
text \<open>
521
9728b0432fb2 polished
Christian Urban <urbanc@in.tum.de>
parents: 520
diff changeset
  1025
  This command can now be used to 
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1026
  see the proposition in the tracing buffer.
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1027
\<close>
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1028
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1029
foobar_trace "True \<and> False"
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1030
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1031
text \<open>
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1032
  Note that so far we used @{ML_ind thy_decl in Keyword} as the kind
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1033
  indicator for the new command.  This means that the command finishes as soon as
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1034
  the arguments are processed. Examples of this kind of commands are
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1035
  \isacommand{definition} and \isacommand{declare}.  In other cases, commands
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1036
  are expected to parse some arguments, for example a proposition, and then
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1037
  ``open up'' a proof in order to prove the proposition (for example
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1038
  \isacommand{lemma}) or prove some other properties (for example
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1039
  \isacommand{function}). To achieve this kind of behaviour, you have to use
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
  1040
  the kind indicator @{ML_ind thy_goal in Keyword} and the function @{ML \<open>local_theory_to_proof\<close> in Outer_Syntax} to set up the command. 
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1041
  Below we show the command \isacommand{foobar\_goal} which takes a
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1042
  proposition as argument and then starts a proof in order to prove
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1043
  it. Therefore, we need to announce this command in the header 
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1044
  as \<open>thy_goal\<close>.
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1045
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1046
  \begin{graybox}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1047
  \isacommand{keywords} @{text [quotes] "foobar_goal"} \<open>::\<close> \<open>thy_goal\<close>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1048
  \end{graybox}
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1049
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1050
  Then we can write:
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1051
\<close>
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1052
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1053
ML%linenosgray\<open>let
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1054
  fun goal_prop str ctxt =
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1055
    let
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1056
      val prop = Syntax.read_prop ctxt str
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1057
    in
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1058
      Proof.theorem NONE (K I) [[(prop, [])]] ctxt
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1059
    end
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1060
in
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
  1061
  Outer_Syntax.local_theory_to_proof @{command_keyword "foobar_goal"}
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1062
    "proves a proposition" 
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1063
      (Parse.prop >> goal_prop)
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1064
end\<close>
65
c8e9a4f97916 tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents: 60
diff changeset
  1065
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1066
text \<open>
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1067
  The function \<open>goal_prop\<close> in Lines 2 to 7 takes a string (the proposition to be
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1068
  proved) and a context as argument.  The context is necessary in order to be able to use
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1069
  @{ML_ind read_prop in Syntax}, which converts a string into a proper proposition.
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1070
  In Line 6 the function @{ML_ind theorem in Proof} starts the proof for the
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1071
  proposition. Its argument @{ML NONE} stands for a locale (which we chose to
569
f875a25aa72d prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents: 567
diff changeset
  1072
  omit); the argument @{ML \<open>(K I)\<close>} stands for a function that determines what
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1073
  should be done with the theorem once it is proved (we chose to just forget
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1074
  about it). 
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1075
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1076
  If you now type \isacommand{foobar\_goal}~@{text [quotes] "True \<and> True"},
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1077
  you obtain the following proof state:
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1078
\<close>
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1079
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1080
foobar_goal "True \<and> True"
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1081
txt \<open>
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1082
  \begin{minipage}{\textwidth}
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1083
  @{subgoals [display]}
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1084
  \end{minipage}\medskip
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1085
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1086
  and can prove the proposition as follows.
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1087
\<close>
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1088
apply(rule conjI)
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1089
apply(rule TrueI)+
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1090
done
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1091
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1092
text \<open>
521
9728b0432fb2 polished
Christian Urban <urbanc@in.tum.de>
parents: 520
diff changeset
  1093
  The last command we describe here is
522
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1094
  \isacommand{foobar\_proof}. Like \isacommand{foobar\_goal}, its purpose is
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1095
  to take a proposition and open a corresponding proof-state that
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1096
  allows us to give a proof for it. However, unlike
522
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1097
  \isacommand{foobar\_goal}, the proposition will be given as a
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1098
  ML-value. Such a command is quite useful during development
521
9728b0432fb2 polished
Christian Urban <urbanc@in.tum.de>
parents: 520
diff changeset
  1099
  when you generate a goal on the ML-level and want to see
522
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1100
  whether it is provable. In addition we want to allow the proved 
521
9728b0432fb2 polished
Christian Urban <urbanc@in.tum.de>
parents: 520
diff changeset
  1101
  proposition to have a name that can be referenced later on.
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1102
522
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1103
  The first problem for \isacommand{foobar\_proof} is to parse some
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1104
  text as ML-source and then interpret it as an Isabelle term using
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1105
  the ML-runtime.  For the parsing part, we can use the function
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
  1106
  @{ML_ind "ML_source" in Parse} in the structure @{ML_structure
522
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1107
  Parse}. For running the ML-interpreter we need the following
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1108
  scaffolding code.
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1109
\<close>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1110
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1111
ML %grayML\<open>
529
13d7ea419c5f moved the introspection part into the theorem section
Christian Urban <urbanc@in.tum.de>
parents: 523
diff changeset
  1112
structure Result = Proof_Data 
13d7ea419c5f moved the introspection part into the theorem section
Christian Urban <urbanc@in.tum.de>
parents: 523
diff changeset
  1113
  (type T = unit -> term
13d7ea419c5f moved the introspection part into the theorem section
Christian Urban <urbanc@in.tum.de>
parents: 523
diff changeset
  1114
   fun init thy () = error "Result")
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1115
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1116
val result_cookie = (Result.get, Result.put, "Result.put")\<close>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1117
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1118
text \<open>
522
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1119
  With this in place, we can implement the code for \isacommand{foobar\_prove} 
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1120
  as follows.
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1121
\<close>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1122
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1123
ML %linenosgray\<open>let
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1124
   fun after_qed thm_name thms lthy =
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1125
        Local_Theory.note (thm_name, (flat thms)) lthy |> snd
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1126
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
  1127
   fun setup_proof (thm_name, src) lthy =
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1128
     let
573
321e220a6baa accomodate to upcoming Isabelle 2019
Norbert Schirmer <norbert.schirmer@web.de>
parents: 572
diff changeset
  1129
       val (text, _) = Input.source_content src
553
c53d74b34123 updated to changes in Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 546
diff changeset
  1130
       val trm = Code_Runtime.value lthy result_cookie ("", text)
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1131
     in
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1132
       Proof.theorem NONE (after_qed thm_name) [[(trm, [])]] lthy
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1133
     end
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1134
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1135
   val parser = Parse_Spec.opt_thm_name ":" -- Parse.ML_source
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1136
in
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
  1137
   Outer_Syntax.local_theory_to_proof @{command_keyword "foobar_prove"}
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1138
     "proving a proposition" 
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1139
       (parser >> setup_proof)
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1140
end\<close>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1141
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1142
text \<open>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1143
  In Line 12, we implement a parser that first reads in an optional lemma name (terminated 
521
9728b0432fb2 polished
Christian Urban <urbanc@in.tum.de>
parents: 520
diff changeset
  1144
  by ``:'') and then some ML-code. The function in Lines 5 to 10 takes the ML-text
9728b0432fb2 polished
Christian Urban <urbanc@in.tum.de>
parents: 520
diff changeset
  1145
  and lets the ML-runtime evaluate it using the function @{ML_ind value in Code_Runtime}
567
f7c97e64cc2a tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents: 566
diff changeset
  1146
  in the structure @{ML_structure Code_Runtime}.  Once the ML-text has been turned into a term, 
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1147
  the function @{ML theorem in Proof} opens a corresponding proof-state. This function takes the
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1148
  function \<open>after_qed\<close> as argument, whose purpose is to store the theorem
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1149
  (once it is proven) under the given name \<open>thm_name\<close>.
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1150
521
9728b0432fb2 polished
Christian Urban <urbanc@in.tum.de>
parents: 520
diff changeset
  1151
  You can now define a term, for example
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1152
\<close>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1153
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1154
ML %grayML\<open>val prop_true = @{prop "True"}\<close>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1155
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1156
text \<open>
521
9728b0432fb2 polished
Christian Urban <urbanc@in.tum.de>
parents: 520
diff changeset
  1157
  and give it a proof using \isacommand{foobar\_prove}:
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1158
\<close>
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1159
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1160
foobar_prove test: prop_true
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1161
apply(rule TrueI)
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1162
done
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1163
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1164
text \<open>
522
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1165
  Finally you can test whether the lemma has been stored under the given name.
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1166
  
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1167
  \begin{isabelle}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1168
  \isacommand{thm}~\<open>test\<close>\\
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1169
  \<open>> \<close>~@{thm TrueI}
520
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1170
  \end{isabelle}
615762b8d8cb improved new_command section
Christian Urban <urbanc@in.tum.de>
parents: 519
diff changeset
  1171
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1172
\<close>
519
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1173
cf471fa86091 updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents: 517
diff changeset
  1174
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
  1175
(*
321
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
  1176
text {*
327
ce754ad78bc9 more work on the storing section
Christian Urban <urbanc@in.tum.de>
parents: 326
diff changeset
  1177
  {\bf TBD below}
74
Christian Urban <urbanc@in.tum.de>
parents: 72
diff changeset
  1178
522
0ed6f49277c4 updated
Christian Urban <urbanc@in.tum.de>
parents: 521
diff changeset
  1179
 *}
65
c8e9a4f97916 tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents: 60
diff changeset
  1180
563
50d3059de9c6 accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 559
diff changeset
  1181
*)
324
4172c0743cf2 updated foobar_proof example
Christian Urban <urbanc@in.tum.de>
parents: 322
diff changeset
  1182
321
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
  1183
e450fa467e3f polished the commands section
Christian Urban <urbanc@in.tum.de>
parents: 319
diff changeset
  1184
322
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1185
(*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1186
ML {*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1187
structure TacticData = ProofDataFun
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1188
(
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1189
  type T = thm list -> tactic;
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1190
  fun init _ = undefined;
366
haftmann
parents: 361
diff changeset
  1191
)
322
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1192
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1193
val set_tactic = TacticData.put;
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1194
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1195
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1196
ML {*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1197
  TacticData.get @{context}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1198
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1199
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1200
ML {* Method.set_tactic  *}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1201
ML {* fun tactic (facts: thm list) : tactic = (atac 1) *}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1202
ML {* Context.map_proof *}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1203
ML {* ML_Context.expression *}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1204
ML {* METHOD *}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1205
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1206
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1207
ML {* 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1208
fun myexpression pos bind body txt =
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1209
let
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1210
  val _ = tracing ("bind)" ^ bind)
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1211
  val _ = tracing ("body)" ^ body)
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1212
  val _ = tracing ("txt)"  ^ txt)
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1213
  val _ = tracing ("result) " ^ "Context.set_thread_data (SOME (let " ^ bind ^ " = " ^ txt ^ " in " ^ body ^
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1214
      " end (ML_Context.the_generic_context ())));")
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1215
in
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1216
  ML_Context.exec (fn () => ML_Context.eval false pos
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1217
    ("Context.set_thread_data (SOME (let " ^ bind ^ " = " ^ txt ^ " in " ^ body ^
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1218
      " end (ML_Context.the_generic_context ())));"))
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1219
end
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1220
*}
319
6bce4acf7f2a added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents: 316
diff changeset
  1221
6bce4acf7f2a added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents: 316
diff changeset
  1222
322
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1223
ML {*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1224
fun ml_tactic (txt, pos) ctxt =
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1225
let
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1226
  val ctxt' = ctxt |> Context.proof_map
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1227
      (myexpression pos
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1228
        "fun tactic (facts: thm list) : tactic"
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1229
        "Context.map_proof (Method.set_tactic tactic)" txt);
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1230
in 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1231
  Context.setmp_thread_data (SOME (Context.Proof ctxt)) (TacticData.get ctxt')
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1232
end;
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1233
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1234
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1235
ML {*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1236
fun tactic3 (txt, pos) ctxt = 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1237
  let
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1238
    val _ = tracing ("1) " ^ txt )
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1239
  in 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1240
   METHOD (ml_tactic (txt, pos) ctxt; K (atac 1))
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1241
  end
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1242
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1243
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1244
setup {*
426
d94755882e36 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 424
diff changeset
  1245
Method.setup (Binding.name "tactic3") (Scan.lift (Parse.position Args.name) 
322
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1246
  >> tactic3)
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1247
    "ML tactic as proof method"
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1248
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1249
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1250
lemma "A \<Longrightarrow> A"
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1251
apply(tactic3 {* (atac 1)  *})
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1252
done
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1253
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1254
ML {* 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1255
(ML_Context.the_generic_context ())
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1256
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1257
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1258
ML {*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1259
Context.set_thread_data;
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1260
ML_Context.the_generic_context
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1261
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1262
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1263
lemma "A \<Longrightarrow> A"
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1264
ML_prf {*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1265
Context.set_thread_data (SOME (let fun tactic (facts: thm list) : tactic =  (atac 1)   in Context.map_proof (Method.set_tactic tactic) end (ML_Context.the_generic_context ())));
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1266
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1267
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1268
ML {*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1269
Context.set_thread_data (SOME ((let fun tactic (facts: thm list) : tactic =  (atac 1)   in 3 end) (ML_Context.the_generic_context ())));
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1270
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1271
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1272
ML {*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1273
Context.set_thread_data (SOME (let 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1274
  fun tactic (facts: thm list) : tactic =  (atac 1) 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1275
in 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1276
  Context.map_proof (Method.set_tactic tactic) 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1277
end 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1278
  (ML_Context.the_generic_context ())));
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1279
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1280
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1281
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1282
ML {*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1283
let 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1284
  fun tactic (facts: thm list) : tactic = atac
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1285
in
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1286
  Context.map_proof (Method.set_tactic tactic)
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1287
end *}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1288
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1289
end *}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1290
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1291
ML {* Toplevel.program (fn () => 
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1292
(ML_Context.expression Position.none "val plus : int" "3 + 4" "1" (Context.Proof @{context})))*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1293
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1294
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1295
ML {*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1296
fun ml_tactic (txt, pos) ctxt =
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1297
  let
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1298
    val ctxt' = ctxt |> Context.proof_map
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1299
      (ML_Context.expression pos
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1300
        "fun tactic (facts: thm list) : tactic"
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1301
        "Context.map_proof (Method.set_tactic tactic)" txt);
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1302
  in Context.setmp_thread_data (SOME (Context.Proof ctxt)) (TacticData.get ctxt') end;
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1303
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1304
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1305
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1306
ML {*
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1307
Context.set_thread_data (SOME (let fun tactic (facts: thm list) : tactic =  (atac 1)   in Context.map_proof (Method.set_tactic tactic) end (ML_Context.the_generic_context ())));
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1308
*}
2b7c08d90e2e included some tests
Christian Urban <urbanc@in.tum.de>
parents: 321
diff changeset
  1309
*)
319
6bce4acf7f2a added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents: 316
diff changeset
  1310
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1311
section \<open>Methods (TBD)\<close>
178
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1312
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1313
text \<open>
207
d3cd633e8240 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 194
diff changeset
  1314
  (FIXME: maybe move to after the tactic section)
d3cd633e8240 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 194
diff changeset
  1315
559
ffa5c4ec9611 improvements by Piotr Trojanek
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents: 558
diff changeset
  1316
  Methods are central to Isabelle. You use them, for example,
186
371e4375c994 made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents: 183
diff changeset
  1317
  in \isacommand{apply}. To print out all currently known methods you can use the 
192
2fff636e1fa0 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 189
diff changeset
  1318
  Isabelle command:
178
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1319
207
d3cd633e8240 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 194
diff changeset
  1320
  \begin{isabelle}
d3cd633e8240 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 194
diff changeset
  1321
  \isacommand{print\_methods}\\
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1322
  \<open>> methods:\<close>\\
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1323
  \<open>>   -:  do nothing (insert current facts only)\<close>\\
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1324
  \<open>>   HOL.default:  apply some intro/elim rule (potentially classical)\<close>\\
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1325
  \<open>>   ...\<close>
207
d3cd633e8240 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 194
diff changeset
  1326
  \end{isabelle}
178
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1327
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
  1328
  An example of a very simple method is:
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1329
\<close>
178
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1330
244
dc95a56b1953 fixed the problem with double definition of even and odd
Christian Urban <urbanc@in.tum.de>
parents: 241
diff changeset
  1331
method_setup %gray foo = 
574
034150db9d91 polish document
Norbert Schirmer <norbert.schirmer@web.de>
parents: 573
diff changeset
  1332
 \<open>Scan.succeed (fn ctxt => 
034150db9d91 polish document
Norbert Schirmer <norbert.schirmer@web.de>
parents: 573
diff changeset
  1333
   (SIMPLE_METHOD ((eresolve_tac ctxt [@{thm conjE}] THEN' 
034150db9d91 polish document
Norbert Schirmer <norbert.schirmer@web.de>
parents: 573
diff changeset
  1334
                    resolve_tac ctxt [@{thm conjI}]) 1)))\<close>
034150db9d91 polish document
Norbert Schirmer <norbert.schirmer@web.de>
parents: 573
diff changeset
  1335
   "foo method for conjE and conjI"
178
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1336
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1337
text \<open>
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1338
  It defines the method \<open>foo\<close>, which takes no arguments (therefore the
207
d3cd633e8240 some polishing
Christian Urban <urbanc@in.tum.de>
parents: 194
diff changeset
  1339
  parser @{ML Scan.succeed}) and only applies a single tactic, namely the tactic which 
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 250
diff changeset
  1340
  applies @{thm [source] conjE} and then @{thm [source] conjI}. The function 
344
83d5bca38bec added structures in the index
Christian Urban <urbanc@in.tum.de>
parents: 328
diff changeset
  1341
  @{ML_ind SIMPLE_METHOD in Method}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1342
  turns such a tactic into a method. The method \<open>foo\<close> can be used as follows
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1343
\<close>
178
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1344
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1345
lemma shows "A \<and> B \<Longrightarrow> C \<and> D"
244
dc95a56b1953 fixed the problem with double definition of even and odd
Christian Urban <urbanc@in.tum.de>
parents: 241
diff changeset
  1346
apply(foo)
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1347
txt \<open>
178
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1348
  where it results in the goal state
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1349
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1350
  \begin{minipage}{\textwidth}
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1351
  @{subgoals}
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1352
  \end{minipage}\<close>
178
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1353
(*<*)oops(*>*)
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1354
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1355
method_setup test = \<open>
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1356
  Scan.lift (Scan.succeed (K Method.succeed))\<close> \<open>bla\<close>
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1357
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1358
lemma "True"
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1359
apply(test)
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1360
oops
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1361
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1362
method_setup joker = \<open>
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1363
  Scan.lift (Scan.succeed (fn ctxt => Method.cheating true))\<close> \<open>bla\<close>
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1364
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1365
lemma "False"
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1366
apply(joker)
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1367
oops
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1368
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1369
text \<open>if true is set then always works\<close>
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1370
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1371
ML \<open>assume_tac\<close> 
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1372
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1373
method_setup first_atac = \<open>Scan.lift (Scan.succeed (fn ctxt => (SIMPLE_METHOD (assume_tac ctxt 1))))\<close> \<open>bla\<close>
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1374
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1375
ML \<open>HEADGOAL\<close>
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1376
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1377
lemma "A \<Longrightarrow> A"
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1378
apply(first_atac)
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1379
oops
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1380
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1381
method_setup my_atac = \<open>Scan.lift (Scan.succeed (fn ctxt => (SIMPLE_METHOD' (assume_tac ctxt))))\<close> \<open>bla\<close>
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1382
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1383
lemma "A \<Longrightarrow> A"
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1384
apply(my_atac)
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1385
oops
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1386
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1387
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
  1388
319
6bce4acf7f2a added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents: 316
diff changeset
  1389
6bce4acf7f2a added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents: 316
diff changeset
  1390
6bce4acf7f2a added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents: 316
diff changeset
  1391
6bce4acf7f2a added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents: 316
diff changeset
  1392
193
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
  1393
(*
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
  1394
ML {* SIMPLE_METHOD *}
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
  1395
ML {* METHOD *}
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
  1396
ML {* K (SIMPLE_METHOD ((etac @{thm conjE} THEN' rtac @{thm conjI}) 1)) *}
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
  1397
ML {* Scan.succeed  *}
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
  1398
*)
ffd93dcc269d polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents: 192
diff changeset
  1399
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1400
ML \<open>resolve_tac\<close>
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1401
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1402
method_setup myrule =
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1403
  \<open>Scan.lift (Scan.succeed (fn ctxt => (METHOD (fn thms => resolve_tac ctxt thms 1))))\<close>
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1404
  \<open>bla\<close>
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1405
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1406
lemma
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1407
  assumes a: "A \<Longrightarrow> B \<Longrightarrow> C"
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1408
  shows "C"
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1409
using a
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1410
apply(myrule)
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1411
oops
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1412
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1413
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1414
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1415
text \<open>
421
620a24bf954a added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents: 414
diff changeset
  1416
  (********************************************************)
186
371e4375c994 made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents: 183
diff changeset
  1417
  (FIXME: explain a version of rule-tac)
565
cecd7a941885 isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents: 563
diff changeset
  1418
\<close>
178
fb8f22dd8ad0 adapted to latest Attrib.setup changes and more work on the simple induct chapter
Christian Urban <urbanc@in.tum.de>
parents: 177
diff changeset
  1419
220
fbcb89d84ba6 polishing
griff
parents: 211
diff changeset
  1420
end