src/Pure/Tools/codegen_theorems.ML
author wenzelm
Sat, 08 Jul 2006 12:54:33 +0200
changeset 20046 9c8909fc5865
parent 19967 33da452f0abe
child 20076 def4ad161528
permissions -rw-r--r--
Goal.prove_global;
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
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    23
  val proper_name: string -> string;
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
    24
  val extr_typ: theory -> thm -> typ;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    25
  val common_typ: theory -> (thm -> typ) -> thm list -> thm list;
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
    26
  val preprocess: theory -> thm list -> thm list;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    27
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
    28
  val get_funs: theory -> string * typ -> thm list;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    29
  val get_datatypes: theory -> string
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    30
    -> (((string * sort) list * (string * typ list) list) * thm list) option;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    31
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    32
  (*
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    33
  type thmtab;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    34
  val get_thmtab: (string * typ) list -> theory -> thmtab * theory;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    35
  val get_cons: thmtab -> string -> string option;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    36
  val get_dtyp: thmtab -> string -> (string * sort) list * (string * typ list) list;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    37
  val get_thms: thmtab -> string * typ -> typ * thm list;
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
  
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    40
  val print_thms: theory -> unit;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    41
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    42
  val init_obj: (thm * thm) * (thm * thm) -> theory -> theory;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    43
  val debug: bool ref;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    44
  val debug_msg: ('a -> string) -> 'a -> 'a;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    45
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    46
end;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    47
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    48
structure CodegenTheorems: CODEGEN_THEOREMS =
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    49
struct
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    50
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    51
(** preliminaries **)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    52
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    53
(* diagnostics *)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
    54
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    55
val debug = ref false;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    56
fun debug_msg f x = (if !debug then Output.debug (f x) else (); x);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    57
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    58
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    59
(* auxiliary *)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    60
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    61
fun proper_name s =
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    62
  let
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    63
    fun replace_invalid c =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    64
      if (Char.isAlphaNum o the o Char.fromString) c orelse c = "'"
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    65
        andalso not (NameSpace.separator = c)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    66
      then c
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    67
      else "_";
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    68
    fun contract "_" (acc as "_" :: _) = acc
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    69
      | contract c acc = c :: acc;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    70
    fun contract_underscores s =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    71
      implode (fold_rev contract (explode s) []);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    72
    fun ensure_char s =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    73
      if forall (Char.isDigit o the o Char.fromString) (explode s)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    74
        then prefix "x" s
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    75
        else s
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    76
  in
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    77
    s
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    78
    |> translate_string replace_invalid
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    79
    |> contract_underscores
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    80
    |> ensure_char
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    81
  end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    82
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    83
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    84
fun getf_first [] _ = NONE
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    85
  | getf_first (f::fs) x = case f x
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    86
     of NONE => getf_first fs x
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    87
      | y as SOME x => y;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    88
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    89
fun getf_first_list [] x = []
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    90
  | getf_first_list (f::fs) x = case f x
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    91
     of [] => getf_first_list fs x
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
    92
      | xs => xs;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    93
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    94
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    95
(* object logic setup *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    96
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    97
structure CodegenTheoremsSetup = TheoryDataFun
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
    98
(struct
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
    99
  val name = "Pure/codegen_theorems_setup";
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   100
  type T = ((string * thm) * ((string * string) * (string * string))) option;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   101
  val empty = NONE;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   102
  val copy = I;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   103
  val extend = I;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   104
  fun merge pp = merge_opt (eq_pair (eq_pair (op =) eq_thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   105
    (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
   106
  fun print thy data = ();
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   107
end);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   108
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   109
val _ = Context.add_setup CodegenTheoremsSetup.init;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   110
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   111
fun init_obj ((TrueI, FalseE), (conjI, atomize_eq)) thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   112
  case CodegenTheoremsSetup.get thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   113
   of SOME _ => error "code generator already set up for object logic"
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   114
    | NONE => 
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   115
        let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   116
          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
   117
          fun dest_TrueI thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   118
            Drule.plain_prop_of thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   119
            |> ObjectLogic.drop_judgment thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   120
            |> Term.dest_Const
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   121
            |> apsnd (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   122
                  Term.dest_Type
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   123
                  #> fst
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   124
              );
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   125
          fun dest_FalseE thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   126
            Drule.plain_prop_of thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   127
            |> Logic.dest_implies
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   128
            |> apsnd (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   129
                 ObjectLogic.drop_judgment thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   130
                 #> Term.dest_Var
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   131
               )
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   132
            |> fst
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   133
            |> ObjectLogic.drop_judgment thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   134
            |> Term.dest_Const
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   135
            |> fst;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   136
          fun dest_conjI thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   137
            Drule.plain_prop_of thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   138
            |> strip_implies
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   139
            |> apfst (map (ObjectLogic.drop_judgment thy #> Term.dest_Var))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   140
            |> apsnd (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   141
                 ObjectLogic.drop_judgment thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   142
                 #> Term.strip_comb
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   143
                 #> apsnd (map Term.dest_Var)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   144
                 #> apfst Term.dest_Const
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
            |> (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
   147
          fun dest_atomize_eq thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   148
            Drule.plain_prop_of thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   149
            |> Logic.dest_equals
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   150
            |> apfst (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   151
                 ObjectLogic.drop_judgment thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   152
                 #> Term.strip_comb
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   153
                 #> apsnd (map Term.dest_Var)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   154
                 #> apfst Term.dest_Const
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
            |> apsnd (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   157
                 Logic.dest_equals
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   158
                 #> apfst Term.dest_Var
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   159
                 #> apsnd Term.dest_Var
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
            |> (fn (((eq, _), v2), (v1a as (_, TVar (_, sort)), v1b)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   162
                 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
   163
        in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   164
          ((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
   165
          handle _ => error "bad code generator setup")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   166
          |> (fn ((tr, b), [fl, con, eq]) => CodegenTheoremsSetup.put
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   167
               (SOME ((b, atomize_eq), ((tr, fl), (con, eq)))) thy)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   168
        end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   169
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   170
fun get_obj thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   171
  case CodegenTheoremsSetup.get thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   172
   of SOME ((b, atomize), x) => ((Type (b, []), atomize) ,x)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   173
    | NONE => error "no object logic setup for code theorems";
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   174
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   175
fun mk_true thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   176
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   177
    val ((b, _), ((tr, fl), (con, eq))) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   178
  in Const (tr, b) end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   179
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   180
fun mk_false thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   181
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   182
    val ((b, _), ((tr, fl), (con, eq))) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   183
  in Const (fl, b) end;
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 mk_obj_conj thy (x, y) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   186
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   187
    val ((b, _), ((tr, fl), (con, eq))) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   188
  in Const (con, b --> b --> b) $ x $ y end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   189
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   190
fun mk_obj_eq thy (x, y) =
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 ((b, _), ((tr, fl), (con, eq))) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   193
  in Const (eq, type_of x --> type_of y --> b) $ x $ y end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   194
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   195
fun is_obj_eq thy c =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   196
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   197
    val ((b, _), ((tr, fl), (con, eq))) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   198
  in c = eq end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   199
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   200
fun mk_func thy ((x, y), rhs) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   201
  Logic.mk_equals (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   202
    (mk_obj_eq thy (x, y)),
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   203
    rhs
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   204
  );
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   205
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   206
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   207
(* theorem purification *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   208
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   209
fun err_thm msg thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   210
  error (msg ^ ": " ^ string_of_thm thm);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   211
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   212
fun abs_norm thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   213
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   214
    fun expvars t =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   215
      let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   216
        val lhs = (fst o Logic.dest_equals) t;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   217
        val tys = (fst o strip_type o type_of) lhs;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   218
        val used = fold_aterms (fn Var ((v, _), _) => insert (op =) v | _ => I) lhs [];
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   219
        val vs = Term.invent_names used "x" (length tys);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   220
      in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   221
        map2 (fn v => fn ty => Var ((v, 0), ty)) vs tys
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   222
      end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   223
    fun expand ct thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   224
      Thm.combination thm (Thm.reflexive ct);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   225
    fun beta_norm thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   226
      thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   227
      |> prop_of
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   228
      |> Logic.dest_equals
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   229
      |> fst
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   230
      |> cterm_of thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   231
      |> Thm.beta_conversion true
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   232
      |> Thm.symmetric
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   233
      |> (fn thm' => Thm.transitive thm' thm);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   234
  in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   235
    thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   236
    |> fold (expand o cterm_of thy) ((expvars o prop_of) thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   237
    |> beta_norm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   238
  end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   239
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   240
fun canonical_tvars thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   241
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   242
    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
   243
      if v = v' orelse member (op =) set v then s
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   244
        else let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   245
          val ty = TVar (v_i, sort)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   246
        in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   247
          (maxidx + 1, v :: set,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   248
            (ctyp_of thy ty, ctyp_of thy (TVar ((v', maxidx), sort))) :: acc)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   249
        end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   250
    val lower_name = (prefix "'" o implode o map (Char.toString o Char.toLower o the o Char.fromString)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   251
      o explode o proper_name o unprefix "'");
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   252
    fun tvars_of thm = (fold_types o fold_atyps)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   253
      (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
   254
        | _ => I) (prop_of thm) [];
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   255
    val maxidx = Thm.maxidx_of thm + 1;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   256
    val (_, _, inst) = fold mk_inst (tvars_of thm) (maxidx + 1, [], []);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   257
  in Thm.instantiate (inst, []) thm end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   258
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   259
fun canonical_vars thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   260
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   261
    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
   262
      if v = v' orelse member (op =) set v then s
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   263
        else let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   264
          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
   265
        in 
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   266
          (maxidx + 1,  v :: set,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   267
            (cterm_of thy t, cterm_of thy (Var ((v', maxidx), ty))) :: acc)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   268
        end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   269
    val lower_name = (implode o map (Char.toString o Char.toLower o the o Char.fromString)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   270
      o explode o proper_name);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   271
    fun vars_of thm = fold_aterms
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   272
      (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
   273
        | _ => I) (prop_of thm) [];
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   274
    val maxidx = Thm.maxidx_of thm + 1;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   275
    val (_, _, inst) = fold mk_inst (vars_of thm) (maxidx + 1, [], []);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   276
  in Thm.instantiate ([], inst) thm end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   277
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   278
fun drop_redundant thy eqs =
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   279
  let
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   280
    val matches = curry (Pattern.matches thy o
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   281
      pairself (fst o Logic.dest_equals o prop_of))
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   282
    fun drop eqs [] = eqs
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   283
      | drop eqs (eq::eqs') =
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   284
          drop (eq::eqs) (filter_out (matches eq) eqs')
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   285
  in drop [] eqs end;
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   286
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   287
fun make_eq thy = 
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   288
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   289
    val ((_, atomize), _) = get_obj thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   290
  in rewrite_rule [atomize] end;
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 dest_eq thy thm =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   293
  case try (make_eq thy #> Drule.plain_prop_of
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   294
   #> ObjectLogic.drop_judgment thy #> Logic.dest_equals) thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   295
   of SOME eq => (eq, thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   296
    | NONE => err_thm "not an equation" thm;
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 dest_fun thy thm =
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
    fun dest_fun' ((lhs, _), thm) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   301
      case try (dest_Const o fst o strip_comb) lhs
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   302
       of SOME (c, ty) => (c, (ty, thm))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   303
        | NONE => err_thm "not a function equation" thm;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   304
  in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   305
    thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   306
    |> dest_eq thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   307
    |> dest_fun'
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   308
  end;
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
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   311
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   312
(** theory data **)
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   313
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   314
(* data structures *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   315
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   316
fun merge' eq (xys as (xs, ys)) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   317
  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
   318
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   319
fun alist_merge' eq_key eq (xys as (xs, ys)) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   320
  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
   321
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   322
fun list_symtab_join' eq (xyt as (xt, yt)) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   323
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   324
    val xc = Symtab.keys xt;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   325
    val yc = Symtab.keys yt;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   326
    val zc = filter (member (op =) yc) xc;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   327
    val wc = subtract (op =) zc xc @ subtract (op =) zc yc;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   328
    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
   329
      then NONE else SOME c;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   330
  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
   331
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   332
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
   333
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   334
val mk_notify = Notify;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   335
fun map_notify f (Notify notify) = mk_notify (f notify);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   336
fun merge_notify pp (Notify notify1, Notify notify2) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   337
  mk_notify (AList.merge (op =) (K true) (notify1, notify2));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   338
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   339
datatype preproc = Preproc of {
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   340
  preprocs: (serial * (theory -> thm list -> thm list)) list,
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   341
  unfolds: thm list
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   342
};
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   343
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   344
fun mk_preproc (preprocs, unfolds) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   345
  Preproc { preprocs = preprocs, unfolds = unfolds };
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   346
fun map_preproc f (Preproc { preprocs, unfolds }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   347
  mk_preproc (f (preprocs, unfolds));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   348
fun merge_preproc _ (Preproc { preprocs = preprocs1, unfolds = unfolds1 },
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   349
  Preproc { preprocs = preprocs2, unfolds = unfolds2 }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   350
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   351
      val (dirty1, preprocs) = alist_merge' (op =) (K true) (preprocs1, preprocs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   352
      val (dirty2, unfolds) = merge' eq_thm (unfolds1, unfolds2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   353
    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
   354
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   355
datatype extrs = Extrs of {
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   356
  funs: (serial * (theory -> string * typ -> thm list)) list,
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   357
  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
   358
};
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   359
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   360
fun mk_extrs (funs, datatypes) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   361
  Extrs { funs = funs, datatypes = datatypes };
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   362
fun map_extrs f (Extrs { funs, datatypes }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   363
  mk_extrs (f (funs, datatypes));
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   364
fun merge_extrs _ (Extrs { funs = funs1, datatypes = datatypes1 },
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   365
  Extrs { funs = funs2, datatypes = datatypes2 }) =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   366
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   367
      val (dirty1, funs) = alist_merge' (op =) (K true) (funs1, funs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   368
      val (dirty2, datatypes) = alist_merge' (op =) (K true) (datatypes1, datatypes2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   369
    in (dirty1 orelse dirty2, mk_extrs (funs, datatypes)) end;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   370
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   371
datatype funthms = Funthms of {
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   372
  dirty: string list,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   373
  funs: thm list Symtab.table
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   374
};
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   375
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   376
fun mk_funthms (dirty, funs) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   377
  Funthms { dirty = dirty, funs = funs };
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   378
fun map_funthms f (Funthms { dirty, funs }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   379
  mk_funthms (f (dirty, funs));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   380
fun merge_funthms _ (Funthms { dirty = dirty1, funs = funs1 },
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   381
  Funthms { dirty = dirty2, funs = funs2 }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   382
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   383
      val (dirty3, funs) = list_symtab_join' eq_thm (funs1, funs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   384
    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
   385
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   386
datatype T = T of {
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   387
  dirty: bool,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   388
  notify: notify,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   389
  preproc: preproc,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   390
  extrs: extrs,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   391
  funthms: funthms
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   392
};
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   393
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   394
fun mk_T ((dirty, notify), (preproc, (extrs, funthms))) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   395
  T { dirty = dirty, notify = notify, preproc = preproc, extrs = extrs, funthms = funthms };
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   396
fun map_T f (T { dirty, notify, preproc, extrs, funthms }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   397
  mk_T (f ((dirty, notify), (preproc, (extrs, funthms))));
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   398
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
   399
  T { dirty = dirty2, notify = notify2, preproc = preproc2, extrs = extrs2, funthms = funthms2 }) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   400
    let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   401
      val (dirty3, preproc) = merge_preproc pp (preproc1, preproc2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   402
      val (dirty4, extrs) = merge_extrs pp (extrs1, extrs2);
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   403
    in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   404
      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
   405
        (preproc, (extrs, merge_funthms pp (funthms1, funthms2))))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   406
    end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   407
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   408
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   409
(* setup *)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   410
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   411
structure CodegenTheoremsData = TheoryDataFun
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   412
(struct
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   413
  val name = "Pure/codegen_theorems_data";
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   414
  type T = T;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   415
  val empty = mk_T ((false, mk_notify []), (mk_preproc ([], []),
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   416
    (mk_extrs ([], []), mk_funthms ([], Symtab.empty))));
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   417
  val copy = I;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   418
  val extend = I;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   419
  val merge = merge_T;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   420
  fun print (thy : theory) (data : T) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   421
    let
19436
3f5835aac3ce ignore sort constraints of consts declarations;
wenzelm
parents: 19341
diff changeset
   422
      val pretty_thm = ProofContext.pretty_thm (ProofContext.init thy);
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   423
      val funthms = (fn T { funthms, ... } => funthms) data;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   424
      val funs = (Symtab.dest o (fn Funthms { funs, ... } => funs)) funthms;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   425
      val preproc = (fn T { preproc, ... } => preproc) data;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   426
      val unfolds = (fn Preproc { unfolds, ... } => unfolds) preproc;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   427
    in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   428
      (Pretty.writeln o Pretty.block o Pretty.fbreaks) ([
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   429
        Pretty.str "code generation theorems:",
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   430
        Pretty.str "function theorems:" ] @
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   431
        (*Pretty.fbreaks ( *)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   432
          map (fn (c, thms) => 
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   433
            (Pretty.block o Pretty.fbreaks) (
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   434
              Pretty.str c :: map pretty_thm (rev thms)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   435
            )
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   436
          ) funs
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   437
        (*) *) @ [
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   438
        Pretty.fbrk,
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   439
        Pretty.block (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   440
          Pretty.str "unfolding theorems:"
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   441
          :: Pretty.fbrk
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   442
          :: (Pretty.fbreaks o map pretty_thm) unfolds
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   443
      )])
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   444
    end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   445
end);
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   446
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   447
val _ = Context.add_setup CodegenTheoremsData.init;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   448
val print_thms = CodegenTheoremsData.print;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   449
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   450
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   451
(* accessors *)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   452
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   453
local
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   454
  val the_preproc = (fn T { preproc = Preproc preproc, ... } => preproc) o CodegenTheoremsData.get;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   455
  val the_extrs = (fn T { extrs = Extrs extrs, ... } => extrs) o CodegenTheoremsData.get;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   456
  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
   457
in
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   458
  val is_dirty = (fn T { dirty = dirty, ... } => dirty) o CodegenTheoremsData.get;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   459
  val the_dirty_consts = (fn { dirty = dirty, ... } => dirty) o the_funthms;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   460
  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
   461
  val the_preprocs = (fn { preprocs, ... } => map snd preprocs) o the_preproc;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   462
  val the_unfolds = (fn { unfolds, ... } => unfolds) o the_preproc;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   463
  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
   464
  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
   465
  val the_funs = (fn { funs, ... } => funs) o the_funthms;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   466
end (*local*);
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   467
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   468
val map_data = CodegenTheoremsData.map o map_T;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   469
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   470
(* notifiers *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   471
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   472
fun all_typs thy c =
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   473
  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
   474
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   475
fun add_notify f =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   476
  map_data (fn ((dirty, notify), x) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   477
    ((dirty, notify |> map_notify (cons (serial (), f))), x));
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
fun get_reset_dirty thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   480
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   481
    val dirty = is_dirty thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   482
    val dirty_const = if dirty then [] else the_dirty_consts thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   483
  in
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   484
    thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   485
    |> map_data (fn ((_, notify), (procs, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   486
         ((false, notify), (procs, (extrs, funthms |> map_funthms (fn (_, funs) => ([], funs))))))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   487
    |> pair (dirty, dirty_const)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   488
  end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   489
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   490
fun notify_all c thy =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   491
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   492
  |> get_reset_dirty
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   493
  |-> (fn (true, _) => fold (fn f => f NONE) (the_notify thy)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   494
        | (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
   495
            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
   496
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   497
fun notify_dirty thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   498
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   499
  |> get_reset_dirty
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   500
  |-> (fn (true, _) => fold (fn f => f NONE) (the_notify thy)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   501
        | (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
   502
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   503
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   504
(* modifiers *)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   505
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   506
fun add_preproc f =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   507
  map_data (fn (x, (preproc, y)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   508
    (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
   509
  #> notify_all NONE;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   510
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   511
fun add_fun_extr f =
19597
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 |> map_extrs (fn (funs, datatypes) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   514
      ((serial (), f) :: funs, datatypes)), funthms))))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   515
  #> notify_all NONE;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   516
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   517
fun add_datatype_extr f =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   518
  map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   519
    (x, (preproc, (extrs |> map_extrs (fn (funs, datatypes) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   520
      (funs, (serial (), f) :: datatypes)), funthms))))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   521
  #> notify_all NONE;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   522
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   523
fun add_fun thm thy =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   524
  case dest_fun thy thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   525
   of (c, _) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   526
    thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   527
    |> map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   528
        (x, (preproc, (extrs, funthms |> map_funthms (fn (dirty, funs) =>
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   529
          (dirty, funs |> Symtab.default (c, []) |> Symtab.map_entry c (cons thm)))))))
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   530
    |> notify_all (SOME c);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   531
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   532
fun del_fun thm thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   533
  case dest_fun thy thm
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   534
   of (c, _) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   535
    thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   536
    |> map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   537
        (x, (preproc, (extrs, funthms |> map_funthms (fn (dirty, funs) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   538
          (dirty, funs |> Symtab.map_entry c (remove eq_thm thm)))))))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   539
    |> notify_all (SOME c);
19341
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
fun add_unfold thm thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   542
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   543
  |> tap (fn thy => dest_eq thy thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   544
  |> map_data (fn (x, (preproc, y)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   545
       (x, (preproc |> map_preproc (fn (preprocs, unfolds) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   546
         (preprocs, thm :: unfolds)), y)))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   547
  |> notify_all NONE;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   548
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   549
fun del_unfold thm = 
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   550
  map_data (fn (x, (preproc, y)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   551
       (x, (preproc |> map_preproc (fn (preprocs, unfolds) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   552
         (preprocs, remove eq_thm thm unfolds)), y)))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   553
  #> notify_all NONE;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   554
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   555
fun purge_defs (c, ty) thy =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   556
  thy
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   557
  |> map_data (fn (x, (preproc, (extrs, funthms))) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   558
      (x, (preproc, (extrs, funthms |> map_funthms (fn (dirty, funs) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   559
        (dirty, funs |> Symtab.map_entry c
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   560
            (filter (fn thm => Sign.typ_instance thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   561
              ((fst o snd o dest_fun thy) thm, ty)))))))))
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   562
  |> notify_all (SOME c);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   563
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   564
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   565
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   566
(** theorem handling **)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   567
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   568
(* preprocessing *)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   569
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   570
fun extr_typ thy thm = case dest_fun thy thm
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   571
 of (_, (ty, _)) => ty;
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   572
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   573
fun common_typ thy _ [] = []
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   574
  | common_typ thy _ [thm] = [thm]
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   575
  | common_typ thy extract_typ thms =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   576
      let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   577
        fun incr_thm thm max =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   578
          let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   579
            val thm' = incr_indexes max thm;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   580
            val max' = (maxidx_of_typ o type_of o Drule.plain_prop_of) thm' + 1;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   581
          in (thm', max') end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   582
        val (thms', maxidx) = fold_map incr_thm thms 0;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   583
        val (ty1::tys) = map extract_typ thms;
19436
3f5835aac3ce ignore sort constraints of consts declarations;
wenzelm
parents: 19341
diff changeset
   584
        fun unify ty = Sign.typ_unify thy (ty1, ty);
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   585
        val (env, _) = fold unify tys (Vartab.empty, maxidx)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   586
        val instT = Vartab.fold (fn (x_i, (sort, ty)) =>
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   587
          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
   588
      in map (Thm.instantiate (instT, [])) thms end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   589
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   590
fun preprocess thy thms =
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   591
  let
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   592
    fun burrow_thms f [] = []
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   593
      | burrow_thms f thms = 
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   594
          thms
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   595
          |> Conjunction.intr_list
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   596
          |> f
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   597
          |> Conjunction.elim_list;
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   598
    fun cmp_thms (thm1, thm2) =
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   599
      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
   600
    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
   601
     of (ct', [ct1, ct2]) => (case term_of ct'
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   602
         of Const ("==", _) =>
19967
33da452f0abe slight refinements
haftmann
parents: 19953
diff changeset
   603
              Thm.equal_elim (combination (combination (reflexive ct') (reflexive ct1))
33da452f0abe slight refinements
haftmann
parents: 19953
diff changeset
   604
                (conv ct2)) thm
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   605
          | _ => raise ERROR "rewrite_rhs")
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   606
      | _ => raise ERROR "rewrite_rhs");
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   607
    fun unvarify thms =
19897
fe661eb3b0e7 ProofContext: moved variable operations to struct Variable;
wenzelm
parents: 19884
diff changeset
   608
      #1 (Variable.import true thms (ProofContext.init thy));
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   609
    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
   610
  in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   611
    thms
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   612
    |> map (make_eq thy)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   613
    |> map (Thm.transfer thy)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   614
    |> fold (fn f => f thy) (the_preprocs thy)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   615
    |> map (rewrite_rhs unfold_thms)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   616
    |> debug_msg (fn _ => "[cg_thm] sorting")
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   617
    |> debug_msg (commas o map string_of_thm)
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   618
    |> sort (make_ord cmp_thms)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   619
    |> debug_msg (fn _ => "[cg_thm] common_typ")
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   620
    |> debug_msg (commas o map string_of_thm)
19953
2f54a51f1801 class package refinements, slight code generation refinements
haftmann
parents: 19897
diff changeset
   621
    |> common_typ thy (extr_typ thy)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   622
    |> debug_msg (fn _ => "[cg_thm] abs_norm")
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   623
    |> debug_msg (commas o map string_of_thm)
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   624
    |> map (abs_norm thy)
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   625
    |> burrow_thms (
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   626
        debug_msg (fn _ => "[cg_thm] canonical tvars")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   627
        #> debug_msg (string_of_thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   628
        #> canonical_tvars thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   629
        #> debug_msg (fn _ => "[cg_thm] canonical vars")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   630
        #> debug_msg (string_of_thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   631
        #> canonical_vars thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   632
        #> debug_msg (fn _ => "[cg_thm] zero indices")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   633
        #> debug_msg (string_of_thm)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   634
        #> Drule.zero_var_indexes
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   635
       )
19884
a7be206d8655 improvements in code generator
haftmann
parents: 19883
diff changeset
   636
    |> drop_redundant thy
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   637
  end;
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   638
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   639
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   640
(* retrieval *)
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   641
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   642
fun get_funs thy (c, ty) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   643
  let
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   644
    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
   645
    val filter_typ = map_filter (fn (_, (ty', thm)) =>
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   646
      if Sign.typ_instance thy (ty, ty')
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   647
      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
   648
    fun get_funs (c, ty) =
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   649
      (these o Symtab.lookup (the_funs thy)) c
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   650
      |> debug_msg (fn _ => "[cg_thm] trying funs")
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   651
      |> map (dest_fun thy)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   652
      |> filter_typ;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   653
    fun get_extr (c, ty) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   654
      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
   655
      |> debug_msg (fn _ => "[cg_thm] trying extr")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   656
      |> map (dest_fun thy)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   657
      |> filter_typ;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   658
    fun get_spec (c, ty) =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   659
      Theory.definitions_of thy c
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   660
      |> debug_msg (fn _ => "[cg_thm] trying spec")
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   661
      (* FIXME avoid dynamic name space lookup!? (via Thm.get_axiom_i etc.??) *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   662
      |> maps (PureThy.get_thms thy o Name o #name)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   663
      |> map_filter (try (dest_fun thy))
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   664
      |> filter_typ;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   665
  in
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   666
    getf_first_list [get_funs, get_extr, get_spec] (c, ty)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   667
    |> 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
   668
    |> preprocess thy
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   669
  end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   670
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   671
fun get_datatypes thy dtco =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   672
  let
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   673
    val _ = debug_msg (fn _ => "[cg_thm] datatype " ^ dtco) ()
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   674
    val truh = mk_true thy;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   675
    val fals = mk_false thy;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   676
    fun mk_lhs vs ((co1, tys1), (co2, tys2)) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   677
      let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   678
        val dty = Type (dtco, map TFree vs);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   679
        val (xs1, xs2) = chop (length tys1) (Term.invent_names [] "x" (length tys1 + length tys2));
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   680
        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
   681
        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
   682
        fun zip_co co xs tys = list_comb (Const (co,
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   683
          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
   684
      in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   685
        ((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
   686
      end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   687
    fun mk_rhs [] [] = truh
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   688
      | 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
   689
    fun mk_eq vs (args as ((co1, _), (co2, _))) (inj, dist) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   690
      if co1 = co2
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   691
        then let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   692
          val ((fs1, fs2), lhs) = mk_lhs vs args;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   693
          val rhs = mk_rhs fs1 fs2;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   694
        in (mk_func thy (lhs, rhs) :: inj, dist) end
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   695
        else let
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   696
          val (_, lhs) = mk_lhs vs args;
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   697
        in (inj, mk_func thy (lhs, fals) :: dist) end;
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   698
    fun mk_eqs (vs, cos) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   699
      let val cos' = rev cos 
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   700
      in (op @) (fold (mk_eq vs) (product cos' cos') ([], [])) end;
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   701
    fun mk_eq_thms tac vs_cos =
20046
9c8909fc5865 Goal.prove_global;
wenzelm
parents: 19967
diff changeset
   702
      map (fn t => Goal.prove_global thy [] []
9c8909fc5865 Goal.prove_global;
wenzelm
parents: 19967
diff changeset
   703
        (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
   704
  in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   705
    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
   706
     of NONE => NONE
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   707
      | 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
   708
  end;
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   709
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   710
fun get_eq thy (c, ty) =
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   711
  if is_obj_eq thy c
19816
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   712
  then case strip_type ty
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   713
   of (Type (tyco, _) :: _, _) =>
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   714
     (case get_datatypes thy tyco
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   715
       of SOME (_, thms) => thms
a8c8ed1c85e0 removed 'primitive definitions' added (non)strict generation, minor fixes
haftmann
parents: 19806
diff changeset
   716
        | _ => [])
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   717
    | _ => []
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   718
  else [];
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   719
19597
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   720
type thmtab = ((thm list Typtab.table Symtab.table
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   721
  * string Symtab.table)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   722
  * ((string * sort) list * (string * typ list) list) Symtab.table);
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
(*
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   725
fun mk_thmtab thy cs =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   726
  let
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   727
    fun add_c (c, ty) gr =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   728
    (*
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   729
      Das ist noch viel komplizierter: Zyklen
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   730
      und die aktuellen Instantiierungen muss man auch noch mitschleppen
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   731
      man sieht: man braucht zusätzlich ein Mapping
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   732
        c ~> [ty] (Symtab)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   733
      wobei dort immer die bislang allgemeinsten... ???
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   734
    *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   735
    (*
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   736
      thm holen für bestimmten typ
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   737
      typ dann behalten
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   738
      typ normalisieren
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   739
      damit haben wir den key
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   740
      hier den check machen, ob schon prozessiert wurde
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   741
      NEIN:
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   742
        ablegen
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   743
        consts der rechten Seiten
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   744
        in die Rekursion gehen für alles
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   745
      JA:
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   746
        fertig
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   747
    *)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   748
  in fold add_c cs Constgraph.empty end;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   749
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   750
fun get_thmtab cs thy =
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   751
  thy
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   752
  |> get_reset_dirty
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   753
  |-> (fn _ => I)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   754
  |> `mk_thmtab;
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   755
*)
8ced57ffc090 major refinement of codegen_theorems.ML
haftmann
parents: 19571
diff changeset
   756
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   757
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   758
(** code attributes and setup **)
19280
5091dc43817b slight improvement in serializer, stub for code generator theorems added
haftmann
parents:
diff changeset
   759
19341
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   760
local
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   761
  fun add_simple_attribute (name, f) =
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   762
    (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
   763
      (Context.map_theory o f);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   764
in
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   765
  val _ = map (Context.add_setup o add_simple_attribute) [
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   766
    ("fun", add_fun),
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   767
    ("unfold", (fn thm => Codegen.add_unfold thm #> add_unfold thm)),
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   768
    ("unfolt", add_unfold),
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   769
    ("nofold", del_unfold)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   770
  ]
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   771
end; (*local*)
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   772
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   773
val _ = Context.add_setup (add_fun_extr get_eq);
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   774
3414c04fbc39 added definitional code generator module: codegen_theorems.ML
haftmann
parents: 19280
diff changeset
   775
end; (*struct*)