diff -r 304426a9aecf -r 92f7328dc5cc ProgTutorial/FirstSteps.thy --- a/ProgTutorial/FirstSteps.thy Thu Nov 05 10:30:59 2009 +0100 +++ b/ProgTutorial/FirstSteps.thy Sat Nov 07 01:03:37 2009 +0100 @@ -91,6 +91,9 @@ However, both commands will only play minor roles in this tutorial (we will always arrange that the ML-code is defined outside proofs). + + + Once a portion of code is relatively stable, you usually want to export it to a separate ML-file. Such files can then be included somewhere inside a theory by using the command \isacommand{use}. For example @@ -542,8 +545,27 @@ text {* which is the function composed of first the increment-by-one function and then increment-by-two, followed by increment-by-three. Again, the reverse function - composition allows you to read the code top-down. + composition allows you to read the code top-down. This combinator is often used + for setup function inside the \isacommand{setup}-command. These function have to be + of type @{ML_type "theory -> theory"} in order to install, for example, some new + data inside the current theory. More than one such setup function can be composed + with @{ML "#>"}. For example +*} +setup %gray {* let + val (ival1, setup_ival1) = Attrib.config_int "ival1" 1 + val (ival2, setup_ival2) = Attrib.config_int "ival2" 2 +in + setup_ival1 #> + setup_ival2 +end *} + +text {* + after this the configuration values @{text ival1} and @{text ival2} are known + in the current theory and can be manipulated by the user (for more information + about configuration values see Section~\ref{sec:storing}, for more about setup + functions see Section~\ref{sec:theories}). + The remaining combinators we describe in this section add convenience for the ``waterfall method'' of writing functions. The combinator @{ML_ind tap in Basics} allows you to get hold of an intermediate result (to do some @@ -814,6 +836,21 @@ under this name (this becomes especially important when you deal with theorem lists; see Section \ref{sec:storing}). + It is also possible to prove lemmas with the antiquotation @{text "@{lemma \ by \}"} + whose first argument is a statement (possibly many of them separated by @{text "and"}, + and the second is a proof. For example +*} + +ML{*val foo_thm = @{lemma "True" and "True" by simp simp} *} + +text {* + which can be printed out as follows + + @{ML_response_fake [gray,display] +"foo_thm |> string_of_thms @{context} + |> tracing" + "True, True"} + You can also refer to the current simpset via an antiquotation. To illustrate this we implement the function that extracts the theorem names stored in a simpset.