src/Tools/Code/code_thingol.ML
changeset 66189 23917e861eaa
parent 65483 1cb9fd58d55e
child 68482 cb84beb84ca9
equal deleted inserted replaced
66188:bd841164592f 66189:23917e861eaa
   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) =