diff -r 9a6e5e0c4906 -r c8e9a4f97916 CookBook/FirstSteps.thy --- a/CookBook/FirstSteps.thy Thu Jan 08 22:47:15 2009 +0000 +++ b/CookBook/FirstSteps.thy Sat Jan 10 12:57:48 2009 +0000 @@ -73,12 +73,12 @@ will print out @{text [quotes] "any string"} inside the response buffer of Isabelle. This function expects a string as argument. If you develop under PolyML, then there is a convenient, though again ``quick-and-dirty'', method for - converting values into strings, for example: + converting values into strings, namely @{ML makestring}: @{ML_response_fake [display] "warning (makestring 1)" "\"1\""} - However this only works if the type of what is converted is monomorphic and is not - a function. + However @{ML makestring} only works if the type of what is converted is monomorphic + and is not a function. The function @{ML "warning"} should only be used for testing purposes, because any output this function generates will be overwritten as soon as an error is @@ -89,7 +89,7 @@ @{ML_response_fake [display] "tracing \"foo\"" "\"foo\""} It is also possible to redirect the ``channel'' where the string @{text "foo"} is - printed to a separate file, e.g. to prevent Proof General from choking on massive + printed to a separate file, e.g. to prevent ProofGeneral from choking on massive amounts of trace output. This redirection can be achieved using the code *} @@ -159,7 +159,7 @@ (FIXME: what does a simpset look like? It seems to be the same problem as with tokens.) - While antiquotations nowadays have many applications, they were originally introduced to + While antiquotations have many applications, they were originally introduced to avoid explicit bindings for theorems such as *} @@ -228,14 +228,13 @@ inserting the invisible @{text "Trueprop"}-coercions whenever necessary. Consider for example - @{ML_response [display] "@{term \"P x\"}" "Free (\"P\", \) $ Free (\"x\", \)"} - @{ML_response [display] "@{prop \"P x\"}" - "Const (\"Trueprop\", \) $ (Free (\"P\", \) $ Free (\"x\", \))"} + @{ML_response [display] "(@{term \"P x\"}, @{prop \"P x\"})" "(Free (\"P\", \) $ Free (\"x\", \), + Const (\"Trueprop\", \) $ (Free (\"P\", \) $ Free (\"x\", \)))"} + + which inserts the coercion in the second component and - which inserts the coercion in the latter case and - - @{ML_response [display] "@{term \"P x \ Q x\"}" "Const (\"==>\", \) $ \ $ \"} - @{ML_response [display] "@{prop \"P x \ Q x\"}" "Const (\"==>\", \) $ \ $ \"} + @{ML_response [display] "(@{term \"P x \ Q x\"}, @{prop \"P x \ Q x\"})" + "(Const (\"==>\", \) $ \ $ \, Const (\"==>\", \) $ \ $ \)"} which does not (since it is already constructed using the meta-implication). @@ -255,7 +254,8 @@ text {* While antiquotations are very convenient for constructing terms and types, - they can only construct fixed terms. Unfortunately, one often needs to construct terms + they can only construct fixed terms (remember they are ``linked'' at compile-time). + However, one often needs to construct terms dynamically. For example, a function that returns the implication @{text "\(x::\). P x \ Q x"} taking @{term P}, @{term Q} and the type @{term "\"} as arguments can only be written as @@ -265,16 +265,14 @@ fun make_imp P Q tau = let val x = Free ("x",tau) - in Logic.all x (Logic.mk_implies (HOLogic.mk_Trueprop (P $ x), - HOLogic.mk_Trueprop (Q $ x))) + in Logic.all x (Logic.mk_implies (P $ x, Q $ x)) end *} text {* The reason is that one cannot pass the arguments @{term P}, @{term Q} and - @{term "tau"} into an antiquotation. For example the following does not work as - expected. + @{term "tau"} into an antiquotation. For example the following does \emph{not} work: *} ML {* @@ -283,7 +281,21 @@ text {* To see this apply @{text "@{term S}"}, @{text "@{term T}"} and @{text "@{typ nat}"} - to both functions. + to both functions: + + @{ML_response [display] "make_imp @{term S} @{term T} @{typ nat}" + "Const \ $ + Abs (\"x\", Type (\"nat\",[]), + Const \ $ (Free (\"S\",\) $ \) $ + (Free (\"T\",\) $ \))"} + @{ML_response [display] "make_wrong_imp @{term S} @{term T} @{typ nat}" + "Const \ $ + Abs (\"x\", \, + Const \ $ (Const \ $ (Free (\"P\",\) $ \)) $ + (Const \ $ (Free (\"Q\",\) $ \)))"} + + As can be seen, in the first case the arguments are correctly used, while in the + second the @{term "P"} and @{text "Q"} from the antiquotation. One tricky point in constructing terms by hand is to obtain the fully qualified name for constants. For example the names for @{text "zero"} and