src/Pure/Tools/codegen_func.ML
author haftmann
Thu, 25 Jan 2007 09:32:48 +0100
changeset 22182 05ed4080cbd7
parent 22049 a995f9a8f669
child 22185 24bf0e403526
permissions -rw-r--r--
clarified code
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22023
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
     1
(*  Title:      Pure/Tools/codegen_func.ML
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
     2
    ID:         $Id$
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
     4
22033
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
     5
Handling defining equations ("func"s) for code generator framework.
22023
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
     6
*)
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
     7
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
     8
signature CODEGEN_FUNC =
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
     9
sig
22033
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    10
  val check_rew: thm -> thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    11
  val mk_rew: thm -> thm list
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    12
  val check_func: thm -> (CodegenConsts.const * thm) option
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    13
  val mk_func: thm -> (CodegenConsts.const * thm) list
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    14
  val dest_func: thm -> (string * typ) * term list
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    15
  val mk_head: thm -> CodegenConsts.const * thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    16
  val typ_func: thm -> typ
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    17
  val legacy_mk_func: thm -> (CodegenConsts.const * thm) list
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    18
  val expand_eta: int -> thm -> thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    19
  val rewrite_func: thm list -> thm -> thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    20
  val get_prim_def_funcs: theory -> string * typ list -> thm list
22023
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
    21
end;
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
    22
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
    23
structure CodegenFunc : CODEGEN_FUNC =
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
    24
struct
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
    25
22033
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    26
fun lift_thm_thy f thm = f (Thm.theory_of_thm thm) thm;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    27
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    28
fun bad_thm msg thm =
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    29
  error (msg ^ ": " ^ string_of_thm thm);
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    30
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    31
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    32
(* making rewrite theorems *)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    33
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    34
fun check_rew thm =
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    35
  let
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    36
    val thy = Thm.theory_of_thm thm;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    37
    val (lhs, rhs) = (Logic.dest_equals o Thm.prop_of) thm;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    38
    fun vars_of t = fold_aterms
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    39
     (fn Var (v, _) => insert (op =) v
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    40
       | Free _ => bad_thm "Illegal free variable in rewrite theorem" thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    41
       | _ => I) t [];
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    42
    fun tvars_of t = fold_term_types
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    43
     (fn _ => fold_atyps (fn TVar (v, _) => insert (op =) v
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    44
                          | TFree _ => bad_thm "Illegal free type variable in rewrite theorem" thm)) t [];
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    45
    val lhs_vs = vars_of lhs;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    46
    val rhs_vs = vars_of rhs;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    47
    val lhs_tvs = tvars_of lhs;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    48
    val rhs_tvs = tvars_of lhs;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    49
    val _ = if null (subtract (op =) lhs_vs rhs_vs)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    50
      then ()
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    51
      else bad_thm "Free variables on right hand side of rewrite theorems" thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    52
    val _ = if null (subtract (op =) lhs_tvs rhs_tvs)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    53
      then ()
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    54
      else bad_thm "Free type variables on right hand side of rewrite theorems" thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    55
  in thm end;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    56
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    57
fun mk_rew thm =
22023
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
    58
  let
