author | Christian Urban <urbanc@in.tum.de> |
Sun, 06 Nov 2011 15:15:59 +0000 | |
changeset 486 | 45cfd2ece7bd |
parent 485 | f3536f0b47a9 |
child 487 | 1c4250bc6258 |
permissions | -rw-r--r-- |
395
2c392f61f400
spilt the Essential's chapter
Christian Urban <urbanc@in.tum.de>
parents:
394
diff
changeset
|
1 |
theory Advanced |
441 | 2 |
imports Base First_Steps |
318
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
3 |
begin |
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
4 |
|
346
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
Christian Urban <urbanc@in.tum.de>
parents:
345
diff
changeset
|
5 |
(*<*) |
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
Christian Urban <urbanc@in.tum.de>
parents:
345
diff
changeset
|
6 |
setup{* |
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
Christian Urban <urbanc@in.tum.de>
parents:
345
diff
changeset
|
7 |
open_file_with_prelude |
395
2c392f61f400
spilt the Essential's chapter
Christian Urban <urbanc@in.tum.de>
parents:
394
diff
changeset
|
8 |
"Advanced_Code.thy" |
441 | 9 |
["theory Advanced", "imports Base First_Steps", "begin"] |
346
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
Christian Urban <urbanc@in.tum.de>
parents:
345
diff
changeset
|
10 |
*} |
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
Christian Urban <urbanc@in.tum.de>
parents:
345
diff
changeset
|
11 |
(*>*) |
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
Christian Urban <urbanc@in.tum.de>
parents:
345
diff
changeset
|
12 |
|
0fea8b7a14a1
tuned the ML-output mechanism; tuned slightly the text
Christian Urban <urbanc@in.tum.de>
parents:
345
diff
changeset
|
13 |
|
414 | 14 |
chapter {* Advanced Isabelle\label{chp:advanced} *} |
381
97518188ef0e
added more to the unification section
Christian Urban <urbanc@in.tum.de>
parents:
380
diff
changeset
|
15 |
|
97518188ef0e
added more to the unification section
Christian Urban <urbanc@in.tum.de>
parents:
380
diff
changeset
|
16 |
text {* |
410 | 17 |
\begin{flushright} |
18 |
{\em All things are difficult before they are easy.} \\[1ex] |
|
19 |
proverb |
|
20 |
\end{flushright} |
|
21 |
||
22 |
\medskip |
|
400 | 23 |
While terms, types and theorems are the most basic data structures in |
24 |
Isabelle, there are a number of layers built on top of them. Most of these |
|
408 | 25 |
layers are concerned with storing and manipulating data. Handling them |
26 |
properly is an essential skill for programming on the ML-level of Isabelle |
|
27 |
programming. The most basic layer are theories. They contain global data and |
|
28 |
can be seen as the ``long-term memory'' of Isabelle. There is usually only |
|
29 |
one theory active at each moment. Proof contexts and local theories, on the |
|
400 | 30 |
other hand, store local data for a task at hand. They act like the |
408 | 31 |
``short-term memory'' and there can be many of them that are active in |
32 |
parallel. |
|
318
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
33 |
*} |
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
34 |
|
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
35 |
section {* Theories and Setups\label{sec:theories} *} |
358 | 36 |
|
37 |
text {* |
|
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
38 |
Theories, as said above, are the most basic layer of abstraction in |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
39 |
Isabelle. They contain definitions, syntax declarations, axioms, proofs |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
40 |
and much more. If a definition is made, it must be stored in a theory in order to be |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
41 |
usable later on. Similar with proofs: once a proof is finished, the proved |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
42 |
theorem needs to be stored in the theorem database of the theory in order to |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
43 |
be usable. All relevant data of a theory can be queried as follows. |
358 | 44 |
|
45 |
\begin{isabelle} |
|
46 |
\isacommand{print\_theory}\\ |
|
47 |
@{text "> names: Pure Code_Generator HOL \<dots>"}\\ |
|
48 |
@{text "> classes: Inf < type \<dots>"}\\ |
|
49 |
@{text "> default sort: type"}\\ |
|
50 |
@{text "> syntactic types: #prop \<dots>"}\\ |
|
51 |
@{text "> logical types: 'a \<times> 'b \<dots>"}\\ |
|
52 |
@{text "> type arities: * :: (random, random) random \<dots>"}\\ |
|
53 |
@{text "> logical constants: == :: 'a \<Rightarrow> 'a \<Rightarrow> prop \<dots>"}\\ |
|
54 |
@{text "> abbreviations: \<dots>"}\\ |
|
55 |
@{text "> axioms: \<dots>"}\\ |
|
56 |
@{text "> oracles: \<dots>"}\\ |
|
57 |
@{text "> definitions: \<dots>"}\\ |
|
58 |
@{text "> theorems: \<dots>"} |
|
59 |
\end{isabelle} |
|
60 |
||
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
61 |
In the context ML-programming, the most important command with theories |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
62 |
is \isacommand{setup}. In the previous chapters we used it, for |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
63 |
example, to make a theorem attribute known to Isabelle or to register a theorem |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
64 |
under a name. What happens behind the scenes is that \isacommand{setup} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
65 |
expects a function of type @{ML_type "theory -> theory"}: the input theory |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
66 |
is the current theory and the output the theory where the attribute has been |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
67 |
registered or the theorem has been stored. This is a fundamental principle |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
68 |
in Isabelle. A similar situation arises with declaring constants. The |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
69 |
function that declares a constant on the ML-level is @{ML_ind declare_const |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
70 |
in Sign} in the structure @{ML_struct Sign}. To see how \isacommand{setup} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
71 |
works, consider the following code: |
348 | 72 |
*} |
73 |
||
485
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
74 |
ML{*let |
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
75 |
val thy = @{theory} |
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
76 |
val bar_const = ((@{binding "BAR"}, @{typ "nat"}), NoSyn) |
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
77 |
in |
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
78 |
Sign.declare_const @{context} bar_const thy |
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
79 |
end*} |
348 | 80 |
|
81 |
text {* |
|
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
82 |
If you simply write this code\footnote{Recall that ML-code needs to be enclosed in |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
83 |
\isacommand{ML}~@{text "\<verbopen> \<dots> \<verbclose>"}.} with the |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
84 |
intention of declaring a constant @{text "BAR"} with type @{typ nat} and run |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
85 |
the code, then indeed you obtain a theory as result. But if you query the |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
86 |
constant on the Isabelle level using the command \isacommand{term} |
348 | 87 |
|
88 |
\begin{isabelle} |
|
485
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
89 |
\isacommand{term}~@{text BAR}\\ |
348 | 90 |
@{text "> \"BAR\" :: \"'a\""} |
91 |
\end{isabelle} |
|
92 |
||
485
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
93 |
you can see that you do \emph{not} obtain a constant of type @{typ nat}, but a free |
484 | 94 |
variable (printed in blue) of polymorphic type. The problem is that the |
95 |
ML-expression above did not ``register'' the declaration with the current theory. |
|
96 |
This is what the command \isacommand{setup} is for. The constant is properly |
|
97 |
declared with |
|
348 | 98 |
*} |
99 |
||
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
100 |
setup %gray {* fn thy => |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
101 |
let |
485
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
102 |
val bar_const = ((@{binding "BAR"}, @{typ "nat"}), NoSyn) |
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
103 |
val (_, thy') = Sign.declare_const @{context} bar_const thy |
485
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
104 |
in |
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
105 |
thy' |
485
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
106 |
end *} |
348 | 107 |
|
108 |
text {* |
|
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
109 |
where the declaration is actually applied to the current theory and |
348 | 110 |
|
111 |
\begin{isabelle} |
|
112 |
\isacommand{term}~@{text [quotes] "BAR"}\\ |
|
113 |
@{text "> \"BAR\" :: \"nat\""} |
|
114 |
\end{isabelle} |
|
115 |
||
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
116 |
returns now a (black) constant with the type @{typ nat}, as expected. |
348 | 117 |
|
485
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
118 |
In a sense, \isacommand{setup} can be seen as a transaction that takes the |
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
119 |
current theory, applies an operation, and produces a new current theory. This |
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
120 |
means that we have to be careful to apply operations always to the most current |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
121 |
theory, not to a \emph{stale} one. Consider again the function inside the |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
122 |
\isacommand{setup}-command: |
485
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
123 |
|
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
124 |
\begin{isabelle} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
125 |
\begin{graybox} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
126 |
\isacommand{setup}~@{text "\<verbopen>"} @{ML |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
127 |
"fn thy => |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
128 |
let |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
129 |
val bar_const = ((@{binding \"BAR\"}, @{typ \"nat\"}), NoSyn) |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
130 |
val (_, thy') = Sign.declare_const @{context} bar_const thy |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
131 |
in |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
132 |
thy |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
133 |
end"}~@{text "\<verbclose>"}\isanewline |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
134 |
@{text "> ERROR \"Stale theory encountered\""} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
135 |
\end{graybox} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
136 |
\end{isabelle} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
137 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
138 |
This time we erroneously return the original theory @{text thy}, instead of |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
139 |
the modified one @{text thy'}. Such programming errors with handling the |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
140 |
most current theory will always result into stale theory error messages. |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
141 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
142 |
However, sometimes it does make sense to work with two theories at the same |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
143 |
time, especially in the context of parsing and typing. In the code below we |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
144 |
use in Line 3 the function @{ML_ind copy in Theory} from the structure |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
145 |
@{ML_struct Theory} for obtaining a new theory that contains the same |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
146 |
data, but is unrelated to the existing theory. |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
147 |
*} |
485
f3536f0b47a9
added section about testboard
Christian Urban <urbanc@in.tum.de>
parents:
484
diff
changeset
|
148 |
|
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
149 |
setup %graylinenos {* fn thy => |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
150 |
let |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
151 |
val tmp_thy = Theory.copy thy |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
152 |
val foo_const = ((@{binding "FOO"}, @{typ "nat => nat"}), NoSyn) |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
153 |
val (_, tmp_thy') = Sign.declare_const @{context} foo_const tmp_thy |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
154 |
val trm1 = Syntax.read_term_global tmp_thy' "FOO baz" |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
155 |
val trm2 = Syntax.read_term_global thy "FOO baz" |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
156 |
val _ = writeln (@{make_string} trm1 ^ "\n" ^ @{make_string} trm2) |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
157 |
in |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
158 |
thy |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
159 |
end *} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
160 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
161 |
text {* |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
162 |
That means we can make changes to the theory @{text tmp_thy} without |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
163 |
affecting the current theory @{text thy}. In this case we declare in @{text |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
164 |
"tmp_thy"} the constant @{text FOO} (Lines 4 and 5). The point of this code |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
165 |
is that we next, in Lines 6 and 7, parse a string to become a term (both |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
166 |
times the string is @{text [quotes] "FOO baz"}). But since we parse the string |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
167 |
once in the context of the theory @{text tmp_thy'} in which @{text FOO} is |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
168 |
declared to be a constant of type @{typ "nat \<Rightarrow>nat"} and once in the context |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
169 |
of @{text thy}, we obtain two different terms, namely |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
170 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
171 |
\begin{isabelle} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
172 |
\begin{graybox} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
173 |
@{text "> Const (\"Advanced.FOO\", \"nat \<Rightarrow> nat\") $ Free (\"baz\", \"nat\")"}\isanewline |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
174 |
@{text "> Free (\"FOO\", \"'a \<Rightarrow> 'b\") $ Free (\"baz\", \"'a\")"} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
175 |
\end{graybox} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
176 |
\end{isabelle} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
177 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
178 |
There are two reasons for parsing a term in a temporary theory. One is to |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
179 |
obtain fully qualified names and the other is appropriate type inference. |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
180 |
This is relevant in situations where definitions are made later, but parsing |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
181 |
and type inference has to take already proceed as if the definitions were |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
182 |
already made. |
348 | 183 |
*} |
318
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
184 |
|
341
62dea749d5ed
more work on theorem section
Christian Urban <urbanc@in.tum.de>
parents:
340
diff
changeset
|
185 |
section {* Contexts (TBD) *} |
62dea749d5ed
more work on theorem section
Christian Urban <urbanc@in.tum.de>
parents:
340
diff
changeset
|
186 |
|
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
187 |
text {* |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
188 |
Contexts are arguably more important than theories, even though they only |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
189 |
contain ``short-term memory data''. The reason is that a vast number of |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
190 |
functions in Isabelle depend one way or the other on contexts. Even such |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
191 |
mundane operation like printing out a term make essential use of contexts. |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
192 |
*} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
193 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
194 |
(* |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
195 |
ML{*Proof_Context.debug := true*} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
196 |
ML{*Proof_Context.verbose := true*} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
197 |
*) |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
198 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
199 |
lemma "True" |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
200 |
proof - |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
201 |
{ -- "\<And>x. _" |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
202 |
fix x |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
203 |
have "B x" sorry |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
204 |
thm this |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
205 |
} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
206 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
207 |
thm this |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
208 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
209 |
{ -- "A \<Longrightarrow> _" |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
210 |
assume A |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
211 |
have B sorry |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
212 |
thm this |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
213 |
} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
214 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
215 |
thm this |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
216 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
217 |
{ -- "\<And>x. x = _ \<Longrightarrow> _" |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
218 |
def x \<equiv> a |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
219 |
have "B x" sorry |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
220 |
} |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
221 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
222 |
thm this |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
223 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
224 |
oops |
413 | 225 |
|
226 |
||
341
62dea749d5ed
more work on theorem section
Christian Urban <urbanc@in.tum.de>
parents:
340
diff
changeset
|
227 |
section {* Local Theories (TBD) *} |
62dea749d5ed
more work on theorem section
Christian Urban <urbanc@in.tum.de>
parents:
340
diff
changeset
|
228 |
|
394 | 229 |
text {* |
400 | 230 |
In contrast to an ordinary theory, which simply consists of a type |
231 |
signature, as well as tables for constants, axioms and theorems, a local |
|
232 |
theory contains additional context information, such as locally fixed |
|
233 |
variables and local assumptions that may be used by the package. The type |
|
234 |
@{ML_type local_theory} is identical to the type of \emph{proof contexts} |
|
235 |
@{ML_type "Proof.context"}, although not every proof context constitutes a |
|
236 |
valid local theory. |
|
237 |
||
238 |
@{ML "Context.>> o Context.map_theory"} |
|
394 | 239 |
@{ML_ind "Local_Theory.declaration"} |
486
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
240 |
|
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
241 |
A similar command is \isacommand{local\_setup}, which expects a function |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
242 |
of type @{ML_type "local_theory -> local_theory"}. Later on we will also |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
243 |
use the commands \isacommand{method\_setup} for installing methods in the |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
244 |
current theory and \isacommand{simproc\_setup} for adding new simprocs to |
45cfd2ece7bd
a section about theories and setups
Christian Urban <urbanc@in.tum.de>
parents:
485
diff
changeset
|
245 |
the current simpset. |
394 | 246 |
*} |
318
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
247 |
|
336
a12bb28fe2bd
polished on the pretty printing section
Christian Urban <urbanc@in.tum.de>
parents:
335
diff
changeset
|
248 |
|
394 | 249 |
section {* Morphisms (TBD) *} |
250 |
||
251 |
text {* |
|
252 |
Morphisms are arbitrary transformations over terms, types, theorems and bindings. |
|
253 |
They can be constructed using the function @{ML_ind morphism in Morphism}, |
|
254 |
which expects a record with functions of type |
|
255 |
||
256 |
\begin{isabelle} |
|
257 |
\begin{tabular}{rl} |
|
258 |
@{text "binding:"} & @{text "binding -> binding"}\\ |
|
259 |
@{text "typ:"} & @{text "typ -> typ"}\\ |
|
260 |
@{text "term:"} & @{text "term -> term"}\\ |
|
261 |
@{text "fact:"} & @{text "thm list -> thm list"} |
|
262 |
\end{tabular} |
|
263 |
\end{isabelle} |
|
264 |
||
265 |
The simplest morphism is the @{ML_ind identity in Morphism}-morphism defined as |
|
266 |
*} |
|
267 |
||
481 | 268 |
ML{*val identity = Morphism.morphism {binding = [], typ = [], term = [], fact = []}*} |
394 | 269 |
|
270 |
text {* |
|
271 |
Morphisms can be composed with the function @{ML_ind "$>" in Morphism} |
|
272 |
*} |
|
273 |
||
274 |
ML{*fun trm_phi (Free (x, T)) = Var ((x, 0), T) |
|
275 |
| trm_phi (Abs (x, T, t)) = Abs (x, T, trm_phi t) |
|
276 |
| trm_phi (t $ s) = (trm_phi t) $ (trm_phi s) |
|
277 |
| trm_phi t = t*} |
|
278 |
||
279 |
ML{*val phi = Morphism.term_morphism trm_phi*} |
|
280 |
||
281 |
ML{*Morphism.term phi @{term "P x y"}*} |
|
282 |
||
283 |
text {* |
|
284 |
@{ML_ind term_morphism in Morphism} |
|
285 |
||
286 |
@{ML_ind term in Morphism}, |
|
287 |
@{ML_ind thm in Morphism} |
|
288 |
||
289 |
\begin{readmore} |
|
290 |
Morphisms are implemented in the file @{ML_file "Pure/morphism.ML"}. |
|
291 |
\end{readmore} |
|
292 |
*} |
|
318
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
293 |
|
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
294 |
section {* Misc (TBD) *} |
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
295 |
|
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
296 |
ML {*Datatype.get_info @{theory} "List.list"*} |
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
297 |
|
319
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
318
diff
changeset
|
298 |
text {* |
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
318
diff
changeset
|
299 |
FIXME: association lists: |
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
318
diff
changeset
|
300 |
@{ML_file "Pure/General/alist.ML"} |
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
318
diff
changeset
|
301 |
|
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
318
diff
changeset
|
302 |
FIXME: calling the ML-compiler |
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
318
diff
changeset
|
303 |
|
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
318
diff
changeset
|
304 |
*} |
6bce4acf7f2a
added file for producing a keyword file
Christian Urban <urbanc@in.tum.de>
parents:
318
diff
changeset
|
305 |
|
414 | 306 |
section {* What Is In an Isabelle Name? (TBD) *} |
307 |
||
308 |
text {* |
|
309 |
On the ML-level of Isabelle, you often have to work with qualified names. |
|
310 |
These are strings with some additional information, such as positional |
|
311 |
information and qualifiers. Such qualified names can be generated with the |
|
312 |
antiquotation @{text "@{binding \<dots>}"}. For example |
|
313 |
||
314 |
@{ML_response [display,gray] |
|
315 |
"@{binding \"name\"}" |
|
316 |
"name"} |
|
317 |
||
318 |
An example where a qualified name is needed is the function |
|
319 |
@{ML_ind define in Local_Theory}. This function is used below to define |
|
320 |
the constant @{term "TrueConj"} as the conjunction @{term "True \<and> True"}. |
|
321 |
*} |
|
322 |
||
323 |
local_setup %gray {* |
|
324 |
Local_Theory.define ((@{binding "TrueConj"}, NoSyn), |
|
325 |
(Attrib.empty_binding, @{term "True \<and> True"})) #> snd *} |
|
326 |
||
327 |
text {* |
|
328 |
Now querying the definition you obtain: |
|
329 |
||
330 |
\begin{isabelle} |
|
331 |
\isacommand{thm}~@{text "TrueConj_def"}\\ |
|
332 |
@{text "> "}~@{thm TrueConj_def} |
|
333 |
\end{isabelle} |
|
334 |
||
335 |
\begin{readmore} |
|
336 |
The basic operations on bindings are implemented in |
|
337 |
@{ML_file "Pure/General/binding.ML"}. |
|
338 |
\end{readmore} |
|
339 |
||
340 |
\footnote{\bf FIXME give a better example why bindings are important} |
|
341 |
\footnote{\bf FIXME give a pointer to \isacommand{local\_setup}; if not, then explain |
|
342 |
why @{ML snd} is needed.} |
|
343 |
\footnote{\bf FIXME: There should probably a separate section on binding, long-names |
|
344 |
and sign.} |
|
345 |
||
346 |
*} |
|
347 |
||
318
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
348 |
|
360 | 349 |
ML {* Sign.intern_type @{theory} "list" *} |
350 |
ML {* Sign.intern_const @{theory} "prod_fun" *} |
|
351 |
||
414 | 352 |
text {* |
353 |
\footnote{\bf FIXME: Explain the following better; maybe put in a separate |
|
354 |
section and link with the comment in the antiquotation section.} |
|
355 |
||
356 |
Occasionally you have to calculate what the ``base'' name of a given |
|
462 | 357 |
constant is. For this you can use the function @{ML_ind Long_Name.base_name}. For example: |
414 | 358 |
|
462 | 359 |
@{ML_response [display,gray] "Long_Name.base_name \"List.list.Nil\"" "\"Nil\""} |
414 | 360 |
|
361 |
\begin{readmore} |
|
362 |
Functions about naming are implemented in @{ML_file "Pure/General/name_space.ML"}; |
|
363 |
functions about signatures in @{ML_file "Pure/sign.ML"}. |
|
364 |
\end{readmore} |
|
365 |
*} |
|
387
5dcee4d751ad
completed the unification section
Christian Urban <urbanc@in.tum.de>
parents:
386
diff
changeset
|
366 |
|
5dcee4d751ad
completed the unification section
Christian Urban <urbanc@in.tum.de>
parents:
386
diff
changeset
|
367 |
text {* |
5dcee4d751ad
completed the unification section
Christian Urban <urbanc@in.tum.de>
parents:
386
diff
changeset
|
368 |
@{ML_ind "Binding.name_of"} returns the string without markup |
394 | 369 |
|
370 |
@{ML_ind "Binding.conceal"} |
|
387
5dcee4d751ad
completed the unification section
Christian Urban <urbanc@in.tum.de>
parents:
386
diff
changeset
|
371 |
*} |
5dcee4d751ad
completed the unification section
Christian Urban <urbanc@in.tum.de>
parents:
386
diff
changeset
|
372 |
|
388
0b337dedc306
added Skip_Proof.mk_thm and some pointers about concurrency
Christian Urban <urbanc@in.tum.de>
parents:
387
diff
changeset
|
373 |
section {* Concurrency (TBD) *} |
0b337dedc306
added Skip_Proof.mk_thm and some pointers about concurrency
Christian Urban <urbanc@in.tum.de>
parents:
387
diff
changeset
|
374 |
|
0b337dedc306
added Skip_Proof.mk_thm and some pointers about concurrency
Christian Urban <urbanc@in.tum.de>
parents:
387
diff
changeset
|
375 |
text {* |
0b337dedc306
added Skip_Proof.mk_thm and some pointers about concurrency
Christian Urban <urbanc@in.tum.de>
parents:
387
diff
changeset
|
376 |
@{ML_ind prove_future in Goal} |
0b337dedc306
added Skip_Proof.mk_thm and some pointers about concurrency
Christian Urban <urbanc@in.tum.de>
parents:
387
diff
changeset
|
377 |
@{ML_ind future_result in Goal} |
0b337dedc306
added Skip_Proof.mk_thm and some pointers about concurrency
Christian Urban <urbanc@in.tum.de>
parents:
387
diff
changeset
|
378 |
@{ML_ind fork_pri in Future} |
0b337dedc306
added Skip_Proof.mk_thm and some pointers about concurrency
Christian Urban <urbanc@in.tum.de>
parents:
387
diff
changeset
|
379 |
*} |
387
5dcee4d751ad
completed the unification section
Christian Urban <urbanc@in.tum.de>
parents:
386
diff
changeset
|
380 |
|
396 | 381 |
section {* Parse and Print Translations (TBD) *} |
382 |
||
349
9e374cd891e1
updated to Isabelle changes
Christian Urban <urbanc@in.tum.de>
parents:
348
diff
changeset
|
383 |
section {* Summary *} |
9e374cd891e1
updated to Isabelle changes
Christian Urban <urbanc@in.tum.de>
parents:
348
diff
changeset
|
384 |
|
9e374cd891e1
updated to Isabelle changes
Christian Urban <urbanc@in.tum.de>
parents:
348
diff
changeset
|
385 |
text {* |
395
2c392f61f400
spilt the Essential's chapter
Christian Urban <urbanc@in.tum.de>
parents:
394
diff
changeset
|
386 |
TBD |
349
9e374cd891e1
updated to Isabelle changes
Christian Urban <urbanc@in.tum.de>
parents:
348
diff
changeset
|
387 |
*} |
318
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
388 |
|
efb5fff99c96
split up the first-steps section into two chapters
Christian Urban <urbanc@in.tum.de>
parents:
diff
changeset
|
389 |
end |