diff -r 28a49fe024c9 -r 304426a9aecf ProgTutorial/FirstSteps.thy --- a/ProgTutorial/FirstSteps.thy Tue Nov 03 13:57:03 2009 +0100 +++ b/ProgTutorial/FirstSteps.thy Thu Nov 05 10:30:59 2009 +0100 @@ -89,7 +89,7 @@ \end{quote} However, both commands will only play minor roles in this tutorial (we will - always arrange that the ML-code is defined outside of proofs). + 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 @@ -130,7 +130,7 @@ section {* Printing and Debugging\label{sec:printing} *} text {* - During development you might find it necessary to inspect some data in your + During development you might find it necessary to inspect data in your code. This can be done in a ``quick-and-dirty'' fashion using the function @{ML_ind writeln in Output}. For example @@ -156,7 +156,7 @@ @{ML_response_eq [display,gray] "tracing \"foo\"" "\"foo\"" with "(op =)"} It is also possible to redirect the ``channel'' where the string @{text - "foo"} is printed to a separate file, e.g., to prevent ProofGeneral from + "foo"} is printed to a separate file, e.g., in order to prevent ProofGeneral from choking on massive amounts of trace output. This redirection can be achieved with the code: *} @@ -219,7 +219,7 @@ thm}. Isabelle contains elaborate pretty-printing functions for printing them (see Section \ref{sec:pretty}), but for quick-and-dirty solutions they are a bit unwieldy. One way to transform a term into a string is to use the - function @{ML_ind string_of_term in Syntax} in the structure @{ML_struct + function @{ML_ind string_of_term in Syntax} from the structure @{ML_struct Syntax}. For more convenience, we bind this function to the toplevel. *} @@ -254,8 +254,8 @@ commas (map (string_of_term ctxt) ts)*} text {* - You can also print out term together with type information. - This can be achieved by setting the reference @{ML_ind show_types in Syntax} + You can also print out terms together with typing information. + For this you need to set the reference @{ML_ind show_types in Syntax} to @{ML true}. *} @@ -270,7 +270,8 @@ where @{text 1} and @{text x} are displayed with their inferred type. Even more type information can be printed by setting - @{ML_ind show_all_types in Syntax} to @{ML true}. We obtain then + the reference @{ML_ind show_all_types in Syntax} to @{ML true}. + We obtain then *} (*<*)ML %linenos {*show_all_types := true*} (*>*) @@ -279,6 +280,7 @@ "tracing (string_of_term @{context} @{term \"(1::nat, x)\"})" "(Pair::nat \ 'a \ nat \ 'a) (1::nat) (x::'a)"} + where @{term Pair} is the term-constructor for products. Other references that influence printing are @{ML_ind show_brackets in Syntax} and @{ML_ind show_sorts in Syntax}. *} @@ -336,7 +338,7 @@ string_of_term ctxt (prop_of (no_vars ctxt thm))*} text {* - Theorem @{thm [source] conjI} is now printed as follows: + With this function, theorem @{thm [source] conjI} is now printed as follows: @{ML_response_fake [display, gray] "tracing (string_of_thm_no_vars @{context} @{thm conjI})" @@ -359,7 +361,7 @@ @{ML_file "Pure/Syntax/printer.ML"}. \end{readmore} - Note that when printing out several ``parcels'' of information that + Note that for printing out several ``parcels'' of information that semantically belong together, like a warning message consisting of a term and its type, you should try to keep this information together in a single string. Therefore do \emph{not} print out information as @@ -378,15 +380,16 @@ and second half."} To ease this kind of string manipulations, there are a number - of library functions. For example, the function @{ML_ind cat_lines in Library} - concatenates a list of strings and inserts newlines. + of library functions in Isabelle. For example, the function + @{ML_ind cat_lines in Library} concatenates a list of strings + and inserts newlines in between each element. @{ML_response [display, gray] "cat_lines [\"foo\", \"bar\"]" "\"foo\\nbar\""} - Section \ref{sec:pretty} will also explain the infrastructure of Isabelle - that helps with more elaborate pretty printing. + Section \ref{sec:pretty} will also explain the infrastructure that Isabelle + provides for more elaborate pretty printing. \begin{readmore} Most of the basic string functions of Isabelle are defined in @@ -508,6 +511,7 @@ function @{ML_ind list_comb in Term} to the term. In this last step we have to use the function @{ML_ind curry in Library}, because @{ML list_comb} expects the function and the variables list as a pair. + Functions like @{ML apply_fresh_args} are often needed when constructing terms with fresh variables. The infrastructure helps tremendously to avoid any name clashes. Consider for @@ -531,9 +535,9 @@ *} ML{*val inc_by_six = - (fn x => x + 1) - #> (fn x => x + 2) - #> (fn x => x + 3)*} + (fn x => x + 1) #> + (fn x => x + 2) #> + (fn x => x + 3)*} text {* which is the function composed of first the increment-by-one function and then