src/Pure/Tools/codegen_theorems.ML
author paulson
Wed, 19 Jul 2006 11:55:26 +0200
changeset 20153 6ff5d35749b0
parent 20105 454f4be984b7
child 20175 0a8ca32f6e64
permissions -rw-r--r--
Fixed the bugs introduced by the last commit! Output is now *identical* to that produced by the old version, based on a-lists.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
     1
(*  Title:      Pure/Tools/codegen_theorems.ML
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     2
    ID:         $Id$
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     4
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     5
Theorems used for code generation.
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     6
*)
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     7
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     8
signature CODEGEN_THEOREMS =
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
     9
sig
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
    10
  val add_notify: ((string * typ) list option -> theory -> theory) -> theory -> theory;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    11
  val add_preproc: (theory -> thm list -> thm list) -> theory -> theory;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    12
  val add_fun_extr: (theory -> string * typ -> thm list) -> theory -> theory;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    13
  val add_datatype_extr: (theory -> string
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    14
    -> (((string * sort) list * (string * typ list) list) * tactic) option)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    15
    -> theory -> theory;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    16
  val add_fun: thm -> theory -> theory;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    17
  val del_fun: thm -> theory -> theory;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    18
  val add_unfold: thm -> theory -> theory;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    19
  val del_unfold: thm -> theory -> theory;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    20
  val purge_defs: string * typ -> theory -> theory;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    21
  val notify_dirty: theory -> theory;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    22
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
    23
  val extr_typ: theory -> thm -> typ;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    24
  val common_typ: theory -> (thm -> typ) -> thm list -> thm list;
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
    25
  val preprocess: theory -> thm list -> thm list;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    26
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
    27
  val get_funs: theory -> string * typ -> thm list;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    28
  val get_datatypes: theory -> string
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    29
    -> (((string * sort) list * (string * typ list) list) * thm list) option;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    30
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    31
  (*
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    32
  type thmtab;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    33
  val get_thmtab: (string * typ) list -> theory -> thmtab * theory;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    34
  val get_cons: thmtab -> string -> string option;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    35
  val get_dtyp: thmtab -> string -> (string * sort) list * (string * typ list) list;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    36
  val get_thms: thmtab -> string * typ -> typ * thm list;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    37
  *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    38
  
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    39
  val print_thms: theory -> unit;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    40
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    41
  val init_obj: (thm * thm) * (thm * thm) -> theory -> theory;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    42
  val debug: bool ref;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    43
  val debug_msg: ('a -> string) -> 'a -> 'a;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    44
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;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    55
fun debug_msg f x = (if !debug then Output.debug (f x) else (); x);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    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
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    89
   of SOME _ => error "code generator already set up for object logic"
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    90
    | NONE => 
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
               )
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   122
            |> (fn (v1, ((conj, _), v2)) => if v1 = v2 then conj else error "wrong premise")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   123
          fun dest_atomize_eq thm =
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)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   138
                 if [v1a, v1b] = v2 andalso sort = Sign.defaultS thy then eq else error "wrong premise")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   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])
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   141
          handle _ => error "bad code generator setup")
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)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   149
    | NONE => error "no object logic setup for code theorems";
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
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   188
fun abs_norm thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   189
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   190
    fun expvars t =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   191
      let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   192
        val lhs = (fst o Logic.dest_equals) t;
20105
454f4be984b7 adaptions in codegen
haftmann
parents: 20076
diff changeset
   193
        val tys = (fst o strip_type o fastype_of) lhs;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   194
        val used = fold_aterms (fn Var ((v, _), _) => insert (op =) v | _ => I) lhs [];
