src/HOL/Tools/inductive_codegen.ML
changeset 24129 591394d9ee66
parent 23761 9cebbaccf8a2
child 24219 e558fe311376
equal deleted inserted replaced
24128:654b3a988f6a 24129:591394d9ee66
   323              let
   323              let
   324                val (args1, args2) = chop (length ms) args;
   324                val (args1, args2) = chop (length ms) args;
   325                val (gr', (ps, mode_id)) = foldl_map
   325                val (gr', (ps, mode_id)) = foldl_map
   326                    (compile_expr thy defs dep module true modes) (gr, ms ~~ args1) |>>>
   326                    (compile_expr thy defs dep module true modes) (gr, ms ~~ args1) |>>>
   327                  modename module name mode;
   327                  modename module name mode;
   328                val (gr'', ps') = foldl_map
   328                val (gr'', ps') = (case mode of
   329                  (invoke_codegen thy defs dep module true) (gr', args2)
   329                    ([], []) => (gr', [Pretty.str "()"])
       
   330                  | _ => foldl_map
       
   331                      (invoke_codegen thy defs dep module true) (gr', args2))
   330              in (gr', (if brack andalso not (null ps andalso null ps') then
   332              in (gr', (if brack andalso not (null ps andalso null ps') then
   331                single o parens o Pretty.block else I)
   333                single o parens o Pretty.block else I)
   332                  (List.concat (separate [Pretty.brk 1]
   334                  (List.concat (separate [Pretty.brk 1]
   333                    ([Pretty.str mode_id] :: ps @ map single ps'))))
   335                    ([Pretty.str mode_id] :: ps @ map single ps'))))
   334              end
   336              end
   396                  let
   398                  let
   397                    val (in_ts, out_ts''') = get_args js 1 us;
   399                    val (in_ts, out_ts''') = get_args js 1 us;
   398                    val (gr2, in_ps) = foldl_map
   400                    val (gr2, in_ps) = foldl_map
   399                      (invoke_codegen thy defs dep module true) (gr1, in_ts);
   401                      (invoke_codegen thy defs dep module true) (gr1, in_ts);
   400                    val (gr3, ps) = if is_ind t then
   402                    val (gr3, ps) = if is_ind t then
   401                        apsnd (fn ps => ps @ Pretty.brk 1 ::
   403                        apsnd (fn ps => ps @
       
   404                            (if null in_ps then [] else [Pretty.brk 1]) @
   402                            separate (Pretty.brk 1) in_ps)
   405                            separate (Pretty.brk 1) in_ps)
   403                          (compile_expr thy defs dep module false modes
   406                          (compile_expr thy defs dep module false modes
   404                            (gr2, (mode, t)))
   407                            (gr2, (mode, t)))
   405                      else
   408                      else
   406                        apsnd (fn p => [Pretty.str "Seq.of_list", Pretty.brk 1, p])
   409                        apsnd (fn p => [Pretty.str "Seq.of_list", Pretty.brk 1, p])
   440       modename module s mode
   443       modename module s mode
   441   in
   444   in
   442     ((gr', "and "), Pretty.block
   445     ((gr', "and "), Pretty.block
   443       ([Pretty.block (separate (Pretty.brk 1)
   446       ([Pretty.block (separate (Pretty.brk 1)
   444          (Pretty.str (prfx ^ mode_id) ::
   447          (Pretty.str (prfx ^ mode_id) ::
   445            map Pretty.str arg_vs @ xs) @
   448            map Pretty.str arg_vs @
       
   449            (case mode of ([], []) => [Pretty.str "()"] | _ => xs)) @
   446          [Pretty.str " ="]),
   450          [Pretty.str " ="]),
   447         Pretty.brk 1] @
   451         Pretty.brk 1] @
   448        List.concat (separate [Pretty.str " ++", Pretty.brk 1] (map single cl_ps))))
   452        List.concat (separate [Pretty.str " ++", Pretty.brk 1] (map single cl_ps))))
   449   end;
   453   end;
   450 
   454 
   489           mk_ind_def thy defs gr dep names (if_library thyname module)
   493           mk_ind_def thy defs gr dep names (if_library thyname module)
   490             [] (prep_intrs intrs) nparms))
   494             [] (prep_intrs intrs) nparms))
   491             (gr, foldr add_term_consts [] ts)
   495             (gr, foldr add_term_consts [] ts)
   492 
   496 
   493 and mk_ind_def thy defs gr dep names module modecs intrs nparms =
   497 and mk_ind_def thy defs gr dep names module modecs intrs nparms =
   494   add_edge (hd names, dep) gr handle Graph.UNDEF _ =>
   498   add_edge_acyclic (hd names, dep) gr handle
       
   499     Graph.CYCLES (xs :: _) =>
       
   500       error ("InductiveCodegen: illegal cyclic dependencies:\n" ^ commas xs)
       
   501   | Graph.UNDEF _ =>
   495     let
   502     let
   496       val _ $ u = Logic.strip_imp_concl (hd intrs);
   503       val _ $ u = Logic.strip_imp_concl (hd intrs);
   497       val args = List.take (snd (strip_comb u), nparms);
   504       val args = List.take (snd (strip_comb u), nparms);
   498       val arg_vs = List.concat (map term_vs args);
   505       val arg_vs = List.concat (map term_vs args);
   499 
   506