equal
  deleted
  inserted
  replaced
  
    
    
|      1 theory FirstSteps |      1 theory FirstSteps | 
|      2 imports Base |      2 imports Base | 
|      3 begin |      3 begin | 
|      4  |      4  | 
|      5 chapter {* First Steps *} |      5 chapter {* First Steps *} | 
|      6  |         | 
|      7  |      6  | 
|      8 text {* |      7 text {* | 
|      9   Isabelle programming is done in ML. Just like lemmas and proofs, ML-code |      8   Isabelle programming is done in ML. Just like lemmas and proofs, ML-code | 
|     10   in Isabelle is part of a theory. If you want to follow the code given in |      9   in Isabelle is part of a theory. If you want to follow the code given in | 
|     11   this chapter, we assume you are working inside the theory starting with |     10   this chapter, we assume you are working inside the theory starting with | 
|    228 text {* |    227 text {* | 
|    229   Theorems also include schematic variables, such as @{text "?P"},  |    228   Theorems also include schematic variables, such as @{text "?P"},  | 
|    230   @{text "?Q"} and so on.  |    229   @{text "?Q"} and so on.  | 
|    231  |    230  | 
|    232   @{ML_response_fake [display, gray] |    231   @{ML_response_fake [display, gray] | 
|    233   "writeln (string_of_thm @{context} @{thm conjI})" |    232   "tracing (string_of_thm @{context} @{thm conjI})" | 
|    234   "\<lbrakk>?P; ?Q\<rbrakk> \<Longrightarrow> ?P \<and> ?Q"} |    233   "\<lbrakk>?P; ?Q\<rbrakk> \<Longrightarrow> ?P \<and> ?Q"} | 
|    235  |    234  | 
|    236   In order to improve the readability of theorems we convert |    235   In order to improve the readability of theorems we convert | 
|    237   these schematic variables into free variables using the  |    236   these schematic variables into free variables using the  | 
|    238   function @{ML [index] import in Variable}. |    237   function @{ML [index] import in Variable}. | 
|    250  |    249  | 
|    251 text {*  |    250 text {*  | 
|    252   Theorem @{thm [source] conjI} is now printed as follows: |    251   Theorem @{thm [source] conjI} is now printed as follows: | 
|    253  |    252  | 
|    254   @{ML_response_fake [display, gray] |    253   @{ML_response_fake [display, gray] | 
|    255   "writeln (string_of_thm_no_vars @{context} @{thm conjI})" |    254   "tracing (string_of_thm_no_vars @{context} @{thm conjI})" | 
|    256   "\<lbrakk>P; Q\<rbrakk> \<Longrightarrow> P \<and> Q"} |    255   "\<lbrakk>P; Q\<rbrakk> \<Longrightarrow> P \<and> Q"} | 
|    257    |    256    | 
|    258   Again the function @{ML commas} helps with printing more than one theorem.  |    257   Again the function @{ML commas} helps with printing more than one theorem.  | 
|    259 *} |    258 *} | 
|    260  |    259  | 
|    357   val t = @{term \"P::nat \<Rightarrow> int \<Rightarrow> unit \<Rightarrow> bool\"} |    356   val t = @{term \"P::nat \<Rightarrow> int \<Rightarrow> unit \<Rightarrow> bool\"} | 
|    358   val ctxt = @{context} |    357   val ctxt = @{context} | 
|    359 in  |    358 in  | 
|    360   apply_fresh_args t ctxt |    359   apply_fresh_args t ctxt | 
|    361    |> Syntax.string_of_term ctxt |    360    |> Syntax.string_of_term ctxt | 
|    362    |> writeln |    361    |> tracing | 
|    363 end"  |    362 end"  | 
|    364   "P z za zb"} |    363   "P z za zb"} | 
|    365  |    364  | 
|    366   You can read off this behaviour from how @{ML apply_fresh_args} is |    365   You can read off this behaviour from how @{ML apply_fresh_args} is | 
|    367   coded: in Line 2, the function @{ML [index] fastype_of} calculates the type of the |    366   coded: in Line 2, the function @{ML [index] fastype_of} calculates the type of the | 
|    382   val t = @{term \"za::'a \<Rightarrow> 'b \<Rightarrow> 'c\"} |    381   val t = @{term \"za::'a \<Rightarrow> 'b \<Rightarrow> 'c\"} | 
|    383   val ctxt = @{context} |    382   val ctxt = @{context} | 
|    384 in |    383 in | 
|    385   apply_fresh_args t ctxt  |    384   apply_fresh_args t ctxt  | 
|    386    |> Syntax.string_of_term ctxt |    385    |> Syntax.string_of_term ctxt | 
|    387    |> writeln |    386    |> tracing | 
|    388 end" |    387 end" | 
|    389   "za z zb"} |    388   "za z zb"} | 
|    390    |    389    | 
|    391   where the @{text "za"} is correctly avoided. |    390   where the @{text "za"} is correctly avoided. | 
|    392  |    391  | 
|    741 "let |    740 "let | 
|    742   val v1 = Var ((\"x\", 3), @{typ bool}) |    741   val v1 = Var ((\"x\", 3), @{typ bool}) | 
|    743   val v2 = Var ((\"x1\", 3), @{typ bool}) |    742   val v2 = Var ((\"x1\", 3), @{typ bool}) | 
|    744   val v3 = Free (\"x\", @{typ bool}) |    743   val v3 = Free (\"x\", @{typ bool}) | 
|    745 in |    744 in | 
|    746   writeln (Syntax.string_of_term @{context} v1); |    745   tracing (Syntax.string_of_term @{context} v1); | 
|    747   writeln (Syntax.string_of_term @{context} v2); |    746   tracing (Syntax.string_of_term @{context} v2); | 
|    748   writeln (Syntax.string_of_term @{context} v3) |    747   tracing (Syntax.string_of_term @{context} v3) | 
|    749 end" |    748 end" | 
|    750 "?x3 |    749 "?x3 | 
|    751 ?x1.3 |    750 ?x1.3 | 
|    752 x"} |    751 x"} | 
|    753  |    752  | 
|    774  |    773  | 
|    775   @{ML_response_fake [display,gray]  |    774   @{ML_response_fake [display,gray]  | 
|    776 "let |    775 "let | 
|    777   val omega = Free (\"x\", @{typ nat}) $ Free (\"x\", @{typ nat}) |    776   val omega = Free (\"x\", @{typ nat}) $ Free (\"x\", @{typ nat}) | 
|    778 in  |    777 in  | 
|    779   writeln (Syntax.string_of_term @{context} omega) |    778   tracing (Syntax.string_of_term @{context} omega) | 
|    780 end" |    779 end" | 
|    781   "x x"} |    780   "x x"} | 
|    782  |    781  | 
|    783   with the raw ML-constructors. |    782   with the raw ML-constructors. | 
|    784    |    783    | 
|    978  |    977  | 
|    979 @{ML_response_fake [gray,display] |    978 @{ML_response_fake [gray,display] | 
|    980 "let |    979 "let | 
|    981   val eq = HOLogic.mk_eq (@{term \"True\"}, @{term \"False\"}) |    980   val eq = HOLogic.mk_eq (@{term \"True\"}, @{term \"False\"}) | 
|    982 in |    981 in | 
|    983   writeln (Syntax.string_of_term @{context} eq) |    982   tracing (Syntax.string_of_term @{context} eq) | 
|    984 end" |    983 end" | 
|    985   "True = False"} |    984   "True = False"} | 
|    986 *} |    985 *} | 
|    987  |    986  | 
|    988 text {* |    987 text {* | 
|   1906           | SOME i => Int.toString i |   1905           | SOME i => Int.toString i | 
|   1907       val s3 = |   1906       val s3 = | 
|   1908          case realOut (!r) of |   1907          case realOut (!r) of | 
|   1909             NONE => "NONE" |   1908             NONE => "NONE" | 
|   1910           | SOME x => Real.toString x |   1909           | SOME x => Real.toString x | 
|   1911       val () = writeln (concat [s1, " ", s2, " ", s3, "\n"]) |   1910       val () = tracing (concat [s1, " ", s2, " ", s3, "\n"]) | 
|   1912    end*} |   1911    end*} | 
|   1913  |   1912  | 
|   1914 ML_val{*structure t = Test(U) *}  |   1913 ML_val{*structure t = Test(U) *}  | 
|   1915  |   1914  | 
|   1916 ML_val{*structure Datatab = TableFun(type key = int val ord = int_ord);*} |   1915 ML_val{*structure Datatab = TableFun(type key = int val ord = int_ord);*} | 
|   1983   string}. This can be done with the function @{ML [index] string_of in Pretty}. In what |   1982   string}. This can be done with the function @{ML [index] string_of in Pretty}. In what | 
|   1984   follows we will use the following wrapper function for printing a pretty |   1983   follows we will use the following wrapper function for printing a pretty | 
|   1985   type: |   1984   type: | 
|   1986 *} |   1985 *} | 
|   1987  |   1986  | 
|   1988 ML{*fun pprint prt = writeln (Pretty.string_of prt)*} |   1987 ML{*fun pprint prt = tracing (Pretty.string_of prt)*} | 
|   1989  |   1988  | 
|   1990 text {* |   1989 text {* | 
|   1991   The point of the pretty-printing infrastructure is to give hints about how to |   1990   The point of the pretty-printing infrastructure is to give hints about how to | 
|   1992   layout text and let Isabelle do the actual layout. Let us first explain |   1991   layout text and let Isabelle do the actual layout. Let us first explain | 
|   1993   how you can insert places where a line break can occur. For this assume the |   1992   how you can insert places where a line break can occur. For this assume the | 
|   2006   We deliberately chose a large string so that it spans over more than one line.  |   2005   We deliberately chose a large string so that it spans over more than one line.  | 
|   2007   If we print out the string using the usual ``quick-and-dirty'' method, then |   2006   If we print out the string using the usual ``quick-and-dirty'' method, then | 
|   2008   we obtain the ugly output: |   2007   we obtain the ugly output: | 
|   2009  |   2008  | 
|   2010 @{ML_response_fake [display,gray] |   2009 @{ML_response_fake [display,gray] | 
|   2011 "writeln test_str" |   2010 "tracing test_str" | 
|   2012 "fooooooooooooooobaaaaaaaaaaaar fooooooooooooooobaaaaaaaaaaaar foooooooooo |   2011 "fooooooooooooooobaaaaaaaaaaaar fooooooooooooooobaaaaaaaaaaaar foooooooooo | 
|   2013 ooooobaaaaaaaaaaaar fooooooooooooooobaaaaaaaaaaaar fooooooooooooooobaaaaa |   2012 ooooobaaaaaaaaaaaar fooooooooooooooobaaaaaaaaaaaar fooooooooooooooobaaaaa | 
|   2014 aaaaaaar fooooooooooooooobaaaaaaaaaaaar fooooooooooooooobaaaaaaaaaaaar fo |   2013 aaaaaaar fooooooooooooooobaaaaaaaaaaaar fooooooooooooooobaaaaaaaaaaaar fo | 
|   2015 oooooooooooooobaaaaaaaaaaaar"} |   2014 oooooooooooooobaaaaaaaaaaaar"} | 
|   2016  |   2015  | 
|   2210 *} |   2209 *} | 
|   2211  |   2210  | 
|   2212 text {* the infrastructure of Syntax-pretty-term makes sure it is printed nicely  *} |   2211 text {* the infrastructure of Syntax-pretty-term makes sure it is printed nicely  *} | 
|   2213  |   2212  | 
|   2214  |   2213  | 
|   2215 ML {* Pretty.mark Markup.hilite (Pretty.str "foo") |> Pretty.string_of  |> writeln *} |   2214 ML {* Pretty.mark Markup.hilite (Pretty.str "foo") |> Pretty.string_of  |> tracing *} | 
|   2216 ML {* (Pretty.str "bar") |> Pretty.string_of |> writeln *} |   2215 ML {* (Pretty.str "bar") |> Pretty.string_of |> tracing *} | 
|   2217  |   2216  | 
|   2218  |   2217  | 
|   2219 ML {* Pretty.mark Markup.subgoal (Pretty.str "foo") |> Pretty.string_of  |> writeln *} |   2218 ML {* Pretty.mark Markup.subgoal (Pretty.str "foo") |> Pretty.string_of  |> tracing *} | 
|   2220 ML {* (Pretty.str "bar") |> Pretty.string_of |> writeln *} |   2219 ML {* (Pretty.str "bar") |> Pretty.string_of |> tracing *} | 
|   2221  |   2220  | 
|   2222 text {* |   2221 text {* | 
|   2223   Still to be done: |   2222   Still to be done: | 
|   2224  |   2223  | 
|   2225   What happens with big formulae? |   2224   What happens with big formulae? | 
|   2236 text {* |   2235 text {* | 
|   2237   printing into the goal buffer as part of the proof state |   2236   printing into the goal buffer as part of the proof state | 
|   2238 *} |   2237 *} | 
|   2239  |   2238  | 
|   2240  |   2239  | 
|   2241 ML {* Pretty.mark Markup.hilite (Pretty.str "foo") |> Pretty.string_of  |> writeln *} |   2240 ML {* Pretty.mark Markup.hilite (Pretty.str "foo") |> Pretty.string_of  |> tracing *} | 
|   2242 ML {* (Pretty.str "bar") |> Pretty.string_of |> writeln *} |   2241 ML {* (Pretty.str "bar") |> Pretty.string_of |> tracing *} | 
|   2243  |   2242  | 
|   2244 text {* writing into the goal buffer *} |   2243 text {* writing into the goal buffer *} | 
|   2245  |   2244  | 
|   2246 ML {* fun my_hook interactive state = |   2245 ML {* fun my_hook interactive state = | 
|   2247          (interactive ? Proof.goal_message (fn () => Pretty.str   |   2246          (interactive ? Proof.goal_message (fn () => Pretty.str   | 
|   2258  |   2257  | 
|   2259 ML {*Datatype.get_info @{theory} "List.list"*} |   2258 ML {*Datatype.get_info @{theory} "List.list"*} | 
|   2260  |   2259  | 
|   2261 section {* Name Space(TBD) *} |   2260 section {* Name Space(TBD) *} | 
|   2262  |   2261  | 
|         |   2262  | 
|   2263 end |   2263 end |