20076
def4ad161528 Name.invent_list;
wenzelm
parents: 20046
diff changeset
   195
        val vs = Name.invent_list used "x" (length tys);
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   196
      in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   197
        map2 (fn v => fn ty => Var ((v, 0), ty)) vs tys
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   198
      end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   199
    fun expand ct thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   200
      Thm.combination thm (Thm.reflexive ct);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   201
    fun beta_norm thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   202
      thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   203
      |> prop_of
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   204
      |> Logic.dest_equals
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   205
      |> fst
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   206
      |> cterm_of thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   207
      |> Thm.beta_conversion true
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   208
      |> Thm.symmetric
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   209
      |> (fn thm' => Thm.transitive thm' thm);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   210
  in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   211
    thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   212
    |> fold (expand o cterm_of thy) ((expvars o prop_of) thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   213
    |> beta_norm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   214
  end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   215
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   216
fun canonical_tvars thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   217
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   218
    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
   219
      if v = v' orelse member (op =) set v then s
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   220
        else let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   221
          val ty = TVar (v_i, sort)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   222
        in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   223
          (maxidx + 1, v :: set,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   224
            (ctyp_of thy ty, ctyp_of thy (TVar ((v', maxidx), sort))) :: acc)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   225
        end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   226
    val lower_name = (prefix "'" o implode o map (Char.toString o Char.toLower o the o Char.fromString)
20105
454f4be984b7 adaptions in codegen
haftmann
parents: 20076
diff changeset
   227
      o explode o CodegenThingol.proper_name o unprefix "'");
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   228
    fun tvars_of thm = (fold_types o fold_atyps)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   229
      (fn TVar (v_i as (v, i), sort) => cons (v_i, (lower_name v, sort))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   230
        | _ => I) (prop_of thm) [];
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   231
    val maxidx = Thm.maxidx_of thm + 1;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   232
    val (_, _, inst) = fold mk_inst (tvars_of thm) (maxidx + 1, [], []);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   233
  in Thm.instantiate (inst, []) thm end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   234
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   235
fun canonical_vars thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   236
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   237
    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
   238
      if v = v' orelse member (op =) set v then s
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   239
        else let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   240
          val t = if i = ~1 then Free (v, ty) else Var (v_i, ty)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   241
        in 
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   242
          (maxidx + 1,  v :: set,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   243
            (cterm_of thy t, cterm_of thy (Var ((v', maxidx), ty))) :: acc)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   244
        end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   245
    val lower_name = (implode o map (Char.toString o Char.toLower o the o Char.fromString)
20105
454f4be984b7 adaptions in codegen
haftmann
parents: 20076
diff changeset
   246
      o explode o CodegenThingol.proper_name);
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   247
    fun vars_of thm = fold_aterms
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   248
      (fn Var (v_i as (v, i), ty) => cons (v_i, (lower_name v, ty))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   249
        | _ => I) (prop_of thm) [];
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   250
    val maxidx = Thm.maxidx_of thm + 1;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   251
    val (_, _, inst) = fold mk_inst (vars_of thm) (maxidx + 1, [], []);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   252
  in Thm.instantiate ([], inst) thm end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   253
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   254
fun drop_redundant thy eqs =
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   255
  let
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   256
    val matches = curry (Pattern.matches thy o
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   257
      pairself (fst o Logic.dest_equals o prop_of))
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   258
    fun drop eqs [] = eqs
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   259
      | drop eqs (eq::eqs') =
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   260
          drop (eq::eqs) (filter_out (matches eq) eqs')
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   261
  in drop [] eqs end;
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   262
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   263
fun make_eq thy = 
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   264
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   265
    val ((_, atomize), _) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   266
  in rewrite_rule [atomize] end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   267
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   268
fun dest_eq thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   269
  case try (make_eq thy #> Drule.plain_prop_of
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   270
   #> ObjectLogic.drop_judgment thy #> Logic.dest_equals) thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   271
   of SOME eq => (eq, thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   272
    | NONE => err_thm "not an equation" thm;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   273
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   274
fun dest_fun thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   275
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   276
    fun dest_fun' ((lhs, _), thm) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   277
      case try (dest_Const o fst o strip_comb) lhs
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   278
       of SOME (c, ty) => (c, (ty, thm))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   279
        | NONE => err_thm "not a function equation" thm;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   280
  in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   281
    thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   282
    |> dest_eq thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   283
    |> dest_fun'
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   284
  end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   285
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   286
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   287
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   288
(** theory data **)
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   289
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   290
(* data structures *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   291
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   292
fun merge' eq (xys as (xs, ys)) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   293
  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
   294
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   295
fun alist_merge' eq_key eq (xys as (xs, ys)) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   296
  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
   297
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   298
fun list_symtab_join' eq (xyt as (xt, yt)) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   299
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   300
    val xc = Symtab.keys xt;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   301
    val yc = Symtab.keys yt;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   302
    val zc = filter (member (op =) yc) xc;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   303
    val wc = subtract (op =) zc xc @ subtract (op =) zc yc;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   304
    fun same_thms c = if eq_list eq_thm ((the o Symtab.lookup xt) c, (the o Symtab.lookup yt) c)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   305
      then NONE else SOME c;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   306
  in (wc @ map_filter same_thms zc, Symtab.join (K (merge eq)) xyt) end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   307
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   308
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
   309
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   310
val mk_notify = Notify;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   311
fun map_notify f (Notify notify) = mk_notify (f notify);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   312
fun merge_notify pp (Notify notify1, Notify notify2) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   313
  mk_notify (AList.merge (op =) (K true) (notify1, notify2));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   314
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   315
datatype preproc = Preproc of {
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   316
  preprocs: (serial * (theory -> thm list -> thm list)) list,
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   317
  unfolds: thm list
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   318
};
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   319
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   320
fun mk_preproc (preprocs, unfolds) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   321
  Preproc { preprocs = preprocs, unfolds = unfolds };
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   322
fun map_preproc f (Preproc { preprocs, unfolds }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   323
  mk_preproc (f (preprocs, unfolds));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   324
fun merge_preproc _ (Preproc { preprocs = preprocs1, unfolds = unfolds1 },
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   325
  Preproc { preprocs = preprocs2, unfolds = unfolds2 }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   326
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   327
      val (dirty1, preprocs) = alist_merge' (op =) (K true) (preprocs1, preprocs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   328
      val (dirty2, unfolds) = merge' eq_thm (unfolds1, unfolds2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   329
    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
   330
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   331
datatype extrs = Extrs of {
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   332
  funs: (serial * (theory -> string * typ -> thm list)) list,
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   333
  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
   334
};
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   335
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   336
fun mk_extrs (funs, datatypes) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   337
  Extrs { funs = funs, datatypes = datatypes };
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   338
fun map_extrs f (Extrs { funs, datatypes }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   339
  mk_extrs (f (funs, datatypes));
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   340
fun merge_extrs _ (Extrs { funs = funs1, datatypes = datatypes1 },
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   341
  Extrs { funs = funs2, datatypes = datatypes2 }) =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   342
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   343
      val (dirty1, funs) = alist_merge' (op =) (K true) (funs1, funs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   344
      val (dirty2, datatypes) = alist_merge' (op =) (K true) (datatypes1, datatypes2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   345
    in (dirty1 orelse dirty2, mk_extrs (funs, datatypes)) end;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   346
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   347
datatype funthms = Funthms of {
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   348
  dirty: string list,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   349
  funs: thm list Symtab.table
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   350
};
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   351
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   352
fun mk_funthms (dirty, funs) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   353
  Funthms { dirty = dirty, funs = funs };
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   354
fun map_funthms f (Funthms { dirty, funs }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   355
  mk_funthms (f (dirty, funs));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   356
fun merge_funthms _ (Funthms { dirty = dirty1, funs = funs1 },
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   357
  Funthms { dirty = dirty2, funs = funs2 }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   358
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   359
      val (dirty3, funs) = list_symtab_join' eq_thm (funs1, funs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   360
    in mk_funthms (merge (op =) (merge (op =) (dirty1, dirty2), dirty3), funs) end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   361
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   362
datatype T = T of {
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   363
  dirty: bool,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   364
  notify: notify,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   365
  preproc: preproc,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   366
  extrs: extrs,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   367
  funthms: funthms
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   368
};
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   369
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   370
fun mk_T ((dirty, notify), (preproc, (extrs, funthms))) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   371
  T { dirty = dirty, notify = notify, preproc = preproc, extrs = extrs, funthms = funthms };
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   372
fun map_T f (T { dirty, notify, preproc, extrs, funthms }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   373
  mk_T (f ((dirty, notify), (preproc, (extrs, funthms))));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   374
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
   375
  T { dirty = dirty2, notify = notify2, preproc = preproc2, extrs = extrs2, funthms = funthms2 }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   376
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   377
      val (dirty3, preproc) = merge_preproc pp (preproc1, preproc2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   378
      val (dirty4, extrs) = merge_extrs pp (extrs1, extrs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   379
    in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   380
      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
   381
        (preproc, (extrs, merge_funthms pp (funthms1, funthms2))))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   382
    end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   383
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   384
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   385
(* setup *)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   386
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   387
structure CodegenTheoremsData = TheoryDataFun
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   388
(struct
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   389
  val name = "Pure/codegen_theorems_data";
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   390
  type T = T;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   391
  val empty = mk_T ((false, mk_notify []), (mk_preproc ([], []),
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   392
    (mk_extrs ([], []), mk_funthms ([], Symtab.empty))));
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   393
  val copy = I;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   394
  val extend = I;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   395
  val merge = merge_T;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   396
  fun print (thy : theory) (data : T) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   397
    let
19436
3f5835aac3ce ignore sort constraints of consts declarations;
wenzelm
parents: 19341
diff changeset
   398
      val pretty_thm = ProofContext.pretty_thm (ProofContext.init thy);
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   399
      val funthms = (fn T { funthms, ... } => funthms) data;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   400
      val funs = (Symtab.dest o (fn Funthms { funs, ... } => funs)) funthms;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   401
      val preproc = (fn T { preproc, ... } => preproc) data;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   402
      val unfolds = (fn Preproc { unfolds, ... } => unfolds) preproc;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   403
    in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   404
      (Pretty.writeln o Pretty.block o Pretty.fbreaks) ([
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   405
        Pretty.str "code generation theorems:",
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   406
        Pretty.str "function theorems:" ] @
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   407
        (*Pretty.fbreaks ( *)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   408
          map (fn (c, thms) => 
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   409
            (Pretty.block o Pretty.fbreaks) (
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   410
              Pretty.str c :: map pretty_thm (rev thms)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   411
            )
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   412
          ) funs
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   413
        (*) *) @ [
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   414
        Pretty.fbrk,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   415
        Pretty.block (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   416
          Pretty.str "unfolding theorems:"
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   417
          :: Pretty.fbrk
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   418
          :: (Pretty.fbreaks o map pretty_thm) unfolds
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   419
      )])
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   420
    end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   421
end);
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   422
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   423
val _ = Context.add_setup CodegenTheoremsData.init;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   424
val print_thms = CodegenTheoremsData.print;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   425
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   426
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   427
(* accessors *)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   428
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   429
local
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   430
  val the_preproc = (fn T { preproc = Preproc preproc, ... } => preproc) o CodegenTheoremsData.get;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   431
  val the_extrs = (fn T { extrs = Extrs extrs, ... } => extrs) o CodegenTheoremsData.get;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   432
  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
   433
in
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   434
  val is_dirty = (fn T { dirty = dirty, ... } => dirty) o CodegenTheoremsData.get;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   435
  val the_dirty_consts = (fn { dirty = dirty, ... } => dirty) o the_funthms;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   436
  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
   437
  val the_preprocs = (fn { preprocs, ... } => map snd preprocs) o the_preproc;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   438
  val the_unfolds = (fn { unfolds, ... } => unfolds) o the_preproc;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   439
  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
   440
  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
   441
  val the_funs = (fn { funs, ... } => funs) o the_funthms;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   442
end (*local*);
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   443
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   444
val map_data = CodegenTheoremsData.map o map_T;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   445
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   446
(* notifiers *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   447
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   448
fun all_typs thy c =
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   449
  map (pair c) (Sign.the_const_type thy c :: (map (#lhs) o Theory.definitions_of thy) c);
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   450
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   451
fun add_notify f =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   452
  map_data (fn ((dirty, notify), x) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   453
    ((dirty, notify |> map_notify (cons (serial (), f))), x));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   454
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   455
fun get_reset_dirty thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   456
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   457
    val dirty = is_dirty thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   458
    val dirty_const = if dirty then [] else the_dirty_consts thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   459
  in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   460
    thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   461
    |> map_data (fn ((_, notify), (procs, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   462
         ((false, notify), (procs, (extrs, funthms |> map_funthms (fn (_, funs) => ([], funs))))))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   463
    |> pair (dirty, dirty_const)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   464
  end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   465
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   466
fun notify_all c thy =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   467
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   468
  |> get_reset_dirty
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   469
  |-> (fn (true, _) => fold (fn f => f NONE) (the_notify thy)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   470
        | (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
   471
            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
   472
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   473
fun notify_dirty thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   474
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   475
  |> get_reset_dirty
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   476
  |-> (fn (true, _) => fold (fn f => f NONE) (the_notify thy)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   477
        | (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
   478
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   479
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   480
(* modifiers *)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   481
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   482
fun add_preproc f =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   483
  map_data (fn (x, (preproc, y)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   484
    (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
   485
  #> notify_all NONE;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   486
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   487
fun add_fun_extr f =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   488
  map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   489
    (x, (preproc, (extrs |> map_extrs (fn (funs, datatypes) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   490
      ((serial (), f) :: funs, datatypes)), funthms))))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   491
  #> notify_all NONE;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   492
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   493
fun add_datatype_extr f =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   494
  map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   495
    (x, (preproc, (extrs |> map_extrs (fn (funs, datatypes) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   496
      (funs, (serial (), f) :: datatypes)), funthms))))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   497
  #> notify_all NONE;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   498
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   499
fun add_fun thm thy =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   500
  case dest_fun thy thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   501
   of (c, _) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   502
    thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   503
    |> map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   504
        (x, (preproc, (extrs, funthms |> map_funthms (fn (dirty, funs) =>
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   505
          (dirty, funs |> Symtab.default (c, []) |> Symtab.map_entry c (cons thm)))))))
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   506
    |> notify_all (SOME c);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   507
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   508
fun del_fun thm thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   509
  case dest_fun thy thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   510
   of (c, _) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   511
    thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   512
    |> map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   513
        (x, (preproc, (extrs, funthms |> map_funthms (fn (dirty, funs) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   514
          (dirty, funs |> Symtab.map_entry c (remove eq_thm thm)))))))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   515
    |> notify_all (SOME c);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   516
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   517
fun add_unfold thm thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   518
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   519
  |> tap (fn thy => dest_eq thy thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   520
  |> map_data (fn (x, (preproc, y)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   521
       (x, (preproc |> map_preproc (fn (preprocs, unfolds) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   522
         (preprocs, thm :: unfolds)), y)))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   523
  |> notify_all NONE;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   524
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   525
fun del_unfold thm = 
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   526
  map_data (fn (x, (preproc, y)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   527
       (x, (preproc |> map_preproc (fn (preprocs, unfolds) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   528
         (preprocs, remove eq_thm thm unfolds)), y)))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   529
  #> notify_all NONE;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   530
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   531
fun purge_defs (c, ty) thy =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   532
  thy
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   533
  |> map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   534
      (x, (preproc, (extrs, funthms |> map_funthms (fn (dirty, funs) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   535
        (dirty, funs |> Symtab.map_entry c
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   536
            (filter (fn thm => Sign.typ_instance thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   537
              ((fst o snd o dest_fun thy) thm, ty)))))))))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   538
  |> notify_all (SOME c);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   539
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   540
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   541
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   542
(** theorem handling **)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   543
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   544
(* preprocessing *)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   545
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   546
fun extr_typ thy thm = case dest_fun thy thm
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   547
 of (_, (ty, _)) => ty;
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   548
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   549
fun common_typ thy _ [] = []
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   550
  | common_typ thy _ [thm] = [thm]
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   551
  | common_typ thy extract_typ thms =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   552
      let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   553
        fun incr_thm thm max =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   554
          let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   555
            val thm' = incr_indexes max thm;
20105
454f4be984b7 adaptions in codegen
haftmann
parents: 20076
diff changeset
   556
            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
   557
          in (thm', max') end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   558
        val (thms', maxidx) = fold_map incr_thm thms 0;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   559
        val (ty1::tys) = map extract_typ thms;
19436
3f5835aac3ce ignore sort constraints of consts declarations;
wenzelm
parents: 19341
diff changeset
   560
        fun unify ty = Sign.typ_unify thy (ty1, ty);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   561
        val (env, _) = fold unify tys (Vartab.empty, maxidx)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   562
        val instT = Vartab.fold (fn (x_i, (sort, ty)) =>
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   563
          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
   564
      in map (Thm.instantiate (instT, [])) thms end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   565
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   566
fun preprocess thy thms =
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   567
  let
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   568
    fun burrow_thms f [] = []
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   569
      | burrow_thms f thms = 
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   570
          thms
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   571
          |> Conjunction.intr_list
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   572
          |> f
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   573
          |> Conjunction.elim_list;
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   574
    fun cmp_thms (thm1, thm2) =
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   575
      not (Sign.typ_instance thy (extr_typ thy thm1, extr_typ thy thm2));
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   576
    fun rewrite_rhs conv thm = (case (Drule.strip_comb o cprop_of) thm
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   577
     of (ct', [ct1, ct2]) => (case term_of ct'
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   578
         of Const ("==", _) =>
19967
33da452f0abe slight refinements
haftmann
parents: 19953
diff changeset
   579
              Thm.equal_elim (combination (combination (reflexive ct') (reflexive ct1))
33da452f0abe slight refinements
haftmann
parents: 19953
diff changeset
   580
                (conv ct2)) thm
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   581
          | _ => raise ERROR "rewrite_rhs")
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   582
      | _ => raise ERROR "rewrite_rhs");
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   583
    fun unvarify thms =
19897
fe661eb3b0e7 ProofContext: moved variable operations to struct Variable;
wenzelm
parents: 19884
diff changeset
   584
      #1 (Variable.import true thms (ProofContext.init thy));
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   585
    val unfold_thms = Tactic.rewrite true (map (make_eq thy) (the_unfolds thy));
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   586
  in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   587
    thms
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   588
    |> map (make_eq thy)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   589
    |> map (Thm.transfer thy)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   590
    |> fold (fn f => f thy) (the_preprocs thy)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   591
    |> map (rewrite_rhs unfold_thms)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   592
    |> debug_msg (fn _ => "[cg_thm] sorting")
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   593
    |> debug_msg (commas o map string_of_thm)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   594
    |> sort (make_ord cmp_thms)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   595
    |> debug_msg (fn _ => "[cg_thm] common_typ")
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   596
    |> debug_msg (commas o map string_of_thm)
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   597
    |> common_typ thy (extr_typ thy)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   598
    |> debug_msg (fn _ => "[cg_thm] abs_norm")
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   599
    |> debug_msg (commas o map string_of_thm)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   600
    |> map (abs_norm thy)
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   601
    |> burrow_thms (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   602
        debug_msg (fn _ => "[cg_thm] canonical tvars")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   603
        #> debug_msg (string_of_thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   604
        #> canonical_tvars thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   605
        #> debug_msg (fn _ => "[cg_thm] canonical vars")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   606
        #> debug_msg (string_of_thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   607
        #> canonical_vars thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   608
        #> debug_msg (fn _ => "[cg_thm] zero indices")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   609
        #> debug_msg (string_of_thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   610
        #> Drule.zero_var_indexes
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   611
       )
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   612
    |> drop_redundant thy
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   613
  end;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   614
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   615
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   616
(* retrieval *)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   617
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   618
fun get_funs thy (c, ty) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   619
  let
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   620
    val _ = debug_msg (fn _ => "[cg_thm] const (1) " ^ c ^ " :: " ^ Sign.string_of_typ thy ty) ()
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   621
    val filter_typ = map_filter (fn (_, (ty', thm)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   622
      if Sign.typ_instance thy (ty, ty')
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   623
      then SOME thm else debug_msg (fn _ => "[cg_thm] dropping " ^ string_of_thm thm) NONE);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   624
    fun get_funs (c, ty) =
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   625
      (these o Symtab.lookup (the_funs thy)) c
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   626
      |> debug_msg (fn _ => "[cg_thm] trying funs")
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   627
      |> map (dest_fun thy)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   628
      |> filter_typ;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   629
    fun get_extr (c, ty) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   630
      getf_first_list (map (fn f => f thy) (the_funs_extrs thy)) (c, ty)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   631
      |> debug_msg (fn _ => "[cg_thm] trying extr")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   632
      |> map (dest_fun thy)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   633
      |> filter_typ;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   634
    fun get_spec (c, ty) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   635
      Theory.definitions_of thy c
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   636
      |> debug_msg (fn _ => "[cg_thm] trying spec")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   637
      (* FIXME avoid dynamic name space lookup!? (via Thm.get_axiom_i etc.??) *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   638
      |> maps (PureThy.get_thms thy o Name o #name)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   639
      |> map_filter (try (dest_fun thy))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   640
      |> filter_typ;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   641
  in
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   642
    getf_first_list [get_funs, get_extr, get_spec] (c, ty)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   643
    |> debug_msg (fn _ => "[cg_thm] const (2) " ^ c ^ " :: " ^ Sign.string_of_typ thy ty)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   644
    |> preprocess thy
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   645
  end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   646
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   647
fun get_datatypes thy dtco =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   648
  let
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   649
    val _ = debug_msg (fn _ => "[cg_thm] datatype " ^ dtco) ()
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   650
    val truh = mk_true thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   651
    val fals = mk_false thy;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   652
    fun mk_lhs vs ((co1, tys1), (co2, tys2)) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   653
      let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   654
        val dty = Type (dtco, map TFree vs);
20076
def4ad161528 Name.invent_list;
wenzelm
parents: 20046
diff changeset
   655
        val (xs1, xs2) = chop (length tys1) (Name.invent_list [] "x" (length tys1 + length tys2));
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   656
        val frees1 = map2 (fn x => fn ty => Free (x, ty)) xs1 tys1;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   657
        val frees2 = map2 (fn x => fn ty => Free (x, ty)) xs2 tys2;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   658
        fun zip_co co xs tys = list_comb (Const (co,
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   659
          tys ---> dty), map2 (fn x => fn ty => Free (x, ty)) xs tys);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   660
      in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   661
        ((frees1, frees2), (zip_co co1 xs1 tys1, zip_co co2 xs2 tys2))
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   662
      end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   663
    fun mk_rhs [] [] = truh
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   664
      | mk_rhs xs ys = foldr1 (mk_obj_conj thy) (map2 (curry (mk_obj_eq thy)) xs ys);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   665
    fun mk_eq vs (args as ((co1, _), (co2, _))) (inj, dist) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   666
      if co1 = co2
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   667
        then let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   668
          val ((fs1, fs2), lhs) = mk_lhs vs args;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   669
          val rhs = mk_rhs fs1 fs2;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   670
        in (mk_func thy (lhs, rhs) :: inj, dist) end
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   671
        else let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   672
          val (_, lhs) = mk_lhs vs args;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   673
        in (inj, mk_func thy (lhs, fals) :: dist) end;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   674
    fun mk_eqs (vs, cos) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   675
      let val cos' = rev cos 
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   676
      in (op @) (fold (mk_eq vs) (product cos' cos') ([], [])) end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   677
    fun mk_eq_thms tac vs_cos =
20046
9c8909fc5865 Goal.prove_global;
wenzelm
parents: 19967
diff changeset
   678
      map (fn t => Goal.prove_global thy [] []
9c8909fc5865 Goal.prove_global;
wenzelm
parents: 19967
diff changeset
   679
        (ObjectLogic.ensure_propT thy t) (K tac)) (mk_eqs vs_cos);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   680
  in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   681
    case getf_first (map (fn f => f thy) (the_datatypes_extrs thy)) dtco
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   682
     of NONE => NONE
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   683
      | SOME (vs_cos, tac) => SOME (vs_cos, mk_eq_thms tac vs_cos)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   684
  end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   685
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   686
fun get_eq thy (c, ty) =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   687
  if is_obj_eq thy c
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   688
  then case strip_type ty
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   689
   of (Type (tyco, _) :: _, _) =>
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   690
     (case get_datatypes thy tyco
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   691
       of SOME (_, thms) => thms
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   692
        | _ => [])
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   693
    | _ => []
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   694
  else [];
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   695
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   696
type thmtab = ((thm list Typtab.table Symtab.table
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   697
  * string Symtab.table)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   698
  * ((string * sort) list * (string * typ list) list) Symtab.table);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   699
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   700
(*
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   701
fun mk_thmtab thy cs =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   702
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   703
    fun add_c (c, ty) gr =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   704
    (*
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   705
      Das ist noch viel komplizierter: Zyklen
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   706
      und die aktuellen Instantiierungen muss man auch noch mitschleppen
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   707
      man sieht: man braucht zusätzlich ein Mapping
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   708
        c ~> [ty] (Symtab)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   709
      wobei dort immer die bislang allgemeinsten... ???
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   710
    *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   711
    (*
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   712
      thm holen für bestimmten typ
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   713
      typ dann behalten
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   714
      typ normalisieren
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   715
      damit haben wir den key
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   716
      hier den check machen, ob schon prozessiert wurde
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   717
      NEIN:
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   718
        ablegen
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   719
        consts der rechten Seiten
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   720
        in die Rekursion gehen für alles
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   721
      JA:
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   722
        fertig
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   723
    *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   724
  in fold add_c cs Constgraph.empty end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   725
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   726
fun get_thmtab cs thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   727
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   728
  |> get_reset_dirty
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   729
  |-> (fn _ => I)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   730
  |> `mk_thmtab;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   731
*)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   732
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   733
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   734
(** code attributes and setup **)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   735
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   736
local
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   737
  fun add_simple_attribute (name, f) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   738
    (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
   739
      (Context.map_theory o f);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   740
in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   741
  val _ = map (Context.add_setup o add_simple_attribute) [
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   742
    ("fun", add_fun),
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   743
    ("unfold", (fn thm => Codegen.add_unfold thm #> add_unfold thm)),
20105
454f4be984b7 adaptions in codegen
haftmann
parents: 20076
diff changeset
   744
    ("inline", add_unfold),
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   745
    ("nofold", del_unfold)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   746
  ]
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   747
end; (*local*)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   748
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   749
val _ = Context.add_setup (add_fun_extr get_eq);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   750
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   751
end; (*struct*)