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