22033
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    59
    val thy = Thm.theory_of_thm thm;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    60
    val thms = (#mk o #mk_rews o snd o MetaSimplifier.rep_ss o Simplifier.simpset_of) thy thm;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    61
  in
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    62
    map check_rew thms
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    63
  end;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    64
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    65
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    66
(* making function theorems *)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    67
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    68
val typ_func = lift_thm_thy (fn thy => snd o dest_Const o fst o strip_comb
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    69
  o fst o Logic.dest_equals o ObjectLogic.drop_judgment thy o Drule.plain_prop_of);
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    70
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    71
val dest_func = lift_thm_thy (fn thy => apfst dest_Const o strip_comb
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    72
  o fst o Logic.dest_equals o ObjectLogic.drop_judgment thy o Drule.plain_prop_of
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    73
  o Drule.fconv_rule Drule.beta_eta_conversion);
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    74
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    75
val mk_head = lift_thm_thy (fn thy => fn thm =>
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    76
  ((CodegenConsts.norm_of_typ thy o fst o dest_func) thm, thm));
22023
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
    77
22033
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    78
fun gen_check_func strict_functyp thm = case try dest_func thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    79
 of SOME (c_ty as (c, ty), args) =>
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    80
      let
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    81
        val thy = Thm.theory_of_thm thm;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    82
        val _ =
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    83
          if has_duplicates (op =)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    84
            ((fold o fold_aterms) (fn Var (v, _) => cons v
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    85
              | _ => I
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    86
            ) args [])
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    87
          then bad_thm "Repeated variables on left hand side of function equation" thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    88
          else ()
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    89
        fun no_abs (Abs _) = bad_thm "Abstraction on left hand side of function equation" thm 
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    90
          | no_abs (t1 $ t2) = (no_abs t1; no_abs t2)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    91
          | no_abs _ = ();
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    92
        val _ = map no_abs args;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    93
        val is_classop = (is_some o AxClass.class_of_param thy) c;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    94
        val const = CodegenConsts.norm_of_typ thy c_ty;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    95
        val ty_decl = CodegenConsts.disc_typ_of_const thy
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    96
          (snd o CodegenConsts.typ_of_inst thy) const;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    97
        val string_of_typ = setmp show_sorts true (Sign.string_of_typ thy);
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    98
        val error_warning = if strict_functyp
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
    99
          then error
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   100
          else warning #> K NONE
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   101
      in if Sign.typ_equiv thy (ty_decl, ty)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   102
        then SOME (const, thm)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   103
        else (if is_classop
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   104
            then error_warning
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   105
          else if Sign.typ_equiv thy (Type.strip_sorts ty_decl, Type.strip_sorts ty)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   106
            then warning #> (K o SOME) (const, thm)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   107
          else error_warning)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   108
          ("Type\n" ^ string_of_typ ty
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   109
           ^ "\nof function theorem\n"
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   110
           ^ string_of_thm thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   111
           ^ "\nis strictly less general than declared function type\n"
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   112
           ^ string_of_typ ty_decl)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   113
      end
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   114
  | NONE => bad_thm "Not a function equation" thm;
22023
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   115
22033
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   116
val check_func = gen_check_func true;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   117
val legacy_check_func = gen_check_func false;
22023
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   118
22033
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   119
fun gen_mk_func check_func = map_filter check_func o mk_rew;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   120
val mk_func = gen_mk_func check_func;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   121
val legacy_mk_func = gen_mk_func legacy_check_func;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   122
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   123
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   124
(* utilities *)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   125
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   126
fun expand_eta k thm =
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   127
  let
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   128
    val thy = Thm.theory_of_thm thm;
22023
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   129
    val (lhs, rhs) = (Logic.dest_equals o Drule.plain_prop_of) thm;
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   130
    val (head, args) = strip_comb lhs;
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   131
    val l = if k = ~1
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   132
      then (length o fst o strip_abs) rhs
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   133
      else Int.max (0, k - length args);
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   134
    val used = Name.make_context (map (fst o fst) (Term.add_vars lhs []));
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   135
    fun get_name _ 0 used = ([], used)
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   136
      | get_name (Abs (v, ty, t)) k used =
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   137
          used
22033
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   138
          |> Name.variants [v]
22023
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   139
          ||>> get_name t (k - 1)
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   140
          |>> (fn ([v'], vs') => (v', ty) :: vs')
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   141
      | get_name t k used = 
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   142
          let
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   143
            val (tys, _) = (strip_type o fastype_of) t
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   144
          in case tys
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   145
           of [] => raise TERM ("expand_eta", [t])
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   146
            | ty :: _ =>
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   147
                used
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   148
                |> Name.variants [""]
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   149
                |-> (fn [v] => get_name (t $ Var ((v, 0), ty)) (k - 1)
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   150
                #>> (fn vs' => (v, ty) :: vs'))
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   151
          end;
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   152
    val (vs, _) = get_name rhs l used;
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   153
    val vs_refl = map (fn (v, ty) => Thm.reflexive (Thm.cterm_of thy (Var ((v, 0), ty)))) vs;
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   154
  in
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   155
    fold (fn refl => fn thm => Thm.combination thm refl) vs_refl thm
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   156
  end;
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   157
22033
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   158
fun get_prim_def_funcs thy c =
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   159
  let
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   160
    fun constrain thm0 thm = case AxClass.class_of_param thy (fst c)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   161
     of SOME _ =>
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   162
          let
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   163
            val ty_decl = CodegenConsts.disc_typ_of_classop thy c;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   164
            val max = maxidx_of_typ ty_decl + 1;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   165
            val thm = Thm.incr_indexes max thm;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   166
            val ty = typ_func thm;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   167
            val (env, _) = Sign.typ_unify thy (ty_decl, ty) (Vartab.empty, max);
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   168
            val instT = Vartab.fold (fn (x_i, (sort, ty)) =>
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   169
              cons (Thm.ctyp_of thy (TVar (x_i, sort)), Thm.ctyp_of thy ty)) env [];
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   170
          in Thm.instantiate (instT, []) thm end
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   171
      | NONE => thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   172
  in case CodegenConsts.find_def thy c
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   173
   of SOME ((_, thm), _) =>
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   174
        thm
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   175
        |> Thm.transfer thy
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   176
        |> try (map snd o mk_func)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   177
        |> these
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   178
        |> map (constrain thm)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   179
        |> map (expand_eta ~1)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   180
    | NONE => []
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   181
  end;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   182
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   183
fun rewrite_func rewrites thm =
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   184
  let
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   185
    val rewrite = MetaSimplifier.rewrite false rewrites;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   186
    val (ct_eq, [ct_lhs, ct_rhs]) = (Drule.strip_comb o Thm.cprop_of) thm;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   187
    val Const ("==", _) = Thm.term_of ct_eq;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   188
    val (ct_f, ct_args) = Drule.strip_comb ct_lhs;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   189
    val rhs' = rewrite ct_rhs;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   190
    val args' = map rewrite ct_args;
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   191
    val lhs' = Thm.symmetric (fold (fn th1 => fn th2 => Thm.combination th2 th1)
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   192
      args' (Thm.reflexive ct_f));
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   193
  in
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   194
    Thm.transitive (Thm.transitive lhs' thm) rhs'
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   195
  end handle Bind => raise ERROR "rewrite_func"
8e19bad4125f moved a lot to codegen_func.ML
haftmann
parents: 22023
diff changeset
   196
22023
487b79b95a20 added codegen_func.ML
haftmann
parents:
diff changeset
   197
end;