diff -r e3656cc81d27 -r 743020b817af ProgTutorial/Advanced.thy --- a/ProgTutorial/Advanced.thy Thu Nov 10 16:06:17 2011 +0000 +++ b/ProgTutorial/Advanced.thy Thu Nov 10 19:25:25 2011 +0000 @@ -201,7 +201,7 @@ contain ``short-term memory data''. The reason is that a vast number of functions in Isabelle depend in one way or another on contexts. Even such mundane operations like printing out a term make essential use of contexts. - For this consider the following contrived proof-snippet whose only purpose is to + For this consider the following contrived proof-snippet whose purpose is to fix two variables: *} @@ -218,7 +218,7 @@ text {* The interesting point in this proof is that we injected ML-code before and after the variables are fixed. For this remember that ML-code inside a proof - needs to be enclosed in \isacommand{ML\_prf}~@{text "\ \ \"}, + needs to be enclosed inside \isacommand{ML\_prf}~@{text "\ \ \"}, not \isacommand{ML}~@{text "\ \ \"}. The function @{ML_ind dest_fixes in Variable} from the structure @{ML_struct Variable} takes a context and returns all its currently fixed variable (names). That @@ -227,7 +227,7 @@ active at that point of the theory. Consequently, in the first call to @{ML dest_fixes in Variable} this dataslot is empty; in the second it is filled with @{text x} and @{text y}. What is interesting is that contexts - can be stacked. For this consider the following proof fragment + can be stacked. For this consider the following proof fragment: *} lemma "True" @@ -254,12 +254,15 @@ val ([z, w], ctxt2) = Variable.add_fixes ["z", "w"] ctxt1*} text {* - Now let us come back to the point about printing terms. + where the function @{ML_ind add_fixes in Variable} fixes a list of variables + specified by strings. Let us come back to the point about printing terms. Consider + printing out the term @{text "(x, y, z, w)"} using the function @{ML_ind pretty_term}. + This function takes a term and a context as argument. *} ML {* let - val trm = @{term "x y z w"} + val trm = @{term "(x, y, z, w)"} in pwriteln (Pretty.chunks [ pretty_term ctxt0 trm, @@ -270,7 +273,21 @@ text {* - + The term we are printing is in all three cases the same---a tuple containing four + free variables. As you can see in case of @{ML "ctxt0"}, however, all variables are highlighted + indicating a problem, while in case of @{ML "ctxt1"} @{text x} and @{text y} are printed + as normal (blue) free variables, but not @{text z} and @{text w}. In the last case all + variables are printed as expected. The point is that the context contains the information + which variables are fixed, and designates all other free variables as being alien or faulty. + While this seems like a minor feat, the concept of making the context aware of + fixed variables is actually quite useful. For example it prevents us from fixing a + variable twice + + @{ML_response_fake [gray, display] + "@{context} +|> Variable.add_fixes [\"x\", \"y\"] +||>> Variable.add_fixes [\"x\", \"y\"]" + "Duplicate fixed variable(s): \"x\""} *}