675 ##>> fold_map (translate_term ctxt algbr eqngr permissive some_thm o rpair NONE) ts |
675 ##>> fold_map (translate_term ctxt algbr eqngr permissive some_thm o rpair NONE) ts |
676 #>> (fn (t, ts) => t `$$ ts) |
676 #>> (fn (t, ts) => t `$$ ts) |
677 and translate_case ctxt algbr eqngr permissive some_thm (num_args, (t_pos, case_pats)) (c_ty, ts) = |
677 and translate_case ctxt algbr eqngr permissive some_thm (num_args, (t_pos, case_pats)) (c_ty, ts) = |
678 let |
678 let |
679 val thy = Proof_Context.theory_of ctxt; |
679 val thy = Proof_Context.theory_of ctxt; |
680 val undefineds = Code.undefineds thy; |
|
681 fun arg_types num_args ty = fst (chop num_args (binder_types ty)); |
680 fun arg_types num_args ty = fst (chop num_args (binder_types ty)); |
682 val tys = arg_types num_args (snd c_ty); |
681 val tys = arg_types num_args (snd c_ty); |
683 val ty = nth tys t_pos; |
682 val ty = nth tys t_pos; |
684 fun mk_constr NONE t = NONE |
683 fun mk_constr NONE t = NONE |
685 | mk_constr (SOME c) t = |
684 | mk_constr (SOME c) t = |
700 map_terms_bottom_up (fn IVar (SOME v) => |
699 map_terms_bottom_up (fn IVar (SOME v) => |
701 IVar (if member (op =) vs v then SOME v else NONE) | t => t) |
700 IVar (if member (op =) vs v then SOME v else NONE) | t => t) |
702 end; |
701 end; |
703 fun collapse_clause vs_map ts body = |
702 fun collapse_clause vs_map ts body = |
704 case body |
703 case body |
705 of IConst { sym = Constant c, ... } => if member (op =) undefineds c |
704 of IConst { sym = Constant c, ... } => if Code.is_undefined thy c |
706 then [] |
705 then [] |
707 else [(ts, body)] |
706 else [(ts, body)] |
708 | ICase { term = IVar (SOME v), clauses = clauses, ... } => |
707 | ICase { term = IVar (SOME v), clauses = clauses, ... } => |
709 if forall (fn (pat', body') => exists_var pat' v |
708 if forall (fn (pat', body') => exists_var pat' v |
710 orelse not (exists_var body' v)) clauses |
709 orelse not (exists_var body' v)) clauses |
740 ##>> translate_typ ctxt algbr eqngr permissive ty |
739 ##>> translate_typ ctxt algbr eqngr permissive ty |
741 ##>> fold_map (translate_term ctxt algbr eqngr permissive some_thm o rpair NONE) ts |
740 ##>> fold_map (translate_term ctxt algbr eqngr permissive some_thm o rpair NONE) ts |
742 #>> (fn (((t, constrs), ty), ts) => |
741 #>> (fn (((t, constrs), ty), ts) => |
743 casify constrs ty t ts) |
742 casify constrs ty t ts) |
744 end |
743 end |
745 and translate_app_case ctxt algbr eqngr permissive some_thm (case_scheme as (num_args, _)) ((c, ty), ts) = |
744 and translate_app_case ctxt algbr eqngr permissive some_thm (case_schema as (num_args, _)) ((c, ty), ts) = |
746 if length ts < num_args then |
745 if length ts < num_args then |
747 let |
746 let |
748 val k = length ts; |
747 val k = length ts; |
749 val tys = (take (num_args - k) o drop k o fst o strip_type) ty; |
748 val tys = (take (num_args - k) o drop k o fst o strip_type) ty; |
750 val names = (fold o fold_aterms) Term.declare_term_frees ts Name.context; |
749 val names = (fold o fold_aterms) Term.declare_term_frees ts Name.context; |
751 val vs = Name.invent_names names "a" tys; |
750 val vs = Name.invent_names names "a" tys; |
752 in |
751 in |
753 fold_map (translate_typ ctxt algbr eqngr permissive) tys |
752 fold_map (translate_typ ctxt algbr eqngr permissive) tys |
754 ##>> translate_case ctxt algbr eqngr permissive some_thm case_scheme ((c, ty), ts @ map Free vs) |
753 ##>> translate_case ctxt algbr eqngr permissive some_thm case_schema ((c, ty), ts @ map Free vs) |
755 #>> (fn (tys, t) => map2 (fn (v, _) => pair (SOME v)) vs tys `|==> t) |
754 #>> (fn (tys, t) => map2 (fn (v, _) => pair (SOME v)) vs tys `|==> t) |
756 end |
755 end |
757 else if length ts > num_args then |
756 else if length ts > num_args then |
758 translate_case ctxt algbr eqngr permissive some_thm case_scheme ((c, ty), take num_args ts) |
757 translate_case ctxt algbr eqngr permissive some_thm case_schema ((c, ty), take num_args ts) |
759 ##>> fold_map (translate_term ctxt algbr eqngr permissive some_thm o rpair NONE) (drop num_args ts) |
758 ##>> fold_map (translate_term ctxt algbr eqngr permissive some_thm o rpair NONE) (drop num_args ts) |
760 #>> (fn (t, ts) => t `$$ ts) |
759 #>> (fn (t, ts) => t `$$ ts) |
761 else |
760 else |
762 translate_case ctxt algbr eqngr permissive some_thm case_scheme ((c, ty), ts) |
761 translate_case ctxt algbr eqngr permissive some_thm case_schema ((c, ty), ts) |
763 and translate_app ctxt algbr eqngr permissive some_thm (c_ty_ts as ((c, _), _), some_abs) = |
762 and translate_app ctxt algbr eqngr permissive some_thm (c_ty_ts as ((c, _), _), some_abs) = |
764 case Code.get_case_scheme (Proof_Context.theory_of ctxt) c |
763 case Code.get_case_schema (Proof_Context.theory_of ctxt) c |
765 of SOME case_scheme => translate_app_case ctxt algbr eqngr permissive some_thm case_scheme c_ty_ts |
764 of SOME case_schema => translate_app_case ctxt algbr eqngr permissive some_thm case_schema c_ty_ts |
766 | NONE => translate_app_const ctxt algbr eqngr permissive some_thm (c_ty_ts, some_abs) |
765 | NONE => translate_app_const ctxt algbr eqngr permissive some_thm (c_ty_ts, some_abs) |
767 and translate_tyvar_sort ctxt (algbr as (proj_sort, _)) eqngr permissive (v, sort) = |
766 and translate_tyvar_sort ctxt (algbr as (proj_sort, _)) eqngr permissive (v, sort) = |
768 fold_map (ensure_class ctxt algbr eqngr permissive) (proj_sort sort) |
767 fold_map (ensure_class ctxt algbr eqngr permissive) (proj_sort sort) |
769 #>> (fn sort => (unprefix "'" v, sort)) |
768 #>> (fn sort => (unprefix "'" v, sort)) |
770 and translate_dicts ctxt algbr eqngr permissive some_thm (ty, sort) = |
769 and translate_dicts ctxt algbr eqngr permissive some_thm (ty, sort) = |