src/HOL/Tools/inductive_codegen.ML
changeset 12565 9df4b3934487
parent 12562 323ce5a89695
child 13038 e968745986f1
equal deleted inserted replaced
12564:226873bffa3a 12565:9df4b3934487
   480 fun mk_ind_call thy gr dep t u is_query = (case head_of u of
   480 fun mk_ind_call thy gr dep t u is_query = (case head_of u of
   481   Const (s, _) => (case get_clauses thy s of
   481   Const (s, _) => (case get_clauses thy s of
   482        None => None
   482        None => None
   483      | Some (names, intrs) =>
   483      | Some (names, intrs) =>
   484          let
   484          let
   485           fun mk_mode (((ts, mode), i), Var _) = ((ts, mode), i+1)
   485           fun mk_mode (((ts, mode), i), Const ("dummy_pattern", _)) =
   486             | mk_mode (((ts, mode), i), Free _) = ((ts, mode), i+1)
   486                 ((ts, mode), i+1)
   487             | mk_mode (((ts, mode), i), t) = ((ts @ [t], mode @ [i]), i+1);
   487             | mk_mode (((ts, mode), i), t) = ((ts @ [t], mode @ [i]), i+1);
   488 
   488 
   489            val gr1 = mk_extra_defs thy
   489            val gr1 = mk_extra_defs thy
   490              (mk_ind_def thy gr dep names intrs) dep names [u];
   490              (mk_ind_def thy gr dep names intrs) dep names [u];
   491            val (modes, factors) = lookup_modes gr1 dep;
   491            val (modes, factors) = lookup_modes gr1 dep;
   506              (ps @ [Pretty.brk 1, mk_tuple in_ps]))
   506              (ps @ [Pretty.brk 1, mk_tuple in_ps]))
   507          end)
   507          end)
   508   | _ => None);
   508   | _ => None);
   509 
   509 
   510 fun inductive_codegen thy gr dep brack (Const ("op :", _) $ t $ u) =
   510 fun inductive_codegen thy gr dep brack (Const ("op :", _) $ t $ u) =
   511       (case mk_ind_call thy gr dep t u false of
   511       ((case mk_ind_call thy gr dep (Term.no_dummy_patterns t) u false of
   512          None => None
   512          None => None
   513        | Some (gr', call_p) => Some (gr', (if brack then parens else I)
   513        | Some (gr', call_p) => Some (gr', (if brack then parens else I)
   514            (Pretty.block [Pretty.str "?! (", call_p, Pretty.str ")"])))
   514            (Pretty.block [Pretty.str "?! (", call_p, Pretty.str ")"])))
   515   | inductive_codegen thy gr dep brack (Free ("query", _) $ (Const ("op :", _) $ t $ u)) =
   515         handle TERM _ => mk_ind_call thy gr dep t u true)
   516       mk_ind_call thy gr dep t u true
       
   517   | inductive_codegen thy gr dep brack _ = None;
   516   | inductive_codegen thy gr dep brack _ = None;
   518 
   517 
   519 val setup =
   518 val setup =
   520   [add_codegen "inductive" inductive_codegen,
   519   [add_codegen "inductive" inductive_codegen,
   521    CodegenData.init,
   520    CodegenData.init,