author | Norbert Schirmer <norbert.schirmer@web.de> |
Tue, 21 May 2019 16:22:30 +0200 | |
changeset 573 | 321e220a6baa |
parent 572 | 438703674711 |
child 574 | 034150db9d91 |
permissions | -rw-r--r-- |
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 | 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 | 42 |
"Pure/General/scan.ML"}. The second part of the library consists of |
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 | 45 |
"Pure/Isar/parse.ML"}. In addition specific parsers for packages are |
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 | 90 |
However, note that these exceptions are private to the parser and cannot be accessed |
49 | 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 | 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 | 111 |
one item from the input list satisfying this predicate. For example the |
58 | 112 |
following parser either consumes an @{text [quotes] "h"} or a @{text |
49 | 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 | 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 | 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 | 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 | 196 |
in |
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 | 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 | 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 | 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 | 224 |
aborts the whole process of parsing in case of a failure and prints an error |
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 | 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 | 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 | 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 | 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 | 267 |
Running this parser with the arguments |
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 | 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 | 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 | 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 | 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 | 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 | 363 |
doubles the two parsed input strings; or |
59 | 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 | 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 | 369 |
in |
104 | 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 | 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 | 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 | 387 |
Be aware of recursive parsers. Suppose you want to read strings separated by |
388 |
commas and by parentheses into a tree datastructure; for example, generating |
|
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 | 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 | 405 |
$$ s >> Lf || $$ "(" |-- parse_tree s --| $$ ")" |
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 | 412 |
|
413 |
\begin{center} |
|
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 | 417 |
\end{tabular} |
418 |
\end{center} |
|
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 | 435 |
string as an explicit argument. So the parser above should be implemented |
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 | 440 |
($$ s >> Lf || $$ "(" |-- parse_tree s --| $$ ")") xs |
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 | 459 |
|
460 |
\begin{exercise}\label{ex:scancmts} |
|
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 | 465 |
nesting of comments. |
149 | 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 | 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 | 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 | 482 |
The reason for using token parsers is that theory syntax, as well as the |
128 | 483 |
parsers for the arguments of proof methods, use the type @{ML_type |
426 | 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 | 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 | 493 |
example @{ML_ind Ident in Token} for identifiers, @{ML Keyword in |
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 | 508 |
|
509 |
produces three tokens where the first and the last are identifiers, since |
|
58 | 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 | 530 |
|
241 | 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 | 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 | 539 |
in |
426 | 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 | 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 | 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 | 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 | 560 |
you obtain a list consisting of only one command and two keyword tokens. |
241 | 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 | 565 |
see the complete list. |
566 |
||
426 | 567 |
The parser @{ML_ind "$$$" in Parse} parses a single keyword. For example: |
50 | 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 | 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 | 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 | 617 |
``stopper-token'' @{ML Token.stopper}. We can write: |
49 | 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 | 623 |
in |
426 | 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 | 627 |
|
75 | 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 | 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 | 637 |
together with a relatively precise description of the failure. For example: |
49 | 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 | 643 |
in |
426 | 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 | 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 | 652 |
kind @{ML_ind Keyword in Token}. It can be parsed using |
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 | 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 | 658 |
Whenever there is a possibility that the processing of user input can fail, |
221 | 659 |
it is a good idea to give all available information about where the error |
220 | 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 | 667 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
668 |
text \<open> |
125 | 669 |
where we pretend the parsed string starts on line 7. An example is |
49 | 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> |
438703674711
prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
569
diff
changeset
|
673 |
\<open>[Token (("foo", ({line=7, offset=1, end_offset=4}, {line=7, offset=4})), (Ident, "foo"),\<dots>), |
438703674711
prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
569
diff
changeset
|
674 |
Token (("bar", ({line=8, offset=7, end_offset=10}, {line=8, offset=10})), (Ident, "bar"),\<dots>)]\<close>} |
125 | 675 |
|
676 |
in which the @{text [quotes] "\\n"} causes the second token to be in |
|
677 |
line 8. |
|
678 |
||
426 | 679 |
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
|
680 |
position and return it as part of the parser result. For example |
125 | 681 |
|
572
438703674711
prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
569
diff
changeset
|
682 |
@{ML_response [display,gray] |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
683 |
\<open>let |
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
684 |
val input = filtered_input' "where" |
125 | 685 |
in |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
686 |
parse (Parse.position (Parse.$$$ "where")) input |
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
687 |
end\<close> |
572
438703674711
prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
569
diff
changeset
|
688 |
\<open>(("where", {line=7, offset=1, end_offset=6}), [])\<close>} |
125 | 689 |
|
690 |
\begin{readmore} |
|
691 |
The functions related to positions are implemented in the file |
|
692 |
@{ML_file "Pure/General/position.ML"}. |
|
693 |
\end{readmore} |
|
49 | 694 |
|
391 | 695 |
\begin{exercise}\label{ex:contextfree} |
696 |
Write a parser for the context-free grammar representing arithmetic |
|
697 |
expressions with addition and multiplication. As usual, multiplication |
|
698 |
binds stronger than addition, and both of them nest to the right. |
|
699 |
The context-free grammar is defined as: |
|
700 |
||
701 |
\begin{center} |
|
702 |
\begin{tabular}{lcl} |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
703 |
\<open><Basic>\<close> & \<open>::=\<close> & \<open><Number> | (<Expr>)\<close>\\ |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
704 |
\<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
|
705 |
\<open><Expr>\<close> & \<open>::=\<close> & \<open><Factor> + <Expr> | <Factor>\<close>\\ |
391 | 706 |
\end{tabular} |
707 |
\end{center} |
|
708 |
||
709 |
Hint: Be careful with recursive parsers. |
|
710 |
\end{exercise} |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
711 |
\<close> |
49 | 712 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
713 |
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
|
714 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
715 |
text \<open> |
426 | 716 |
@{ML_ind ML_source in Parse} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
717 |
\<close> |
230
8def50824320
added material about OuterKeyword.keyword and OuterParse.reserved
Christian Urban <urbanc@in.tum.de>
parents:
229
diff
changeset
|
718 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
719 |
section \<open>Context Parser (TBD)\<close> |
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
720 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
721 |
text \<open> |
326
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
722 |
@{ML_ind Args.context} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
723 |
\<close> |
326
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
724 |
(* |
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
725 |
ML {* |
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
726 |
let |
553
c53d74b34123
updated to changes in Isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
546
diff
changeset
|
727 |
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
|
728 |
|
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
729 |
fun term_pat (ctxt, str) = |
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
730 |
str |> Syntax.read_prop ctxt |
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
731 |
in |
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
732 |
(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
|
733 |
|> fst |
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
734 |
end |
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
735 |
*} |
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
736 |
*) |
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
737 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
738 |
text \<open> |
326
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
739 |
@{ML_ind Args.context} |
f76135c6c527
more work on the tutorial
Christian Urban <urbanc@in.tum.de>
parents:
324
diff
changeset
|
740 |
|
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
741 |
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
|
742 |
\<close> |
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
743 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
744 |
section \<open>Argument and Attribute Parsers (TBD)\<close> |
207 | 745 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
746 |
section \<open>Parsing Inner Syntax\<close> |
42
cd612b489504
tuned mostly antiquotation and text
Christian Urban <urbanc@in.tum.de>
parents:
41
diff
changeset
|
747 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
748 |
text \<open> |
125 | 749 |
There is usually no need to write your own parser for parsing inner syntax, that is |
285 | 750 |
for terms and types: you can just call the predefined parsers. Terms can |
426 | 751 |
be parsed using the function @{ML_ind term in Parse}. For example: |
125 | 752 |
|
572
438703674711
prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
569
diff
changeset
|
753 |
@{ML_response [display,gray] |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
754 |
\<open>let |
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
755 |
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
|
756 |
in |
426 | 757 |
Parse.term input |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
758 |
end\<close> |
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
759 |
\<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
|
760 |
|
125 | 761 |
|
426 | 762 |
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
|
763 |
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
|
764 |
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
|
765 |
information with the function @{ML_ind parse in YXML} in @{ML_structure YXML}. |
149 | 766 |
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
|
767 |
you replace @{ML Position.none} by @{ML \<open>Position.line 42\<close>}, say: |
101 | 768 |
|
572
438703674711
prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
569
diff
changeset
|
769 |
@{ML_response [display,gray] |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
770 |
\<open>let |
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
771 |
val input = Token.explode (Thy_Header.get_keywords' @{context}) (Position.line 42) "foo" |
125 | 772 |
in |
426 | 773 |
YXML.parse (fst (Parse.term input)) |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
774 |
end\<close> |
572
438703674711
prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
569
diff
changeset
|
775 |
\<open><input delimited="false" line="42" offset="1" end_offset="4">foo</input>\<close>} |
445 | 776 |
|
149 | 777 |
The positional information is stored as part of an XML-tree so that code |
778 |
called later on will be able to give more precise error messages. |
|
125 | 779 |
|
127
74846cb0fff9
updated and added two tentative recipes
Christian Urban <urbanc@in.tum.de>
parents:
126
diff
changeset
|
780 |
\begin{readmore} |
128 | 781 |
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
|
782 |
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
|
783 |
\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
|
784 |
|
361 | 785 |
FIXME: |
786 |
@{ML_ind parse_term in Syntax} @{ML_ind check_term in Syntax} |
|
787 |
@{ML_ind parse_typ in Syntax} @{ML_ind check_typ in Syntax} |
|
374 | 788 |
@{ML_ind read_term in Syntax} @{ML_ind read_term in Syntax} |
789 |
||
361 | 790 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
791 |
\<close> |
101 | 792 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
793 |
section \<open>Parsing Specifications\label{sec:parsingspecs}\<close> |
101 | 794 |
|
544
501491d56798
updated to simplifier change
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
541
diff
changeset
|
795 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
796 |
text \<open> |
121 | 797 |
There are a number of special purpose parsers that help with parsing |
156 | 798 |
specifications of function definitions, inductive predicates and so on. In |
220 | 799 |
Chapter~\ref{chp:package}, for example, we will need to parse specifications |
121 | 800 |
for inductive predicates of the form: |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
801 |
\<close> |
101 | 802 |
|
451
fc074e669f9f
disabled foobar_prove; updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents:
449
diff
changeset
|
803 |
|
121 | 804 |
simple_inductive |
805 |
even and odd |
|
806 |
where |
|
807 |
even0: "even 0" |
|
808 |
| evenS: "odd n \<Longrightarrow> even (Suc n)" |
|
809 |
| oddS: "even n \<Longrightarrow> odd (Suc n)" |
|
101 | 810 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
811 |
text \<open> |
121 | 812 |
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
|
813 |
\<close> |
101 | 814 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
815 |
ML %linenosgray\<open>val spec_parser = |
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
816 |
Parse.vars -- |
126 | 817 |
Scan.optional |
426 | 818 |
(Parse.$$$ "where" |-- |
819 |
Parse.!!! |
|
820 |
(Parse.enum1 "|" |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
821 |
(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
|
822 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
823 |
text \<open> |
241 | 824 |
Note that the parser must not parse the keyword \simpleinductive, even if it is |
126 | 825 |
meant to process definitions as shown above. The parser of the keyword |
128 | 826 |
will be given by the infrastructure that will eventually call @{ML spec_parser}. |
126 | 827 |
|
828 |
||
124
0b9fa606a746
added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents:
122
diff
changeset
|
829 |
To see what the parser returns, let us parse the string corresponding to the |
121 | 830 |
definition of @{term even} and @{term odd}: |
831 |
||
567
f7c97e64cc2a
tuned ML-antiquotations; added intro portions.
Norbert Schirmer <norbert.schirmer@web.de>
parents:
566
diff
changeset
|
832 |
@{ML_matchresult [display,gray] |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
833 |
\<open>let |
101 | 834 |
val input = filtered_input |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
835 |
("even and odd " ^ |
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
836 |
"where " ^ |
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
837 |
" even0[intro]: \"even 0\" " ^ |
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
838 |
"| 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
|
839 |
"| oddS[intro]: \"even n \<Longrightarrow> odd (Suc n)\"") |
101 | 840 |
in |
120
c39f83d8daeb
some polishing; split up the file External Solver into two
Christian Urban <urbanc@in.tum.de>
parents:
116
diff
changeset
|
841 |
parse spec_parser input |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
842 |
end\<close> |
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
843 |
\<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
|
844 |
[((even0,_),_), |
6103b0eadbf2
tuned parser for patterns in ML_response... antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
565
diff
changeset
|
845 |
((evenS,_),_), |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
846 |
((oddS,_),_)]), [])\<close>} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
847 |
\<close> |
121 | 848 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
849 |
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
|
850 |
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
|
851 |
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
|
852 |
rules where every rule has optionally a name and an attribute. |
121 | 853 |
|
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
854 |
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
|
855 |
\isacommand{and}-separated |
124
0b9fa606a746
added to the first-steps section
Christian Urban <urbanc@in.tum.de>
parents:
122
diff
changeset
|
856 |
list of variables that can include optional type annotations and syntax translations. |
121 | 857 |
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
|
858 |
\<open>"int \<Rightarrow> bool"\<close> in order to properly escape the double quotes |
121 | 859 |
in the compound type.} |
860 |
||
572
438703674711
prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
569
diff
changeset
|
861 |
@{ML_response [display,gray] |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
862 |
\<open>let |
121 | 863 |
val input = filtered_input |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
864 |
"foo::\"int \<Rightarrow> bool\" and bar::nat (\"BAR\" 100) and blonk" |
121 | 865 |
in |
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
866 |
parse Parse.vars input |
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
867 |
end\<close> |
572
438703674711
prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
569
diff
changeset
|
868 |
\<open>([("foo", SOME \<dots>, NoSyn), |
438703674711
prefer more result checking in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
569
diff
changeset
|
869 |
("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
|
870 |
("blonk", NONE, NoSyn)], [])\<close>} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
871 |
\<close> |
50 | 872 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
873 |
text \<open> |
156 | 874 |
Whenever types are given, they are stored in the @{ML SOME}s. The types are |
875 |
not yet used to type the variables: this must be done by type-inference later |
|
149 | 876 |
on. Since types are part of the inner syntax they are strings with some |
241 | 877 |
encoded information (see previous section). If a mixfix-syntax is |
369 | 878 |
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
|
879 |
@{ML Mixfix} data structure; no syntax translation is indicated by @{ML_ind NoSyn in Syntax}. |
121 | 880 |
|
881 |
\begin{readmore} |
|
371
e6f583366779
solved problem with mixfix.
Christian Urban <urbanc@in.tum.de>
parents:
369
diff
changeset
|
882 |
The data structure for mixfix annotations are implemented in |
e6f583366779
solved problem with mixfix.
Christian Urban <urbanc@in.tum.de>
parents:
369
diff
changeset
|
883 |
@{ML_file "Pure/Syntax/mixfix.ML"} and @{ML_file "Pure/Syntax/syntax.ML"}. |
121 | 884 |
\end{readmore} |
885 |
||
186
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
886 |
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
|
887 |
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
|
888 |
such as rule names and attributes. The introduction rules are propositions |
426 | 889 |
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
|
890 |
theorem name plus some attributes. For example |
121 | 891 |
|
569
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
892 |
@{ML_matchresult [display,gray] \<open>let |
f875a25aa72d
prefer cartouches over " in ML antiquotations
Norbert Schirmer <norbert.schirmer@web.de>
parents:
567
diff
changeset
|
893 |
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
|
894 |
val ((name, attrib), _) = parse (Parse_Spec.thm_name ":") input |
121 | 895 |
in |
558
84aef87b348a
updated to recent isabelle
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
556
diff
changeset
|
896 |
(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
|
897 |
end\<close> \<open>(foo_lemma, [("intro", _), ("dest", _)])\<close>} |
121 | 898 |
|
426 | 899 |
The function @{ML_ind opt_thm_name in Parse_Spec} is the ``optional'' variant of |
900 |
@{ML_ind thm_name in Parse_Spec}. Theorem names can contain attributes. The name |
|
131 | 901 |
has to end with @{text [quotes] ":"}---see the argument of |
426 | 902 |
the function @{ML Parse_Spec.opt_thm_name} in Line 7. |
121 | 903 |
|
904 |
\begin{readmore} |
|
905 |
Attributes and arguments are implemented in the files @{ML_file "Pure/Isar/attrib.ML"} |
|
906 |
and @{ML_file "Pure/Isar/args.ML"}. |
|
907 |
\end{readmore} |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
908 |
\<close> |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
909 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
910 |
text_raw \<open> |
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
911 |
\begin{exercise} |
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
912 |
Have a look at how the parser @{ML Parse_Spec.where_multi_specs} is implemented |
424 | 913 |
in file @{ML_file "Pure/Isar/parse_spec.ML"}. This parser corresponds |
207 | 914 |
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
|
915 |
we paraphrase the code of @{ML_ind where_multi_specs in Parse_Spec} adapted to our |
207 | 916 |
purposes. |
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
917 |
\begin{isabelle} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
918 |
\<close> |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
919 |
ML %linenosgray\<open>val spec_parser' = |
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
920 |
Parse.vars -- |
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
921 |
Scan.optional |
426 | 922 |
(Parse.$$$ "where" |-- |
923 |
Parse.!!! |
|
924 |
(Parse.enum1 "|" |
|
925 |
((Parse_Spec.opt_thm_name ":" -- Parse.prop) --| |
|
926 |
Scan.option (Scan.ahead (Parse.name || |
|
927 |
Parse.$$$ "[") -- |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
928 |
Parse.!!! (Parse.$$$ "|"))))) []\<close> |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
929 |
text_raw \<open> |
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
930 |
\end{isabelle} |
284 | 931 |
Both parsers accept the same input% that's not true: |
932 |
% spec_parser accepts input that is refuted by spec_parser' |
|
933 |
, but if you look closely, you can notice |
|
207 | 934 |
an additional ``tail'' (Lines 8 to 10) in @{ML spec_parser'}. What is the purpose of |
935 |
this additional ``tail''? |
|
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
936 |
\end{exercise} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
937 |
\<close> |
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
938 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
939 |
text \<open> |
426 | 940 |
(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
|
941 |
\<close> |
229
abc7f90188af
permutation example uses now recent infrastructure
Christian Urban <urbanc@in.tum.de>
parents:
228
diff
changeset
|
942 |
|
abc7f90188af
permutation example uses now recent infrastructure
Christian Urban <urbanc@in.tum.de>
parents:
228
diff
changeset
|
943 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
944 |
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
|
945 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
946 |
text \<open> |
68
e7519207c2b7
added more to the "new command section" and tuning
Christian Urban <urbanc@in.tum.de>
parents:
67
diff
changeset
|
947 |
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
|
948 |
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
|
949 |
|
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
950 |
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
|
951 |
shall name this command \isacommand{foobar}. Before you can |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
952 |
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
|
953 |
\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
|
954 |
we need to write something like |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
955 |
|
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
956 |
\begin{graybox} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
957 |
\isacommand{theory}~\<open>Foo\<close>\\ |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
958 |
\isacommand{imports}~\<open>Main\<close>\\ |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
959 |
\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
|
960 |
... |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
961 |
\end{graybox} |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
962 |
|
559
ffa5c4ec9611
improvements by Piotr Trojanek
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
558
diff
changeset
|
963 |
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
|
964 |
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
|
965 |
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
|
966 |
(something that is part of a command). |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
967 |
|
521 | 968 |
Now you can implement \isacommand{foobar} as follows. |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
969 |
\<close> |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
970 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
971 |
ML %grayML\<open>let |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
972 |
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
|
973 |
in |
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
974 |
Outer_Syntax.local_theory @{command_keyword "foobar"} |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
975 |
"description of foobar" |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
976 |
do_nothing |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
977 |
end\<close> |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
978 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
979 |
text \<open> |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
980 |
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
|
981 |
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
|
982 |
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
|
983 |
name and the kind, you can use the ML-antiquotation \<open>@{command_spec ...}\<close>. |
522 | 984 |
You can now write in your theory |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
985 |
\<close> |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
986 |
|
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
987 |
foobar |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
988 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
989 |
text \<open> |
522 | 990 |
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
|
991 |
not intended to do anything. |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
992 |
|
522 | 993 |
As it stands, the command \isacommand{foobar} is not very useful. Let |
994 |
us refine it a bit next by letting it take a proposition as argument |
|
995 |
and printing this proposition inside the tracing buffer. We announce |
|
996 |
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
|
997 |
|
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
998 |
\begin{graybox} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
999 |
\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
|
1000 |
\end{graybox} |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1001 |
|
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1002 |
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
|
1003 |
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
|
1004 |
``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
|
1005 |
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
|
1006 |
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
|
1007 |
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
|
1008 |
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
|
1009 |
(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
|
1010 |
nothing. For this you can write: |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1011 |
\<close> |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1012 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1013 |
ML %grayML\<open>let |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1014 |
fun trace_prop str = |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1015 |
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
|
1016 |
in |
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
1017 |
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
|
1018 |
"traces a proposition" |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1019 |
(Parse.prop >> trace_prop) |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1020 |
end\<close> |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
1021 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1022 |
text \<open> |
521 | 1023 |
This command can now be used to |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1024 |
see the proposition in the tracing buffer. |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1025 |
\<close> |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1026 |
|
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1027 |
foobar_trace "True \<and> False" |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1028 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1029 |
text \<open> |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1030 |
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
|
1031 |
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
|
1032 |
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
|
1033 |
\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
|
1034 |
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
|
1035 |
``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
|
1036 |
\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
|
1037 |
\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
|
1038 |
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
|
1039 |
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
|
1040 |
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
|
1041 |
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
|
1042 |
as \<open>thy_goal\<close>. |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1043 |
|
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1044 |
\begin{graybox} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1045 |
\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
|
1046 |
\end{graybox} |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1047 |
|
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1048 |
Then we can write: |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1049 |
\<close> |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1050 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1051 |
ML%linenosgray\<open>let |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1052 |
fun goal_prop str ctxt = |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1053 |
let |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1054 |
val prop = Syntax.read_prop ctxt str |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1055 |
in |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1056 |
Proof.theorem NONE (K I) [[(prop, [])]] ctxt |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1057 |
end |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1058 |
in |
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
1059 |
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
|
1060 |
"proves a proposition" |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1061 |
(Parse.prop >> goal_prop) |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1062 |
end\<close> |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
1063 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1064 |
text \<open> |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1065 |
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
|
1066 |
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
|
1067 |
@{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
|
1068 |
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
|
1069 |
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
|
1070 |
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
|
1071 |
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
|
1072 |
about it). |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1073 |
|
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1074 |
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
|
1075 |
you obtain the following proof state: |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1076 |
\<close> |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1077 |
|
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1078 |
foobar_goal "True \<and> True" |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1079 |
txt \<open> |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1080 |
\begin{minipage}{\textwidth} |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1081 |
@{subgoals [display]} |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1082 |
\end{minipage}\medskip |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1083 |
|
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1084 |
and can prove the proposition as follows. |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1085 |
\<close> |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1086 |
apply(rule conjI) |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1087 |
apply(rule TrueI)+ |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1088 |
done |
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1089 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1090 |
text \<open> |
521 | 1091 |
The last command we describe here is |
522 | 1092 |
\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
|
1093 |
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
|
1094 |
allows us to give a proof for it. However, unlike |
522 | 1095 |
\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
|
1096 |
ML-value. Such a command is quite useful during development |
521 | 1097 |
when you generate a goal on the ML-level and want to see |
522 | 1098 |
whether it is provable. In addition we want to allow the proved |
521 | 1099 |
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
|
1100 |
|
522 | 1101 |
The first problem for \isacommand{foobar\_proof} is to parse some |
1102 |
text as ML-source and then interpret it as an Isabelle term using |
|
1103 |
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
|
1104 |
@{ML_ind "ML_source" in Parse} in the structure @{ML_structure |
522 | 1105 |
Parse}. For running the ML-interpreter we need the following |
1106 |
scaffolding code. |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1107 |
\<close> |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1108 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1109 |
ML %grayML\<open> |
529
13d7ea419c5f
moved the introspection part into the theorem section
Christian Urban <urbanc@in.tum.de>
parents:
523
diff
changeset
|
1110 |
structure Result = Proof_Data |
13d7ea419c5f
moved the introspection part into the theorem section
Christian Urban <urbanc@in.tum.de>
parents:
523
diff
changeset
|
1111 |
(type T = unit -> term |
13d7ea419c5f
moved the introspection part into the theorem section
Christian Urban <urbanc@in.tum.de>
parents:
523
diff
changeset
|
1112 |
fun init thy () = error "Result") |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1113 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1114 |
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
|
1115 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1116 |
text \<open> |
522 | 1117 |
With this in place, we can implement the code for \isacommand{foobar\_prove} |
1118 |
as follows. |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1119 |
\<close> |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1120 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1121 |
ML %linenosgray\<open>let |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1122 |
fun after_qed thm_name thms lthy = |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1123 |
Local_Theory.note (thm_name, (flat thms)) lthy |> snd |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1124 |
|
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
1125 |
fun setup_proof (thm_name, src) lthy = |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1126 |
let |
573
321e220a6baa
accomodate to upcoming Isabelle 2019
Norbert Schirmer <norbert.schirmer@web.de>
parents:
572
diff
changeset
|
1127 |
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
|
1128 |
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
|
1129 |
in |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1130 |
Proof.theorem NONE (after_qed thm_name) [[(trm, [])]] lthy |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1131 |
end |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1132 |
|
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1133 |
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
|
1134 |
in |
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
1135 |
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
|
1136 |
"proving a proposition" |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1137 |
(parser >> setup_proof) |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1138 |
end\<close> |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1139 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1140 |
text \<open> |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1141 |
In Line 12, we implement a parser that first reads in an optional lemma name (terminated |
521 | 1142 |
by ``:'') and then some ML-code. The function in Lines 5 to 10 takes the ML-text |
1143 |
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
|
1144 |
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
|
1145 |
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
|
1146 |
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
|
1147 |
(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
|
1148 |
|
521 | 1149 |
You can now define a term, for example |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1150 |
\<close> |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1151 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1152 |
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
|
1153 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1154 |
text \<open> |
521 | 1155 |
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
|
1156 |
\<close> |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1157 |
|
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1158 |
foobar_prove test: prop_true |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1159 |
apply(rule TrueI) |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1160 |
done |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1161 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1162 |
text \<open> |
522 | 1163 |
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
|
1164 |
|
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1165 |
\begin{isabelle} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1166 |
\isacommand{thm}~\<open>test\<close>\\ |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1167 |
\<open>> \<close>~@{thm TrueI} |
520
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1168 |
\end{isabelle} |
615762b8d8cb
improved new_command section
Christian Urban <urbanc@in.tum.de>
parents:
519
diff
changeset
|
1169 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1170 |
\<close> |
519
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1171 |
|
cf471fa86091
updated the section about new keywords
Christian Urban <urbanc@in.tum.de>
parents:
517
diff
changeset
|
1172 |
|
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
1173 |
(* |
321
e450fa467e3f
polished the commands section
Christian Urban <urbanc@in.tum.de>
parents:
319
diff
changeset
|
1174 |
text {* |
327
ce754ad78bc9
more work on the storing section
Christian Urban <urbanc@in.tum.de>
parents:
326
diff
changeset
|
1175 |
{\bf TBD below} |
74 | 1176 |
|
522 | 1177 |
*} |
65
c8e9a4f97916
tuned and added a section about creating keyword files
Christian Urban <urbanc@in.tum.de>
parents:
60
diff
changeset
|
1178 |
|
563
50d3059de9c6
accomodate Parsing section to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents:
559
diff
changeset
|
1179 |
*) |
324
4172c0743cf2
updated foobar_proof example
Christian Urban <urbanc@in.tum.de>
parents:
322
diff
changeset
|
1180 |
|
321
e450fa467e3f
polished the commands section
Christian Urban <urbanc@in.tum.de>
parents:
319
diff
changeset
|
1181 |
|
e450fa467e3f
polished the commands section
Christian Urban <urbanc@in.tum.de>
parents:
319
diff
changeset
|
1182 |
|
322 | 1183 |
(* |
1184 |
ML {* |
|
1185 |
structure TacticData = ProofDataFun |
|
1186 |
( |
|
1187 |
type T = thm list -> tactic; |
|
1188 |
fun init _ = undefined; |
|
366 | 1189 |
) |
322 | 1190 |
|
1191 |
val set_tactic = TacticData.put; |
|
1192 |
*} |
|
1193 |
||
1194 |
ML {* |
|
1195 |
TacticData.get @{context} |
|
1196 |
*} |
|
1197 |
||
1198 |
ML {* Method.set_tactic *} |
|
1199 |
ML {* fun tactic (facts: thm list) : tactic = (atac 1) *} |
|
1200 |
ML {* Context.map_proof *} |
|
1201 |
ML {* ML_Context.expression *} |
|
1202 |
ML {* METHOD *} |
|
1203 |
||
1204 |
||
1205 |
ML {* |
|
1206 |
fun myexpression pos bind body txt = |
|
1207 |
let |
|
1208 |
val _ = tracing ("bind)" ^ bind) |
|
1209 |
val _ = tracing ("body)" ^ body) |
|
1210 |
val _ = tracing ("txt)" ^ txt) |
|
1211 |
val _ = tracing ("result) " ^ "Context.set_thread_data (SOME (let " ^ bind ^ " = " ^ txt ^ " in " ^ body ^ |
|
1212 |
" end (ML_Context.the_generic_context ())));") |
|
1213 |
in |
|
1214 |
ML_Context.exec (fn () => ML_Context.eval false pos |
|
1215 |
("Context.set_thread_data (SOME (let " ^ bind ^ " = " ^ txt ^ " in " ^ body ^ |
|
1216 |
" end (ML_Context.the_generic_context ())));")) |
|
1217 |
end |
|
1218 |
*} |
|
319
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
316
diff
changeset
|
1219 |
|
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
316
diff
changeset
|
1220 |
|
322 | 1221 |
ML {* |
1222 |
fun ml_tactic (txt, pos) ctxt = |
|
1223 |
let |
|
1224 |
val ctxt' = ctxt |> Context.proof_map |
|
1225 |
(myexpression pos |
|
1226 |
"fun tactic (facts: thm list) : tactic" |
|
1227 |
"Context.map_proof (Method.set_tactic tactic)" txt); |
|
1228 |
in |
|
1229 |
Context.setmp_thread_data (SOME (Context.Proof ctxt)) (TacticData.get ctxt') |
|
1230 |
end; |
|
1231 |
*} |
|
1232 |
||
1233 |
ML {* |
|
1234 |
fun tactic3 (txt, pos) ctxt = |
|
1235 |
let |
|
1236 |
val _ = tracing ("1) " ^ txt ) |
|
1237 |
in |
|
1238 |
METHOD (ml_tactic (txt, pos) ctxt; K (atac 1)) |
|
1239 |
end |
|
1240 |
*} |
|
1241 |
||
1242 |
setup {* |
|
426 | 1243 |
Method.setup (Binding.name "tactic3") (Scan.lift (Parse.position Args.name) |
322 | 1244 |
>> tactic3) |
1245 |
"ML tactic as proof method" |
|
1246 |
*} |
|
1247 |
||
1248 |
lemma "A \<Longrightarrow> A" |
|
1249 |
apply(tactic3 {* (atac 1) *}) |
|
1250 |
done |
|
1251 |
||
1252 |
ML {* |
|
1253 |
(ML_Context.the_generic_context ()) |
|
1254 |
*} |
|
1255 |
||
1256 |
ML {* |
|
1257 |
Context.set_thread_data; |
|
1258 |
ML_Context.the_generic_context |
|
1259 |
*} |
|
1260 |
||
1261 |
lemma "A \<Longrightarrow> A" |
|
1262 |
ML_prf {* |
|
1263 |
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 ()))); |
|
1264 |
*} |
|
1265 |
||
1266 |
ML {* |
|
1267 |
Context.set_thread_data (SOME ((let fun tactic (facts: thm list) : tactic = (atac 1) in 3 end) (ML_Context.the_generic_context ()))); |
|
1268 |
*} |
|
1269 |
||
1270 |
ML {* |
|
1271 |
Context.set_thread_data (SOME (let |
|
1272 |
fun tactic (facts: thm list) : tactic = (atac 1) |
|
1273 |
in |
|
1274 |
Context.map_proof (Method.set_tactic tactic) |
|
1275 |
end |
|
1276 |
(ML_Context.the_generic_context ()))); |
|
1277 |
*} |
|
1278 |
||
1279 |
||
1280 |
ML {* |
|
1281 |
let |
|
1282 |
fun tactic (facts: thm list) : tactic = atac |
|
1283 |
in |
|
1284 |
Context.map_proof (Method.set_tactic tactic) |
|
1285 |
end *} |
|
1286 |
||
1287 |
end *} |
|
1288 |
||
1289 |
ML {* Toplevel.program (fn () => |
|
1290 |
(ML_Context.expression Position.none "val plus : int" "3 + 4" "1" (Context.Proof @{context})))*} |
|
1291 |
||
1292 |
||
1293 |
ML {* |
|
1294 |
fun ml_tactic (txt, pos) ctxt = |
|
1295 |
let |
|
1296 |
val ctxt' = ctxt |> Context.proof_map |
|
1297 |
(ML_Context.expression pos |
|
1298 |
"fun tactic (facts: thm list) : tactic" |
|
1299 |
"Context.map_proof (Method.set_tactic tactic)" txt); |
|
1300 |
in Context.setmp_thread_data (SOME (Context.Proof ctxt)) (TacticData.get ctxt') end; |
|
1301 |
||
1302 |
*} |
|
1303 |
||
1304 |
ML {* |
|
1305 |
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 ()))); |
|
1306 |
*} |
|
1307 |
*) |
|
319
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
316
diff
changeset
|
1308 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1309 |
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
|
1310 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1311 |
text \<open> |
207 | 1312 |
(FIXME: maybe move to after the tactic section) |
1313 |
||
559
ffa5c4ec9611
improvements by Piotr Trojanek
Christian Urban <christian dot urban at kcl dot ac dot uk>
parents:
558
diff
changeset
|
1314 |
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
|
1315 |
in \isacommand{apply}. To print out all currently known methods you can use the |
192 | 1316 |
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
|
1317 |
|
207 | 1318 |
\begin{isabelle} |
1319 |
\isacommand{print\_methods}\\ |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1320 |
\<open>> methods:\<close>\\ |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1321 |
\<open>> -: do nothing (insert current facts only)\<close>\\ |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1322 |
\<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
|
1323 |
\<open>> ...\<close> |
207 | 1324 |
\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
|
1325 |
|
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1326 |
An example of a very simple method is: |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1327 |
\<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
|
1328 |
|
244
dc95a56b1953
fixed the problem with double definition of even and odd
Christian Urban <urbanc@in.tum.de>
parents:
241
diff
changeset
|
1329 |
method_setup %gray foo = |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1330 |
\<open>Scan.succeed |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1331 |
(fn ctxt => (SIMPLE_METHOD ((eresolve_tac ctxt [@{thm conjE}] THEN' resolve_tac ctxt [@{thm conjI}]) 1)))\<close> |
244
dc95a56b1953
fixed the problem with double definition of even and odd
Christian Urban <urbanc@in.tum.de>
parents:
241
diff
changeset
|
1332 |
"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
|
1333 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1334 |
text \<open> |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1335 |
It defines the method \<open>foo\<close>, which takes no arguments (therefore the |
207 | 1336 |
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
|
1337 |
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
|
1338 |
@{ML_ind SIMPLE_METHOD in Method} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1339 |
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
|
1340 |
\<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
|
1341 |
|
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
|
1342 |
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
|
1343 |
apply(foo) |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1344 |
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
|
1345 |
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
|
1346 |
|
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
|
1347 |
\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
|
1348 |
@{subgoals} |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1349 |
\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
|
1350 |
(*<*)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
|
1351 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1352 |
method_setup test = \<open> |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1353 |
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
|
1354 |
|
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1355 |
lemma "True" |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1356 |
apply(test) |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1357 |
oops |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1358 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1359 |
method_setup joker = \<open> |
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1360 |
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
|
1361 |
|
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1362 |
lemma "False" |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1363 |
apply(joker) |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1364 |
oops |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1365 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1366 |
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
|
1367 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1368 |
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
|
1369 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1370 |
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
|
1371 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1372 |
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
|
1373 |
|
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1374 |
lemma "A \<Longrightarrow> A" |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1375 |
apply(first_atac) |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1376 |
oops |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1377 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1378 |
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
|
1379 |
|
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1380 |
lemma "A \<Longrightarrow> A" |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1381 |
apply(my_atac) |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1382 |
oops |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1383 |
|
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1384 |
|
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1385 |
|
319
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
316
diff
changeset
|
1386 |
|
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
316
diff
changeset
|
1387 |
|
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
316
diff
changeset
|
1388 |
|
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
316
diff
changeset
|
1389 |
|
193
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1390 |
(* |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1391 |
ML {* SIMPLE_METHOD *} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1392 |
ML {* METHOD *} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1393 |
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
|
1394 |
ML {* Scan.succeed *} |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1395 |
*) |
ffd93dcc269d
polishing to the theorem attributes section
Christian Urban <urbanc@in.tum.de>
parents:
192
diff
changeset
|
1396 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1397 |
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
|
1398 |
|
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1399 |
method_setup myrule = |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1400 |
\<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
|
1401 |
\<open>bla\<close> |
421
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1402 |
|
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1403 |
lemma |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1404 |
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
|
1405 |
shows "C" |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1406 |
using a |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1407 |
apply(myrule) |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1408 |
oops |
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1409 |
|
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1410 |
|
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1411 |
|
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1412 |
text \<open> |
421
620a24bf954a
added a section to the introduction; described @{make_string}
Christian Urban <urbanc@in.tum.de>
parents:
414
diff
changeset
|
1413 |
(********************************************************) |
186
371e4375c994
made the Ackermann function example safer and included suggestions from MW
Christian Urban <urbanc@in.tum.de>
parents:
183
diff
changeset
|
1414 |
(FIXME: explain a version of rule-tac) |
565
cecd7a941885
isabelle update_cartouches -t
Norbert Schirmer <norbert.schirmer@web.de>
parents:
563
diff
changeset
|
1415 |
\<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
|
1416 |
|
220 | 1417 |
end |