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, |