ProgTutorial/FirstSteps.thy
changeset 192 2fff636e1fa0
parent 190 ca0ac2e75f6d
child 193 ffd93dcc269d
child 196 840b49bfb1cf
--- a/ProgTutorial/FirstSteps.thy	Thu Mar 19 23:21:26 2009 +0100
+++ b/ProgTutorial/FirstSteps.thy	Sat Mar 21 12:35:03 2009 +0100
@@ -119,6 +119,22 @@
 "Exception- ERROR \"foo\" raised
 At command \"ML\"."}
 
+  (FIXME @{ML Toplevel.debug} @{ML Toplevel.profiling})
+*}
+
+(*
+ML {*
+fun dodgy_fun () = (raise (ERROR "bar"); 1) 
+*}
+
+ML {* set Toplevel.debug *}
+
+ML {* fun f1 () = dodgy_fun () *}
+
+ML {* f1 () *}
+*)
+
+text {*
   Most often you want to inspect data of type @{ML_type term}, @{ML_type cterm} 
   or @{ML_type thm}. Isabelle contains elaborate pretty-printing functions for printing them, 
   but  for quick-and-dirty solutions they are far too unwieldy. A simple way to transform 
@@ -197,10 +213,6 @@
 fun str_of_thms_raw ctxt thms =  
   commas (map (str_of_thm_raw ctxt) thms)*}
 
-text {*
-(FIXME @{ML Toplevel.debug} @{ML Toplevel.profiling} @{ML Toplevel.debug})
-*}
-
 section {* Combinators\label{sec:combinators} *}
 
 text {*
@@ -477,6 +489,26 @@
   Again, this way or referencing simpsets makes you independent from additions
   of lemmas to the simpset by the user that potentially cause loops.
 
+  On the ML-level of Isabelle, you often have to work with qualified names;
+  these are strings with some additional information, such positional information
+  and qualifiers. Such bindings can be generated with the antiquotation 
+  @{text "@{bindin \<dots>}"}.
+
+  @{ML_response [display,gray]
+  "@{binding \"name\"}"
+  "name"}
+
+  An example where a binding is needed is the function @{ML define in LocalTheory}.
+  Below this function defines the constant @{term "TrueConj"} as the conjunction
+  @{term "True \<and> True"}.
+*}
+  
+local_setup %gray {* 
+  snd o LocalTheory.define Thm.internalK 
+    ((@{binding "TrueConj"}, NoSyn), 
+     (Attrib.empty_binding, @{term "True \<and> True"})) *}
+
+text {*
   While antiquotations have many applications, they were originally introduced in order 
   to avoid explicit bindings for theorems such as:
 *}
@@ -494,10 +526,6 @@
   kinds of logical elements from th ML-level.
 *}
 
-text {*
-  (FIXME: say something about @{text "@{binding \<dots>}"}
-*}
-
 section {* Terms and Types *}
 
 text {*
@@ -616,14 +644,27 @@
 "Const \<dots> $ 
   Abs (\"x\", \<dots>,
     Const \<dots> $ (Const \<dots> $ (Free (\"P\",\<dots>) $ \<dots>)) $ 
-               (Const \<dots> $ (Free (\"Q\",\<dots>) $ \<dots>)))"}
+                (Const \<dots> $ (Free (\"Q\",\<dots>) $ \<dots>)))"}
 
-  (FIXME: handy functions for constructing terms: @{ML list_comb}, @{ML lambda}, 
+  There are a number of handy functions that are frequently used for 
+  constructing terms. One is the function @{ML list_comb} which a term
+  and a list of terms as argument, and produces as output the term
+  list applied to the term. For example
+
+@{ML_response_fake [display,gray]
+"list_comb (@{term \"P::nat\"}, [@{term \"True\"}, @{term \"False\"}])"
+"Free (\"P\", \"nat\") $ Const (\"True\", \"bool\") $ Const (\"False\", \"bool\")"}
+
+  (FIXME: handy functions for constructing terms:  @{ML lambda}, 
   @{ML subst_free})
 *}
 
+ML {* lambda @{term "x::nat"} @{term "P x"}*}
+
 
 text {*
+  As can be seen this function does not take the typing annotation into account.
+
   \begin{readmore}
   There are many functions in @{ML_file "Pure/term.ML"}, @{ML_file "Pure/logic.ML"} and
   @{ML_file "HOL/Tools/hologic.ML"} that make such manual constructions of terms