diff -r 141751cab5b2 -r dfbd535cd1fd ProgTutorial/First_Steps.thy --- a/ProgTutorial/First_Steps.thy Wed Oct 26 13:19:09 2011 +0100 +++ b/ProgTutorial/First_Steps.thy Thu Oct 27 18:11:52 2011 +0100 @@ -489,14 +489,34 @@ then increment-by-two, followed by increment-by-three. Again, the reverse function composition allows you to read the code top-down. This combinator is often used for setup functions inside the - \isacommand{setup}-command. These functions have to be of type @{ML_type - "theory -> theory"}. More than one such setup function can be composed with - @{ML "#>"}.\footnote{TBD: give example} - - 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 - side-calculations or print out an intermediate result, for instance). The function + \isacommand{setup}- or \isacommand{local\_setup}-command. These functions + have to be of type @{ML_type "theory -> theory"}, respectively + @{ML_type "local_theory -> local_theory"}. More than one such setup function + can be composed with @{ML "#>"}. Consider for example the following code, + where we store the theorems @{thm [source] conjI}, @{thm [source] conjunct1} + and @{thm [source] conjunct2} under alternative names. +*} + +local_setup %graylinenos {* +let + fun my_note name thm = Local_Theory.note ((name, []), [thm]) #> snd +in + my_note @{binding "foo_conjI"} @{thm conjI} #> + my_note @{binding "bar_conjunct1"} @{thm conjunct1} #> + my_note @{binding "bar_conjunct2"} @{thm conjunct2} +end *} + +text {* + The function @{ML_text "my_note"} in line 3 is just a wrapper for the function + @{ML_ind note in Local_Theory}; its purpose is to store a theorem under a name. + In lines 5 to 6 we call this function to give alternative names for three + theorems. The point of @{ML "#>"} is that you can sequence such functions. + + 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 + side-calculations or print out an intermediate result, for instance). The + function *} ML %linenosgray{*fun inc_by_three x = @@ -624,9 +644,33 @@ "acc_incs 1 ||>> (fn x => (x, x + 2))" "(((((\"\", 1), 2), 3), 4), 6)"} - \footnote{\bf FIXME: maybe give a ``real world'' example for this combinator.} + An example for this combinator is for example the following code +*} + +ML {* +val (((one_def, two_def), three_def), ctxt') = + @{context} + |> Local_Defs.add_def ((@{binding "one"}, NoSyn), @{term "1::nat"}) + ||>> Local_Defs.add_def ((@{binding "Two"}, NoSyn), @{term "2::nat"}) + ||>> Local_Defs.add_def ((@{binding "Three"}, NoSyn), @{term "3::nat"}) *} +ML {* + @{context} + |> Local_Defs.add_def ((@{binding "One"}, NoSyn), @{term "1::nat"}) + ||>> Local_Defs.add_def ((@{binding "Two"}, NoSyn), @{term "2::nat"}) + ||>> Local_Defs.add_def ((@{binding "Three"}, NoSyn), @{term "3::nat"}) +*} + +ML {* + val ((((One, One_thm), (Two, Two_thm)), (Three, Three_thm)), _)) = + @{context} + |> Local_Defs.add_def ((@{binding "One"}, NoSyn), @{term "1::nat"}) + ||>> Local_Defs.add_def ((@{binding "Two"}, NoSyn), @{term "2::nat"}) + ||>> Local_Defs.add_def ((@{binding "Three"}, NoSyn), @{term "3::nat"}) +*} + + text {* Recall that @{ML "|>"} is the reverse function application. Recall also that the related reverse function composition is @{ML "#>"}. In fact all the