src/Pure/Tools/codegen_theorems.ML
author wenzelm
Wed, 26 Jul 2006 19:37:41 +0200
changeset 20218 be3bfb0699ba
parent 20203 914433927687
child 20353 d73e49780ef2
permissions -rw-r--r--
Variable.import(T): result includes fixed types/terms;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
     1
(*  Title:      Pure/Tools/codegen_theorems.ML
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     2
    ID:         $Id$
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     4
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     5
Theorems used for code generation.
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     6
*)
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     7
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     8
signature CODEGEN_THEOREMS =
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     9
sig
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
    10
  val add_notify: ((string * typ) list option -> theory -> theory) -> theory -> theory;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    11
  val add_preproc: (theory -> thm list -> thm list) -> theory -> theory;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    12
  val add_fun_extr: (theory -> string * typ -> thm list) -> theory -> theory;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    13
  val add_datatype_extr: (theory -> string
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    14
    -> (((string * sort) list * (string * typ list) list) * tactic) option)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    15
    -> theory -> theory;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    16
  val add_fun: thm -> theory -> theory;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    17
  val del_fun: thm -> theory -> theory;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    18
  val add_unfold: thm -> theory -> theory;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    19
  val del_unfold: thm -> theory -> theory;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    20
  val purge_defs: string * typ -> theory -> theory;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    21
  val notify_dirty: theory -> theory;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    22
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
    23
  val extr_typ: theory -> thm -> typ;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    24
  val common_typ: theory -> (thm -> typ) -> thm list -> thm list;
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
    25
  val preprocess: theory -> thm list -> thm list;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    26
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
    27
  val get_funs: theory -> string * typ -> thm list;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    28
  val get_datatypes: theory -> string
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    29
    -> (((string * sort) list * (string * typ list) list) * thm list) option;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    30
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    31
  type thmtab;
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
    32
  val mk_thmtab: (string * typ) list -> theory -> thmtab * theory;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
    33
  val norm_typ: theory -> string * typ -> string * typ;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
    34
  val get_sortalgebra: thmtab -> Sorts.algebra;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
    35
  val get_dtyp_of_cons: thmtab -> string * typ -> string option;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
    36
  val get_dtyp_spec: thmtab -> string
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
    37
    -> ((string * sort) list * (string * typ list) list) option;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
    38
  val get_fun_thms: thmtab -> string * typ -> thm list;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
    39
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    40
  val print_thms: theory -> unit;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    41
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    42
  val init_obj: (thm * thm) * (thm * thm) -> theory -> theory;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    43
  val debug: bool ref;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    44
  val debug_msg: ('a -> string) -> 'a -> 'a;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    45
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    46
end;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    47
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    48
structure CodegenTheorems: CODEGEN_THEOREMS =
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    49
struct
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    50
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    51
(** preliminaries **)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    52
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    53
(* diagnostics *)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    54
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    55
val debug = ref false;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    56
fun debug_msg f x = (if !debug then Output.debug (f x) else (); x);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    57
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    58
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    59
(* auxiliary *)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    60
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    61
fun getf_first [] _ = NONE
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    62
  | getf_first (f::fs) x = case f x
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    63
     of NONE => getf_first fs x
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    64
      | y as SOME x => y;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    65
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    66
fun getf_first_list [] x = []
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    67
  | getf_first_list (f::fs) x = case f x
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    68
     of [] => getf_first_list fs x
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    69
      | xs => xs;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    70
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    71
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    72
(* object logic setup *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    73
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    74
structure CodegenTheoremsSetup = TheoryDataFun
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    75
(struct
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
    76
  val name = "Pure/codegen_theorems_setup";
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    77
  type T = ((string * thm) * ((string * string) * (string * string))) option;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    78
  val empty = NONE;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    79
  val copy = I;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    80
  val extend = I;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    81
  fun merge pp = merge_opt (eq_pair (eq_pair (op =) eq_thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    82
    (eq_pair (eq_pair (op =) (op =)) (eq_pair (op =) (op =)))) : T * T -> T;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    83
  fun print thy data = ();
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    84
end);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    85
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    86
val _ = Context.add_setup CodegenTheoremsSetup.init;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    87
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    88
fun init_obj ((TrueI, FalseE), (conjI, atomize_eq)) thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    89
  case CodegenTheoremsSetup.get thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    90
   of SOME _ => error "code generator already set up for object logic"
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
    91
    | NONE =>
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    92
        let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    93
          fun strip_implies t = (Logic.strip_imp_prems t, Logic.strip_imp_concl t);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    94
          fun dest_TrueI thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    95
            Drule.plain_prop_of thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    96
            |> ObjectLogic.drop_judgment thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    97
            |> Term.dest_Const
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    98
            |> apsnd (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    99
                  Term.dest_Type
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   100
                  #> fst
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   101
              );
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   102
          fun dest_FalseE thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   103
            Drule.plain_prop_of thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   104
            |> Logic.dest_implies
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   105
            |> apsnd (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   106
                 ObjectLogic.drop_judgment thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   107
                 #> Term.dest_Var
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   108
               )
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   109
            |> fst
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   110
            |> ObjectLogic.drop_judgment thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   111
            |> Term.dest_Const
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   112
            |> fst;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   113
          fun dest_conjI thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   114
            Drule.plain_prop_of thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   115
            |> strip_implies
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   116
            |> apfst (map (ObjectLogic.drop_judgment thy #> Term.dest_Var))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   117
            |> apsnd (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   118
                 ObjectLogic.drop_judgment thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   119
                 #> Term.strip_comb
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   120
                 #> apsnd (map Term.dest_Var)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   121
                 #> apfst Term.dest_Const
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   122
               )
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   123
            |> (fn (v1, ((conj, _), v2)) => if v1 = v2 then conj else error "wrong premise")
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   124
          fun dest_atomize_eq thm=
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   125
            Drule.plain_prop_of thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   126
            |> Logic.dest_equals
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   127
            |> apfst (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   128
                 ObjectLogic.drop_judgment thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   129
                 #> Term.strip_comb
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   130
                 #> apsnd (map Term.dest_Var)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   131
                 #> apfst Term.dest_Const
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   132
               )
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   133
            |> apsnd (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   134
                 Logic.dest_equals
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   135
                 #> apfst Term.dest_Var
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   136
                 #> apsnd Term.dest_Var
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   137
               )
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   138
            |> (fn (((eq, _), v2), (v1a as (_, TVar (_, sort)), v1b)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   139
                 if [v1a, v1b] = v2 andalso sort = Sign.defaultS thy then eq else error "wrong premise")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   140
        in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   141
          ((dest_TrueI TrueI, [dest_FalseE FalseE, dest_conjI conjI, dest_atomize_eq atomize_eq])
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   142
          handle _ => error "bad code generator setup")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   143
          |> (fn ((tr, b), [fl, con, eq]) => CodegenTheoremsSetup.put
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   144
               (SOME ((b, atomize_eq), ((tr, fl), (con, eq)))) thy)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   145
        end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   146
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   147
fun get_obj thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   148
  case CodegenTheoremsSetup.get thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   149
   of SOME ((b, atomize), x) => ((Type (b, []), atomize) ,x)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   150
    | NONE => error "no object logic setup for code theorems";
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   151
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   152
fun mk_true thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   153
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   154
    val ((b, _), ((tr, fl), (con, eq))) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   155
  in Const (tr, b) end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   156
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   157
fun mk_false thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   158
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   159
    val ((b, _), ((tr, fl), (con, eq))) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   160
  in Const (fl, b) end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   161
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   162
fun mk_obj_conj thy (x, y) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   163
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   164
    val ((b, _), ((tr, fl), (con, eq))) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   165
  in Const (con, b --> b --> b) $ x $ y end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   166
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   167
fun mk_obj_eq thy (x, y) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   168
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   169
    val ((b, _), ((tr, fl), (con, eq))) = get_obj thy;
20105
454f4be984b7 adaptions in codegen
haftmann
parents: 20076
diff changeset
   170
  in Const (eq, fastype_of x --> fastype_of y --> b) $ x $ y end;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   171
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   172
fun is_obj_eq thy c =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   173
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   174
    val ((b, _), ((tr, fl), (con, eq))) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   175
  in c = eq end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   176
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   177
fun mk_func thy ((x, y), rhs) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   178
  Logic.mk_equals (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   179
    (mk_obj_eq thy (x, y)),
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   180
    rhs
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   181
  );
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   182
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   183
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   184
(* theorem purification *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   185
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   186
fun err_thm msg thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   187
  error (msg ^ ": " ^ string_of_thm thm);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   188
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   189
fun abs_norm thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   190
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   191
    fun expvars t =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   192
      let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   193
        val lhs = (fst o Logic.dest_equals) t;
20105
454f4be984b7 adaptions in codegen
haftmann
parents: 20076
diff changeset
   194
        val tys = (fst o strip_type o fastype_of) lhs;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   195
        val used = fold_aterms (fn Var ((v, _), _) => insert (op =) v | _ => I) lhs [];
20076
def4ad161528 Name.invent_list;
wenzelm
parents: 20046
diff changeset
   196
        val vs = Name.invent_list used "x" (length tys);
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   197
      in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   198
        map2 (fn v => fn ty => Var ((v, 0), ty)) vs tys
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   199
      end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   200
    fun expand ct thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   201
      Thm.combination thm (Thm.reflexive ct);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   202
    fun beta_norm thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   203
      thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   204
      |> prop_of
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   205
      |> Logic.dest_equals
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   206
      |> fst
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   207
      |> cterm_of thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   208
      |> Thm.beta_conversion true
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   209
      |> Thm.symmetric
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   210
      |> (fn thm' => Thm.transitive thm' thm);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   211
  in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   212
    thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   213
    |> fold (expand o cterm_of thy) ((expvars o prop_of) thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   214
    |> beta_norm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   215
  end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   216
20203
914433927687 avoid structure Char;
wenzelm
parents: 20192
diff changeset
   217
val lower_name = translate_string Symbol.to_ascii_lower o Symbol.alphanum;
914433927687 avoid structure Char;
wenzelm
parents: 20192
diff changeset
   218
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   219
fun canonical_tvars thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   220
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   221
    fun mk_inst (v_i as (v, i), (v', sort)) (s as (maxidx, set, acc)) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   222
      if v = v' orelse member (op =) set v then s
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   223
        else let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   224
          val ty = TVar (v_i, sort)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   225
        in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   226
          (maxidx + 1, v :: set,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   227
            (ctyp_of thy ty, ctyp_of thy (TVar ((v', maxidx), sort))) :: acc)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   228
        end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   229
    fun tvars_of thm = (fold_types o fold_atyps)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   230
      (fn TVar (v_i as (v, i), sort) => cons (v_i, (lower_name v, sort))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   231
        | _ => I) (prop_of thm) [];
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   232
    val maxidx = Thm.maxidx_of thm + 1;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   233
    val (_, _, inst) = fold mk_inst (tvars_of thm) (maxidx + 1, [], []);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   234
  in Thm.instantiate (inst, []) thm end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   235
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   236
fun canonical_vars thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   237
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   238
    fun mk_inst (v_i as (v, i), (v', ty)) (s as (maxidx, set, acc)) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   239
      if v = v' orelse member (op =) set v then s
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   240
        else let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   241
          val t = if i = ~1 then Free (v, ty) else Var (v_i, ty)
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   242
        in
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   243
          (maxidx + 1,  v :: set,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   244
            (cterm_of thy t, cterm_of thy (Var ((v', maxidx), ty))) :: acc)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   245
        end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   246
    fun vars_of thm = fold_aterms
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   247
      (fn Var (v_i as (v, i), ty) => cons (v_i, (lower_name v, ty))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   248
        | _ => I) (prop_of thm) [];
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   249
    val maxidx = Thm.maxidx_of thm + 1;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   250
    val (_, _, inst) = fold mk_inst (vars_of thm) (maxidx + 1, [], []);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   251
  in Thm.instantiate ([], inst) thm end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   252
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   253
fun drop_redundant thy eqs =
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   254
  let
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   255
    val matches = curry (Pattern.matches thy o
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   256
      pairself (fst o Logic.dest_equals o prop_of))
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   257
    fun drop eqs [] = eqs
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   258
      | drop eqs (eq::eqs') =
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   259
          drop (eq::eqs) (filter_out (matches eq) eqs')
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   260
  in drop [] eqs end;
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   261
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   262
fun make_eq thy =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   263
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   264
    val ((_, atomize), _) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   265
  in rewrite_rule [atomize] end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   266
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   267
fun dest_eq thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   268
  case try (make_eq thy #> Drule.plain_prop_of
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   269
   #> ObjectLogic.drop_judgment thy #> Logic.dest_equals) thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   270
   of SOME eq => (eq, thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   271
    | NONE => err_thm "not an equation" thm;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   272
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   273
fun dest_fun thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   274
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   275
    fun dest_fun' ((lhs, _), thm) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   276
      case try (dest_Const o fst o strip_comb) lhs
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   277
       of SOME (c, ty) => (c, (ty, thm))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   278
        | NONE => err_thm "not a function equation" thm;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   279
  in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   280
    thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   281
    |> dest_eq thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   282
    |> dest_fun'
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   283
  end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   284
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   285
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   286
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   287
(** theory data **)
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   288
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   289
(* data structures *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   290
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   291
fun merge' eq (xys as (xs, ys)) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   292
  if eq_list eq (xs, ys) then (false, xs) else (true, merge eq xys);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   293
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   294
fun alist_merge' eq_key eq (xys as (xs, ys)) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   295
  if eq_list (eq_pair eq_key eq) (xs, ys) then (false, xs) else (true, AList.merge eq_key eq xys);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   296
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   297
fun list_symtab_join' eq (xyt as (xt, yt)) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   298
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   299
    val xc = Symtab.keys xt;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   300
    val yc = Symtab.keys yt;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   301
    val zc = filter (member (op =) yc) xc;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   302
    val wc = subtract (op =) zc xc @ subtract (op =) zc yc;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   303
    fun same_thms c = if eq_list eq_thm ((the o Symtab.lookup xt) c, (the o Symtab.lookup yt) c)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   304
      then NONE else SOME c;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   305
  in (wc @ map_filter same_thms zc, Symtab.join (K (merge eq)) xyt) end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   306
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   307
datatype notify = Notify of (serial * ((string * typ) list option -> theory -> theory)) list;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   308
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   309
val mk_notify = Notify;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   310
fun map_notify f (Notify notify) = mk_notify (f notify);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   311
fun merge_notify pp (Notify notify1, Notify notify2) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   312
  mk_notify (AList.merge (op =) (K true) (notify1, notify2));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   313
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   314
datatype preproc = Preproc of {
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   315
  preprocs: (serial * (theory -> thm list -> thm list)) list,
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   316
  unfolds: thm list
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   317
};
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   318
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   319
fun mk_preproc (preprocs, unfolds) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   320
  Preproc { preprocs = preprocs, unfolds = unfolds };
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   321
fun map_preproc f (Preproc { preprocs, unfolds }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   322
  mk_preproc (f (preprocs, unfolds));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   323
fun merge_preproc _ (Preproc { preprocs = preprocs1, unfolds = unfolds1 },
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   324
  Preproc { preprocs = preprocs2, unfolds = unfolds2 }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   325
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   326
      val (dirty1, preprocs) = alist_merge' (op =) (K true) (preprocs1, preprocs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   327
      val (dirty2, unfolds) = merge' eq_thm (unfolds1, unfolds2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   328
    in (dirty1 orelse dirty2, mk_preproc (preprocs, unfolds)) end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   329
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   330
datatype extrs = Extrs of {
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   331
  funs: (serial * (theory -> string * typ -> thm list)) list,
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   332
  datatypes: (serial * (theory -> string -> (((string * sort) list * (string * typ list) list) * tactic) option)) list
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   333
};
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   334
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   335
fun mk_extrs (funs, datatypes) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   336
  Extrs { funs = funs, datatypes = datatypes };
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   337
fun map_extrs f (Extrs { funs, datatypes }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   338
  mk_extrs (f (funs, datatypes));
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   339
fun merge_extrs _ (Extrs { funs = funs1, datatypes = datatypes1 },
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   340
  Extrs { funs = funs2, datatypes = datatypes2 }) =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   341
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   342
      val (dirty1, funs) = alist_merge' (op =) (K true) (funs1, funs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   343
      val (dirty2, datatypes) = alist_merge' (op =) (K true) (datatypes1, datatypes2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   344
    in (dirty1 orelse dirty2, mk_extrs (funs, datatypes)) end;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   345
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   346
datatype funthms = Funthms of {
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   347
  dirty: string list,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   348
  funs: thm list Symtab.table
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   349
};
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   350
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   351
fun mk_funthms (dirty, funs) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   352
  Funthms { dirty = dirty, funs = funs };
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   353
fun map_funthms f (Funthms { dirty, funs }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   354
  mk_funthms (f (dirty, funs));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   355
fun merge_funthms _ (Funthms { dirty = dirty1, funs = funs1 },
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   356
  Funthms { dirty = dirty2, funs = funs2 }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   357
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   358
      val (dirty3, funs) = list_symtab_join' eq_thm (funs1, funs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   359
    in mk_funthms (merge (op =) (merge (op =) (dirty1, dirty2), dirty3), funs) end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   360
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   361
datatype T = T of {
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   362
  dirty: bool,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   363
  notify: notify,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   364
  preproc: preproc,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   365
  extrs: extrs,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   366
  funthms: funthms
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   367
};
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   368
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   369
fun mk_T ((dirty, notify), (preproc, (extrs, funthms))) =
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   370
  T { dirty = dirty, notify = notify, preproc= preproc, extrs = extrs, funthms = funthms };
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   371
fun map_T f (T { dirty, notify, preproc, extrs, funthms }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   372
  mk_T (f ((dirty, notify), (preproc, (extrs, funthms))));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   373
fun merge_T pp (T { dirty = dirty1, notify = notify1, preproc = preproc1, extrs = extrs1, funthms = funthms1 },
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   374
  T { dirty = dirty2, notify = notify2, preproc = preproc2, extrs = extrs2, funthms = funthms2 }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   375
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   376
      val (dirty3, preproc) = merge_preproc pp (preproc1, preproc2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   377
      val (dirty4, extrs) = merge_extrs pp (extrs1, extrs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   378
    in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   379
      mk_T ((dirty1 orelse dirty2 orelse dirty3 orelse dirty4, merge_notify pp (notify1, notify2)),
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   380
        (preproc, (extrs, merge_funthms pp (funthms1, funthms2))))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   381
    end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   382
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   383
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   384
(* setup *)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   385
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   386
structure CodegenTheoremsData = TheoryDataFun
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   387
(struct
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   388
  val name = "Pure/codegen_theorems_data";
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   389
  type T = T;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   390
  val empty = mk_T ((false, mk_notify []), (mk_preproc ([], []),
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   391
    (mk_extrs ([], []), mk_funthms ([], Symtab.empty))));
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   392
  val copy = I;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   393
  val extend = I;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   394
  val merge = merge_T;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   395
  fun print (thy : theory) (data : T) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   396
    let
19436
3f5835aac3ce ignore sort constraints of consts declarations;
wenzelm
parents: 19341
diff changeset
   397
      val pretty_thm = ProofContext.pretty_thm (ProofContext.init thy);
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   398
      val funthms = (fn T { funthms, ... } => funthms) data;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   399
      val funs = (Symtab.dest o (fn Funthms { funs, ... } => funs)) funthms;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   400
      val preproc = (fn T { preproc, ... } => preproc) data;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   401
      val unfolds = (fn Preproc { unfolds, ... } => unfolds) preproc;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   402
    in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   403
      (Pretty.writeln o Pretty.block o Pretty.fbreaks) ([
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   404
        Pretty.str "code generation theorems:",
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   405
        Pretty.str "function theorems:" ] @
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   406
        (*Pretty.fbreaks ( *)
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   407
          map (fn (c, thms) =>
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   408
            (Pretty.block o Pretty.fbreaks) (
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   409
              Pretty.str c :: map pretty_thm (rev thms)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   410
            )
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   411
          ) funs
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   412
        (*) *) @ [
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   413
        Pretty.fbrk,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   414
        Pretty.block (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   415
          Pretty.str "unfolding theorems:"
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   416
          :: Pretty.fbrk
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   417
          :: (Pretty.fbreaks o map pretty_thm) unfolds
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   418
      )])
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   419
    end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   420
end);
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   421
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   422
val _ = Context.add_setup CodegenTheoremsData.init;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   423
val print_thms = CodegenTheoremsData.print;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   424
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   425
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   426
(* accessors *)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   427
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   428
local
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   429
  val the_preproc = (fn T { preproc = Preproc preproc, ... } => preproc) o CodegenTheoremsData.get;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   430
  val the_extrs = (fn T { extrs = Extrs extrs, ... } => extrs) o CodegenTheoremsData.get;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   431
  val the_funthms = (fn T { funthms = Funthms funthms, ... } => funthms) o CodegenTheoremsData.get;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   432
in
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   433
  val is_dirty = (fn T { dirty = dirty, ... } => dirty) o CodegenTheoremsData.get;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   434
  val the_dirty_consts = (fn { dirty = dirty, ... } => dirty) o the_funthms;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   435
  val the_notify = (fn T { notify = Notify notify, ... } => map snd notify) o CodegenTheoremsData.get;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   436
  val the_preprocs = (fn { preprocs, ... } => map snd preprocs) o the_preproc;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   437
  val the_unfolds = (fn { unfolds, ... } => unfolds) o the_preproc;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   438
  val the_funs_extrs = (fn { funs, ... } => map snd funs) o the_extrs;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   439
  val the_datatypes_extrs = (fn { datatypes, ... } => map snd datatypes) o the_extrs;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   440
  val the_funs = (fn { funs, ... } => funs) o the_funthms;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   441
end (*local*);
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   442
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   443
val map_data = CodegenTheoremsData.map o map_T;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   444
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   445
(* notifiers *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   446
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   447
fun all_typs thy c =
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   448
  map (pair c) (Sign.the_const_type thy c :: (map (#lhs) o Theory.definitions_of thy) c);
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   449
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   450
fun add_notify f =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   451
  map_data (fn ((dirty, notify), x) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   452
    ((dirty, notify |> map_notify (cons (serial (), f))), x));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   453
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   454
fun get_reset_dirty thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   455
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   456
    val dirty = is_dirty thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   457
    val dirty_const = if dirty then [] else the_dirty_consts thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   458
  in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   459
    thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   460
    |> map_data (fn ((_, notify), (procs, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   461
         ((false, notify), (procs, (extrs, funthms |> map_funthms (fn (_, funs) => ([], funs))))))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   462
    |> pair (dirty, dirty_const)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   463
  end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   464
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   465
fun notify_all c thy =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   466
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   467
  |> get_reset_dirty
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   468
  |-> (fn (true, _) => fold (fn f => f NONE) (the_notify thy)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   469
        | (false, cs) => let val cs' = case c of NONE => cs | SOME c => insert (op =) c cs
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   470
            in fold (fn f => f (SOME (maps (all_typs thy) cs'))) (the_notify thy) end);
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   471
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   472
fun notify_dirty thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   473
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   474
  |> get_reset_dirty
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   475
  |-> (fn (true, _) => fold (fn f => f NONE) (the_notify thy)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   476
        | (false, cs) => fold (fn f => f (SOME (maps (all_typs thy) cs))) (the_notify thy));
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   477
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   478
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   479
(* modifiers *)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   480
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   481
fun add_preproc f =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   482
  map_data (fn (x, (preproc, y)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   483
    (x, (preproc |> map_preproc (fn (preprocs, unfolds) => ((serial (), f) :: preprocs, unfolds)), y)))
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   484
  #> notify_all NONE;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   485
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   486
fun add_fun_extr f =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   487
  map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   488
    (x, (preproc, (extrs |> map_extrs (fn (funs, datatypes) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   489
      ((serial (), f) :: funs, datatypes)), funthms))))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   490
  #> notify_all NONE;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   491
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   492
fun add_datatype_extr f =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   493
  map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   494
    (x, (preproc, (extrs |> map_extrs (fn (funs, datatypes) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   495
      (funs, (serial (), f) :: datatypes)), funthms))))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   496
  #> notify_all NONE;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   497
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   498
fun add_fun thm thy =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   499
  case dest_fun thy thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   500
   of (c, _) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   501
    thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   502
    |> map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   503
        (x, (preproc, (extrs, funthms |> map_funthms (fn (dirty, funs) =>
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   504
          (dirty, funs |> Symtab.default (c, []) |> Symtab.map_entry c (cons thm)))))))
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   505
    |> notify_all (SOME c);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   506
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   507
fun del_fun thm thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   508
  case dest_fun thy thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   509
   of (c, _) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   510
    thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   511
    |> map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   512
        (x, (preproc, (extrs, funthms |> map_funthms (fn (dirty, funs) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   513
          (dirty, funs |> Symtab.map_entry c (remove eq_thm thm)))))))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   514
    |> notify_all (SOME c);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   515
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   516
fun add_unfold thm thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   517
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   518
  |> tap (fn thy => dest_eq thy thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   519
  |> map_data (fn (x, (preproc, y)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   520
       (x, (preproc |> map_preproc (fn (preprocs, unfolds) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   521
         (preprocs, thm :: unfolds)), y)))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   522
  |> notify_all NONE;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   523
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   524
fun del_unfold thm =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   525
  map_data (fn (x, (preproc, y)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   526
       (x, (preproc |> map_preproc (fn (preprocs, unfolds) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   527
         (preprocs, remove eq_thm thm unfolds)), y)))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   528
  #> notify_all NONE;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   529
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   530
fun purge_defs (c, ty) thy =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   531
  thy
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   532
  |> map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   533
      (x, (preproc, (extrs, funthms |> map_funthms (fn (dirty, funs) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   534
        (dirty, funs |> Symtab.map_entry c
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   535
            (filter (fn thm => Sign.typ_instance thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   536
              ((fst o snd o dest_fun thy) thm, ty)))))))))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   537
  |> notify_all (SOME c);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   538
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   539
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   540
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   541
(** theorem handling **)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   542
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   543
(* preprocessing *)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   544
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   545
fun extr_typ thy thm = case dest_fun thy thm
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   546
 of (_, (ty, _)) => ty;
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   547
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   548
fun rewrite_rhs conv thm = (case (Drule.strip_comb o cprop_of) thm
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   549
 of (ct', [ct1, ct2]) => (case term_of ct'
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   550
     of Const ("==", _) =>
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   551
          Thm.equal_elim (combination (combination (reflexive ct') (reflexive ct1))
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   552
            (conv ct2)) thm
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   553
      | _ => raise ERROR "rewrite_rhs")
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   554
  | _ => raise ERROR "rewrite_rhs");
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   555
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   556
fun common_typ thy _ [] = []
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   557
  | common_typ thy _ [thm] = [thm]
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   558
  | common_typ thy extract_typ thms =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   559
      let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   560
        fun incr_thm thm max =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   561
          let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   562
            val thm' = incr_indexes max thm;
20105
454f4be984b7 adaptions in codegen
haftmann
parents: 20076
diff changeset
   563
            val max' = (maxidx_of_typ o fastype_of o Drule.plain_prop_of) thm' + 1;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   564
          in (thm', max') end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   565
        val (thms', maxidx) = fold_map incr_thm thms 0;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   566
        val (ty1::tys) = map extract_typ thms;
19436
3f5835aac3ce ignore sort constraints of consts declarations;
wenzelm
parents: 19341
diff changeset
   567
        fun unify ty = Sign.typ_unify thy (ty1, ty);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   568
        val (env, _) = fold unify tys (Vartab.empty, maxidx)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   569
        val instT = Vartab.fold (fn (x_i, (sort, ty)) =>
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   570
          cons (Thm.ctyp_of thy (TVar (x_i, sort)), Thm.ctyp_of thy ty)) env [];
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   571
      in map (Thm.instantiate (instT, [])) thms end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   572
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   573
fun preprocess thy thms =
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   574
  let
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   575
    fun burrow_thms f [] = []
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   576
      | burrow_thms f thms =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   577
          thms
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   578
          |> Conjunction.intr_list
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   579
          |> f
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   580
          |> Conjunction.elim_list;
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   581
    fun cmp_thms (thm1, thm2) =
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   582
      not (Sign.typ_instance thy (extr_typ thy thm1, extr_typ thy thm2));
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   583
    fun unvarify thms =
20218
be3bfb0699ba Variable.import(T): result includes fixed types/terms;
wenzelm
parents: 20203
diff changeset
   584
      #2 (#1 (Variable.import true thms (ProofContext.init thy)));
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   585
    val unfold_thms = Tactic.rewrite true (map (make_eq thy) (the_unfolds thy));
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   586
  in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   587
    thms
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   588
    |> map (make_eq thy)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   589
    |> map (Thm.transfer thy)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   590
    |> fold (fn f => f thy) (the_preprocs thy)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   591
    |> map (rewrite_rhs unfold_thms)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   592
    |> debug_msg (fn _ => "[cg_thm] sorting")
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   593
    |> debug_msg (commas o map string_of_thm)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   594
    |> sort (make_ord cmp_thms)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   595
    |> debug_msg (fn _ => "[cg_thm] common_typ")
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   596
    |> debug_msg (commas o map string_of_thm)
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   597
    |> common_typ thy (extr_typ thy)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   598
    |> debug_msg (fn _ => "[cg_thm] abs_norm")
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   599
    |> debug_msg (commas o map string_of_thm)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   600
    |> map (abs_norm thy)
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   601
    |> burrow_thms (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   602
        debug_msg (fn _ => "[cg_thm] canonical tvars")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   603
        #> debug_msg (string_of_thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   604
        #> canonical_tvars thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   605
        #> debug_msg (fn _ => "[cg_thm] canonical vars")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   606
        #> debug_msg (string_of_thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   607
        #> canonical_vars thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   608
        #> debug_msg (fn _ => "[cg_thm] zero indices")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   609
        #> debug_msg (string_of_thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   610
        #> Drule.zero_var_indexes
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   611
       )
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   612
    |> drop_redundant thy
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   613
  end;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   614
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   615
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   616
(* retrieval *)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   617
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   618
fun get_funs thy (c, ty) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   619
  let
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   620
    val _ = debug_msg (fn _ => "[cg_thm] const (1) " ^ c ^ " :: " ^ Sign.string_of_typ thy ty) ()
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   621
    val filter_typ = map_filter (fn (_, (ty', thm)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   622
      if Sign.typ_instance thy (ty, ty')
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   623
      then SOME thm else debug_msg (fn _ => "[cg_thm] dropping " ^ string_of_thm thm) NONE);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   624
    fun get_funs (c, ty) =
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   625
      (these o Symtab.lookup (the_funs thy)) c
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   626
      |> debug_msg (fn _ => "[cg_thm] trying funs")
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   627
      |> map (dest_fun thy)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   628
      |> filter_typ;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   629
    fun get_extr (c, ty) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   630
      getf_first_list (map (fn f => f thy) (the_funs_extrs thy)) (c, ty)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   631
      |> debug_msg (fn _ => "[cg_thm] trying extr")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   632
      |> map (dest_fun thy)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   633
      |> filter_typ;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   634
    fun get_spec (c, ty) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   635
      Theory.definitions_of thy c
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   636
      |> debug_msg (fn _ => "[cg_thm] trying spec")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   637
      (* FIXME avoid dynamic name space lookup!? (via Thm.get_axiom_i etc.??) *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   638
      |> maps (PureThy.get_thms thy o Name o #name)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   639
      |> map_filter (try (dest_fun thy))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   640
      |> filter_typ;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   641
  in
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   642
    getf_first_list [get_funs, get_extr, get_spec] (c, ty)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   643
    |> debug_msg (fn _ => "[cg_thm] const (2) " ^ c ^ " :: " ^ Sign.string_of_typ thy ty)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   644
    |> preprocess thy
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   645
  end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   646
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   647
fun get_datatypes thy dtco =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   648
  let
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   649
    val _ = debug_msg (fn _ => "[cg_thm] datatype " ^ dtco) ()
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   650
    val truh = mk_true thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   651
    val fals = mk_false thy;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   652
    fun mk_lhs vs ((co1, tys1), (co2, tys2)) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   653
      let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   654
        val dty = Type (dtco, map TFree vs);
20076
def4ad161528 Name.invent_list;
wenzelm
parents: 20046
diff changeset
   655
        val (xs1, xs2) = chop (length tys1) (Name.invent_list [] "x" (length tys1 + length tys2));
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   656
        val frees1 = map2 (fn x => fn ty => Free (x, ty)) xs1 tys1;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   657
        val frees2 = map2 (fn x => fn ty => Free (x, ty)) xs2 tys2;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   658
        fun zip_co co xs tys = list_comb (Const (co,
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   659
          tys ---> dty), map2 (fn x => fn ty => Free (x, ty)) xs tys);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   660
      in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   661
        ((frees1, frees2), (zip_co co1 xs1 tys1, zip_co co2 xs2 tys2))
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   662
      end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   663
    fun mk_rhs [] [] = truh
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   664
      | mk_rhs xs ys = foldr1 (mk_obj_conj thy) (map2 (curry (mk_obj_eq thy)) xs ys);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   665
    fun mk_eq vs (args as ((co1, _), (co2, _))) (inj, dist) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   666
      if co1 = co2
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   667
        then let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   668
          val ((fs1, fs2), lhs) = mk_lhs vs args;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   669
          val rhs = mk_rhs fs1 fs2;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   670
        in (mk_func thy (lhs, rhs) :: inj, dist) end
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   671
        else let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   672
          val (_, lhs) = mk_lhs vs args;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   673
        in (inj, mk_func thy (lhs, fals) :: dist) end;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   674
    fun mk_eqs (vs, cos) =
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   675
      let val cos' = rev cos
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   676
      in (op @) (fold (mk_eq vs) (product cos' cos') ([], [])) end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   677
    fun mk_eq_thms tac vs_cos =
20046
9c8909fc5865 Goal.prove_global;
wenzelm
parents: 19967
diff changeset
   678
      map (fn t => Goal.prove_global thy [] []
9c8909fc5865 Goal.prove_global;
wenzelm
parents: 19967
diff changeset
   679
        (ObjectLogic.ensure_propT thy t) (K tac)) (mk_eqs vs_cos);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   680
  in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   681
    case getf_first (map (fn f => f thy) (the_datatypes_extrs thy)) dtco
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   682
     of NONE => NONE
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   683
      | SOME (vs_cos, tac) => SOME (vs_cos, mk_eq_thms tac vs_cos)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   684
  end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   685
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   686
fun get_eq thy (c, ty) =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   687
  if is_obj_eq thy c
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   688
  then case strip_type ty
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   689
   of (Type (tyco, _) :: _, _) =>
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   690
     (case get_datatypes thy tyco
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   691
       of SOME (_, thms) => thms
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   692
        | _ => [])
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   693
    | _ => []
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   694
  else [];
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   695
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   696
structure ConstTab = TableFun(type key = string * typ val ord = prod_ord fast_string_ord Term.typ_ord);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   697
structure ConstGraph = GraphFun(type key = string * typ val ord = prod_ord fast_string_ord Term.typ_ord);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   698
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   699
type thmtab = (theory * (thm list ConstGraph.T
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   700
  * string ConstTab.table)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   701
  * (Sorts.algebra * ((string * sort) list * (string * typ list) list) Symtab.table));
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   702
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   703
fun thmtab_empty thy = (thy, (ConstGraph.empty, ConstTab.empty),
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   704
  (ClassPackage.operational_algebra thy, Symtab.empty));
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   705
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   706
fun norm_typ thy (c, ty) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   707
  (*more clever: use ty_insts*)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   708
  case get_first (fn ty' => if Sign.typ_instance thy (ty, (*Logic.varifyT*) ty')
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   709
    then SOME ty' else NONE) (map #lhs (Theory.definitions_of thy c))
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   710
   of NONE => (c, ty)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   711
    | SOME ty => (c, ty);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   712
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   713
fun get_sortalgebra (_, _, (algebra, _)) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   714
  algebra;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   715
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   716
fun get_dtyp_of_cons (thy, (_, dtcotab), _) (c, ty) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   717
  let
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   718
    val (_, ty') = norm_typ thy (c, ty);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   719
  in ConstTab.lookup dtcotab (c, ty') end;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   720
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   721
fun get_dtyp_spec (_, _, (_, dttab)) tyco =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   722
  Symtab.lookup dttab tyco;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   723
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   724
fun has_fun_thms (thy, (fungr, _), _) (c, ty) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   725
  let
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   726
    val (_, ty') = norm_typ thy (c, ty);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   727
  in can (ConstGraph.get_node fungr) (c, ty') end;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   728
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   729
fun get_fun_thms (thy, (fungr, _), _) (c, ty) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   730
  let
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   731
    val (_, ty') = norm_typ thy (c, ty);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   732
  in these (try (ConstGraph.get_node fungr) (c, ty')) end;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   733
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   734
fun mk_thmtab' thy cs =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   735
  let
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   736
    fun get_dtco_candidate ty =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   737
      case strip_type ty
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   738
       of (_, Type (tyco, _)) => SOME tyco
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   739
        | _ => NONE;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   740
    fun add_tycos (Type (tyco, tys)) = insert (op =) tyco #> fold add_tycos tys
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   741
      | add_tycos _ = I;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   742
    val add_consts = fold_aterms
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   743
      (fn Const c_ty => insert (op =) (norm_typ thy c_ty)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   744
         | _ => I);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   745
    fun add_dtyps_of_type ty thmtab =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   746
      let
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   747
        val tycos = add_tycos ty [];
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   748
        val tycos_new = filter (is_some o get_dtyp_spec thmtab) tycos;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   749
        fun add_dtyp_spec dtco (dtyp_spec as (vs, cs)) ((thy, (fungr, dtcotab), (algebra, dttab))) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   750
          let
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   751
            fun mk_co (c, tys) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   752
              (c, Logic.varifyT (tys ---> Type (dtco, map TFree vs)));
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   753
          in
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   754
            (thy, (fungr, dtcotab |> fold (fn c_tys => ConstTab.update_new (mk_co c_tys, dtco)) cs),
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   755
              (algebra, dttab |> Symtab.update_new (dtco, dtyp_spec)))
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   756
          end;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   757
      in
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   758
        thmtab
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   759
        |> fold (fn tyco => case get_datatypes thy tyco
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   760
             of SOME (dtyp_spec, _) => add_dtyp_spec tyco dtyp_spec
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   761
              | NONE => I) tycos_new
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   762
      end;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   763
    fun known thmtab (c, ty) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   764
      is_some (get_dtyp_of_cons thmtab (c, ty)) orelse has_fun_thms thmtab (c, ty);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   765
    fun add_funthms (c, ty) (thmtab as (thy, (fungr, dtcotab), algebra_dttab))=
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   766
      if known thmtab (norm_typ thy (c, ty)) then thmtab
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   767
      else let
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   768
        val thms = get_funs thy (c, ty)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   769
        val cs_dep = fold (add_consts o Thm.prop_of) thms [];
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   770
      in
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   771
        (thy, (fungr |> ConstGraph.new_node ((c, ty), thms)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   772
        , dtcotab), algebra_dttab)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   773
        |> fold add_c cs_dep
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   774
      end
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   775
    and add_c (c, ty) thmtab =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   776
      let
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   777
        val (_, ty') = norm_typ thy (c, ty);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   778
      in
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   779
        thmtab
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   780
        |> add_dtyps_of_type ty
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   781
        |> add_funthms (c, ty)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   782
      end;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   783
    fun narrow_typs fungr =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   784
      let
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   785
        (*
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   786
        (*!!!remember whether any instantiation had been applied!!!*)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   787
        fun narrow_thms insts thms =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   788
          let
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   789
            val (c_def, ty_def) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   790
              (norm_typ thy o dest_Const o fst o Logic.dest_equals o Thm.prop_of o hd) thms;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   791
            val cs = fold (add_consts o snd o Logic.dest_equals o Thm.prop_of) thms [];
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   792
            fun eval_inst c (inst, ty) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   793
              let
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   794
                val inst_ctxt = Sign.const_typargs thy (c, ty);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   795
                val inst_zip = fold (fn (v, ty) => (ty, (the o AList.lookup (op =) inst_ctxt) v)) inst
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   796
                fun add_inst (ty_inst, ty_ctxt) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   797
                  if Sign.typ_instance thy (ty_inst, ty_ctxt)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   798
                  then I
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   799
                  else Sign.typ_match thy (ty_ctxt, ty_inst);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   800
              in fold add_inst inst_zip end;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   801
            val inst =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   802
              Vartab.empty
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   803
              |> fold (fn c_ty as (c, ty) =>
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   804
                    case ConstTab.lookup insts (norm_typ thy c_ty)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   805
                     of NONE => I
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   806
                      | SOME inst => eval_inst c (inst, ty)) cs
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   807
              |> Vartab.dest
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   808
              |> map (fn (v, (_, ty)) => (v, ty));
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   809
            val instT = map (fn (v, ty) =>
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   810
                (Thm.ctyp_of thy (TVar v, Thm.ctyp_of thy ty))) inst;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   811
            val thms' =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   812
              if null inst then NONE thms else
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   813
                map Thm.instantiate (instT, []) thms;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   814
            val inst' = if null inst then NONE
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   815
              else SOME inst;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   816
          in (inst', thms') end;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   817
        fun narrow_css [c] (insts, fungr) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   818
              (* HIER GEHTS WEITER *)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   819
              (insts, fungr)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   820
          | narrow_css css (insts, fungr) =
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   821
              (insts, fungr)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   822
        *)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   823
        val css = rev (Graph.strong_conn fungr);
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   824
      in
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   825
        (ConstTab.empty, fungr)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   826
        (*|> fold narrow_css css*)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   827
        |> snd
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   828
      end;
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   829
  in
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   830
    thmtab_empty thy
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   831
    |> fold add_c cs
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   832
(*     |> (apfst o apfst) narrow_typs  *)
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   833
  end;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   834
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   835
fun mk_thmtab cs thy =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   836
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   837
  |> get_reset_dirty
20191
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   838
  |> snd
b43fd26e1aaa improvements for lazy code generation
haftmann
parents: 20175
diff changeset
   839
  |> `(fn thy => mk_thmtab' thy cs);
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   840
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   841
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   842
(** code attributes and setup **)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   843
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   844
local
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   845
  fun add_simple_attribute (name, f) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   846
    (Codegen.add_attribute name o (Scan.succeed o Thm.declaration_attribute))
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   847
      (Context.map_theory o f);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   848
in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   849
  val _ = map (Context.add_setup o add_simple_attribute) [
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   850
    ("fun", add_fun),
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   851
    ("unfold", (fn thm => Codegen.add_unfold thm #> add_unfold thm)),
20105
454f4be984b7 adaptions in codegen
haftmann
parents: 20076
diff changeset
   852
    ("inline", add_unfold),
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   853
    ("nofold", del_unfold)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   854
  ]
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   855
end; (*local*)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   856
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   857
val _ = Context.add_setup (add_fun_extr get_eq);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   858
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   859
end; (*struct*)