src/HOL/Tools/function_package/fundef_datatype.ML
changeset 30790 350bb108406d
parent 30787 5b7a5a05c7aa
child 30906 3c7a76e79898
equal deleted inserted replaced
30789:b6f6948bdcf1 30790:350bb108406d
   250 
   250 
   251 
   251 
   252 fun sequential_preproc (config as FundefConfig {sequential, ...}) ctxt fixes spec =
   252 fun sequential_preproc (config as FundefConfig {sequential, ...}) ctxt fixes spec =
   253       if sequential then
   253       if sequential then
   254         let
   254         let
   255           val (nas, eqss) = split_list spec
   255           val (bnds, eqss) = split_list spec
   256                             
   256                             
   257           val eqs = map the_single eqss
   257           val eqs = map the_single eqss
   258                     
   258                     
   259           val feqs = eqs
   259           val feqs = eqs
   260                       |> tap (check_defs ctxt fixes) (* Standard checks *)
   260                       |> tap (check_defs ctxt fixes) (* Standard checks *)
   264 
   264 
   265           val spliteqs = warn_if_redundant ctxt feqs
   265           val spliteqs = warn_if_redundant ctxt feqs
   266                            (FundefSplit.split_all_equations ctxt compleqs)
   266                            (FundefSplit.split_all_equations ctxt compleqs)
   267 
   267 
   268           fun restore_spec thms =
   268           fun restore_spec thms =
   269               nas ~~ Library.take (length nas, Library.unflat spliteqs thms)
   269               bnds ~~ Library.take (length bnds, Library.unflat spliteqs thms)
   270               
   270               
   271           val spliteqs' = flat (Library.take (length nas, spliteqs))
   271           val spliteqs' = flat (Library.take (length bnds, spliteqs))
   272           val fnames = map (fst o fst) fixes
   272           val fnames = map (fst o fst) fixes
   273           val indices = map (fn eq => find_index (curry op = (fname_of eq)) fnames) spliteqs'
   273           val indices = map (fn eq => find_index (curry op = (fname_of eq)) fnames) spliteqs'
   274 
   274 
   275           fun sort xs = partition_list (fn i => fn (j,_) => i = j) 0 (length fnames - 1) (indices ~~ xs)
   275           fun sort xs = partition_list (fn i => fn (j,_) => i = j) 0 (length fnames - 1) (indices ~~ xs)
   276                                        |> map (map snd)
   276                                        |> map (map snd)
   277 
   277 
   278 
   278 
   279           val nas' = nas @ replicate (length spliteqs - length nas) ("",[])
   279           val bnds' = bnds @ replicate (length spliteqs - length bnds) Attrib.empty_binding
   280 
   280 
   281           (* using theorem names for case name currently disabled *)
   281           (* using theorem names for case name currently disabled *)
   282           val case_names = map_index (fn (i, ((n, _), es)) => mk_case_names i "" (length es)) 
   282           val case_names = map_index (fn (i, (_, es)) => mk_case_names i "" (length es)) 
   283                                      (nas' ~~ spliteqs)
   283                                      (bnds' ~~ spliteqs)
   284                            |> flat
   284                            |> flat
   285         in
   285         in
   286           (flat spliteqs, restore_spec, sort, case_names)
   286           (flat spliteqs, restore_spec, sort, case_names)
   287         end
   287         end
   288       else
   288       else