src/HOL/Tools/Function/function_common.ML
changeset 41846 b368a7aee46a
parent 41417 211dbd42f95d
child 42081 21697a5cb34a
equal deleted inserted replaced
41845:6611b9cef38b 41846:b368a7aee46a
    85 
    85 
    86 datatype function_result = FunctionResult of
    86 datatype function_result = FunctionResult of
    87  {fs: term list,
    87  {fs: term list,
    88   G: term,
    88   G: term,
    89   R: term,
    89   R: term,
    90 
       
    91   psimps : thm list,
    90   psimps : thm list,
    92   trsimps : thm list option,
       
    93 
       
    94   simple_pinducts : thm list,
    91   simple_pinducts : thm list,
    95   cases : thm,
    92   cases : thm,
    96   termination : thm,
    93   termination : thm,
    97   domintros : thm list option}
    94   domintros : thm list option}
    98 
    95 
   185 datatype function_opt
   182 datatype function_opt
   186   = Sequential
   183   = Sequential
   187   | Default of string
   184   | Default of string
   188   | DomIntros
   185   | DomIntros
   189   | No_Partials
   186   | No_Partials
   190   | Tailrec
       
   191 
   187 
   192 datatype function_config = FunctionConfig of
   188 datatype function_config = FunctionConfig of
   193  {sequential: bool,
   189  {sequential: bool,
   194   default: string option,
   190   default: string option,
   195   domintros: bool,
   191   domintros: bool,
   196   partials: bool,
   192   partials: bool}
   197   tailrec: bool}
   193 
   198 
   194 fun apply_opt Sequential (FunctionConfig {sequential, default, domintros, partials}) =
   199 fun apply_opt Sequential (FunctionConfig {sequential, default, domintros, partials, tailrec}) =
   195     FunctionConfig {sequential=true, default=default, domintros=domintros, partials=partials}
   200     FunctionConfig {sequential=true, default=default, domintros=domintros, partials=partials, tailrec=tailrec}
   196   | apply_opt (Default d) (FunctionConfig {sequential, default, domintros, partials}) =
   201   | apply_opt (Default d) (FunctionConfig {sequential, default, domintros, partials, tailrec}) =
   197     FunctionConfig {sequential=sequential, default=SOME d, domintros=domintros, partials=partials}
   202     FunctionConfig {sequential=sequential, default=SOME d, domintros=domintros, partials=partials, tailrec=tailrec}
   198   | apply_opt DomIntros (FunctionConfig {sequential, default, domintros, partials}) =
   203   | apply_opt DomIntros (FunctionConfig {sequential, default, domintros, partials, tailrec}) =
   199     FunctionConfig {sequential=sequential, default=default, domintros=true, partials=partials}
   204     FunctionConfig {sequential=sequential, default=default, domintros=true, partials=partials, tailrec=tailrec}
   200   | apply_opt No_Partials (FunctionConfig {sequential, default, domintros, partials}) =
   205   | apply_opt Tailrec (FunctionConfig {sequential, default, domintros, partials, tailrec}) =
   201     FunctionConfig {sequential=sequential, default=default, domintros=domintros, partials=false}
   206     FunctionConfig {sequential=sequential, default=default, domintros=domintros, partials=partials, tailrec=true}
       
   207   | apply_opt No_Partials (FunctionConfig {sequential, default, domintros, partials, tailrec}) =
       
   208     FunctionConfig {sequential=sequential, default=default, domintros=domintros, partials=false, tailrec=true}
       
   209 
   202 
   210 val default_config =
   203 val default_config =
   211   FunctionConfig { sequential=false, default=NONE,
   204   FunctionConfig { sequential=false, default=NONE,
   212     domintros=false, partials=true, tailrec=false }
   205     domintros=false, partials=true}
   213 
   206 
   214 
   207 
   215 (* Analyzing function equations *)
   208 (* Analyzing function equations *)
   216 
   209 
   217 fun split_def ctxt check_head geq =
   210 fun split_def ctxt check_head geq =
   342 local
   335 local
   343   val option_parser = Parse.group "option"
   336   val option_parser = Parse.group "option"
   344     ((Parse.reserved "sequential" >> K Sequential)
   337     ((Parse.reserved "sequential" >> K Sequential)
   345      || ((Parse.reserved "default" |-- Parse.term) >> Default)
   338      || ((Parse.reserved "default" |-- Parse.term) >> Default)
   346      || (Parse.reserved "domintros" >> K DomIntros)
   339      || (Parse.reserved "domintros" >> K DomIntros)
   347      || (Parse.reserved "no_partials" >> K No_Partials)
   340      || (Parse.reserved "no_partials" >> K No_Partials))
   348      || (Parse.reserved "tailrec" >> K Tailrec))
       
   349 
   341 
   350   fun config_parser default =
   342   fun config_parser default =
   351     (Scan.optional (Parse.$$$ "(" |-- Parse.!!! (Parse.list1 option_parser) --| Parse.$$$ ")") [])
   343     (Scan.optional (Parse.$$$ "(" |-- Parse.!!! (Parse.list1 option_parser) --| Parse.$$$ ")") [])
   352      >> (fn opts => fold apply_opt opts default)
   344      >> (fn opts => fold apply_opt opts default)
   353 in
   345 in