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