42 |
42 |
43 Like normal Isabelle proof scripts, \isacommand{ML}-commands can be |
43 Like normal Isabelle proof scripts, \isacommand{ML}-commands can be |
44 evaluated by using the advance and undo buttons of your Isabelle |
44 evaluated by using the advance and undo buttons of your Isabelle |
45 environment. The code inside the \isacommand{ML}-command can also contain |
45 environment. The code inside the \isacommand{ML}-command can also contain |
46 value and function bindings, and even those can be undone when the proof |
46 value and function bindings, and even those can be undone when the proof |
47 script is retracted. As mentioned earlier, we will drop the |
47 script is retracted. As mentioned in the Introduction, we will drop the |
48 \isacommand{ML}~@{text "\<verbopen> \<dots> \<verbclose>"} scaffolding whenever we |
48 \isacommand{ML}~@{text "\<verbopen> \<dots> \<verbclose>"} scaffolding whenever we |
49 show code. The lines prefixed with @{text [quotes] ">"} are not part of the |
49 show code. The lines prefixed with @{text [quotes] ">"} are not part of the |
50 code, rather they indicate what the response is when the code is evaluated. |
50 code, rather they indicate what the response is when the code is evaluated. |
51 |
51 |
52 Once a portion of code is relatively stable, you usually want to export it |
52 Once a portion of code is relatively stable, you usually want to export it |
71 |
71 |
72 During development you might find it necessary to inspect some data |
72 During development you might find it necessary to inspect some data |
73 in your code. This can be done in a ``quick-and-dirty'' fashion using |
73 in your code. This can be done in a ``quick-and-dirty'' fashion using |
74 the function @{ML "warning"}. For example |
74 the function @{ML "warning"}. For example |
75 |
75 |
76 @{ML_response_fake [display,gray] "warning \"any string\"" "\"any string\""} |
76 @{ML_response [display,gray] "warning \"any string\"" "\"any string\""} |
77 |
77 |
78 will print out @{text [quotes] "any string"} inside the response buffer |
78 will print out @{text [quotes] "any string"} inside the response buffer |
79 of Isabelle. This function expects a string as argument. If you develop under PolyML, |
79 of Isabelle. This function expects a string as argument. If you develop under PolyML, |
80 then there is a convenient, though again ``quick-and-dirty'', method for |
80 then there is a convenient, though again ``quick-and-dirty'', method for |
81 converting values into strings, namely the function @{ML makestring}: |
81 converting values into strings, namely the function @{ML makestring}: |
82 |
82 |
83 @{ML_response_fake [display,gray] "warning (makestring 1)" "\"1\""} |
83 @{ML_response [display,gray] "warning (makestring 1)" "\"1\""} |
84 |
84 |
85 However @{ML makestring} only works if the type of what is converted is monomorphic |
85 However @{ML makestring} only works if the type of what is converted is monomorphic |
86 and not a function. |
86 and not a function. |
87 |
87 |
88 The function @{ML "warning"} should only be used for testing purposes, because any |
88 The function @{ML "warning"} should only be used for testing purposes, because any |
89 output this function generates will be overwritten as soon as an error is |
89 output this function generates will be overwritten as soon as an error is |
90 raised. For printing anything more serious and elaborate, the |
90 raised. For printing anything more serious and elaborate, the |
91 function @{ML tracing} is more appropriate. This function writes all output into |
91 function @{ML tracing} is more appropriate. This function writes all output into |
92 a separate tracing buffer. For example: |
92 a separate tracing buffer. For example: |
93 |
93 |
94 @{ML_response_fake [display,gray] "tracing \"foo\"" "\"foo\""} |
94 @{ML_response [display,gray] "tracing \"foo\"" "\"foo\""} |
95 |
95 |
96 It is also possible to redirect the ``channel'' where the string @{text "foo"} is |
96 It is also possible to redirect the ``channel'' where the string @{text "foo"} is |
97 printed to a separate file, e.g.~to prevent ProofGeneral from choking on massive |
97 printed to a separate file, e.g.~to prevent ProofGeneral from choking on massive |
98 amounts of trace output. This redirection can be achieved with the code: |
98 amounts of trace output. This redirection can be achieved with the code: |
99 *} |
99 *} |
426 "get_thm_names_from_ss @{simpset}" |
426 "get_thm_names_from_ss @{simpset}" |
427 "[\"Nat.of_nat_eq_id\", \"Int.of_int_eq_id\", \"Nat.One_nat_def\", \<dots>]"} |
427 "[\"Nat.of_nat_eq_id\", \"Int.of_int_eq_id\", \"Nat.One_nat_def\", \<dots>]"} |
428 |
428 |
429 Again, this way or referencing simpsets makes you independent from additions |
429 Again, this way or referencing simpsets makes you independent from additions |
430 of lemmas to the simpset by the user that potentially cause loops. |
430 of lemmas to the simpset by the user that potentially cause loops. |
431 |
|
432 \begin{readmore} |
|
433 The infrastructure for simpsets is implemented in @{ML_file "Pure/meta_simplifier.ML"} |
|
434 and @{ML_file "Pure/simplifier.ML"}. Discrimination nets are implemented |
|
435 in @{ML_file "Pure/net.ML"}. |
|
436 \end{readmore} |
|
437 |
431 |
438 While antiquotations have many applications, they were originally introduced in order |
432 While antiquotations have many applications, they were originally introduced in order |
439 to avoid explicit bindings for theorems such as: |
433 to avoid explicit bindings for theorems such as: |
440 *} |
434 *} |
441 |
435 |
723 |
717 |
724 The difference between both functions is that @{ML extern_const in Sign} returns |
718 The difference between both functions is that @{ML extern_const in Sign} returns |
725 the smallest name that is still unique, whereas @{ML base_name in Sign} always |
719 the smallest name that is still unique, whereas @{ML base_name in Sign} always |
726 strips off all qualifiers. |
720 strips off all qualifiers. |
727 |
721 |
|
722 (FIXME: These are probably now NameSpace functions) |
|
723 |
728 \begin{readmore} |
724 \begin{readmore} |
729 FIXME |
725 FIXME: Find the right files to do with naming. |
730 \end{readmore} |
726 \end{readmore} |
731 *} |
727 *} |
732 |
728 |
733 |
729 |
734 section {* Type-Checking *} |
730 section {* Type-Checking *} |
769 in |
765 in |
770 cterm_of @{theory} |
766 cterm_of @{theory} |
771 (Const (@{const_name plus}, natT --> natT --> natT) $ zero $ zero) |
767 (Const (@{const_name plus}, natT --> natT --> natT) $ zero $ zero) |
772 end" "0 + 0"} |
768 end" "0 + 0"} |
773 |
769 |
|
770 In Isabelle also types need can be certified. For example, you obtain |
|
771 the certified type for the Isablle type @{typ "nat \<Rightarrow> bool"} on the ML-level |
|
772 as follows: |
|
773 |
|
774 @{ML_response_fake [display,gray] |
|
775 "ctyp_of @{theory} (@{typ nat} --> @{typ bool})" |
|
776 "nat \<Rightarrow> bool"} |
|
777 |
|
778 \begin{readmore} |
|
779 For functions related to @{ML_type cterm}s and @{ML_type ctyp}s see |
|
780 the file @{ML_file "Pure/thm.ML"}. |
|
781 \end{readmore} |
|
782 |
774 \begin{exercise} |
783 \begin{exercise} |
775 Check that the function defined in Exercise~\ref{fun:revsum} returns a |
784 Check that the function defined in Exercise~\ref{fun:revsum} returns a |
776 result that type-checks. |
785 result that type-checks. |
777 \end{exercise} |
786 \end{exercise} |
778 |
787 |
828 Instead of giving explicitly the type for the constant @{text "plus"} and the free |
837 Instead of giving explicitly the type for the constant @{text "plus"} and the free |
829 variable @{text "x"}, the type-inference filles in the missing information. |
838 variable @{text "x"}, the type-inference filles in the missing information. |
830 |
839 |
831 \begin{readmore} |
840 \begin{readmore} |
832 See @{ML_file "Pure/Syntax/syntax.ML"} where more functions about reading, |
841 See @{ML_file "Pure/Syntax/syntax.ML"} where more functions about reading, |
833 checking and pretty-printing of terms are defined. |
842 checking and pretty-printing of terms are defined. Fuctions related to the |
|
843 type inference are implemented in @{ML_file "Pure/type.ML"} and |
|
844 @{ML_file "Pure/type_infer.ML"}. |
834 \end{readmore} |
845 \end{readmore} |
835 *} |
846 *} |
836 |
847 |
837 |
848 |
838 section {* Theorems *} |
849 section {* Theorems *} |