src/HOL/Tools/inductive_codegen.ML
author berghofe
Fri, 13 Apr 2007 15:43:25 +0200
changeset 22661 f3ba63a2663e
parent 22642 bfdb29f11eb4
child 22791 992222f3d2eb
permissions -rw-r--r--
Removed erroneous application of rev in get_clauses that caused introduction rules taken from the InductivePackage database to be in the wrong order.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12453
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
     1
(*  Title:      HOL/inductive_codegen.ML
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
     2
    ID:         $Id$
11539
0f17da240450 tuned headers;
wenzelm
parents: 11537
diff changeset
     3
    Author:     Stefan Berghofer, TU Muenchen
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
     4
11539
0f17da240450 tuned headers;
wenzelm
parents: 11537
diff changeset
     5
Code generator for inductive predicates.
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
     6
*)
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
     7
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
     8
signature INDUCTIVE_CODEGEN =
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
     9
sig
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    10
  val add : string option -> int option -> attribute
18708
4b3dadb4fe33 setup: theory -> theory;
wenzelm
parents: 18388
diff changeset
    11
  val setup : theory -> theory
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
    12
end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
    13
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
    14
structure InductiveCodegen : INDUCTIVE_CODEGEN =
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
    15
struct
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
    16
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
    17
open Codegen;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
    18
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    19
(* read off parameters of inductive predicate from raw induction rule *)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    20
fun params_of induct =
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    21
  let
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    22
    val (_ $ t $ u :: _) =
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    23
      HOLogic.dest_conj (HOLogic.dest_Trueprop (concl_of induct));
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    24
    val (_, ts) = strip_comb t;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    25
    val (_, us) = strip_comb u
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    26
  in
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    27
    List.take (ts, length ts - length us)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    28
  end;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    29
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
    30
(**** theory data ****)
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
    31
18930
29d39c10822e replaced Symtab.merge_multi by local merge_rules;
wenzelm
parents: 18928
diff changeset
    32
fun merge_rules tabs =
22642
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
    33
  Symtab.join (fn _ => AList.merge (Thm.eq_thm_prop) (K true)) tabs;
18930
29d39c10822e replaced Symtab.merge_multi by local merge_rules;
wenzelm
parents: 18928
diff changeset
    34
16424
18a07ad8fea8 accomodate change of TheoryDataFun;
wenzelm
parents: 15660
diff changeset
    35
structure CodegenData = TheoryDataFun
18a07ad8fea8 accomodate change of TheoryDataFun;
wenzelm
parents: 15660
diff changeset
    36
(struct
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
    37
  val name = "HOL/inductive_codegen";
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
    38
  type T =
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    39
    {intros : (thm * (string * int)) list Symtab.table,
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
    40
     graph : unit Graph.T,
16645
a152d6b21c31 Adapted to modular code generation.
berghofe
parents: 16424
diff changeset
    41
     eqns : (thm * string) list Symtab.table};
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
    42
  val empty =
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
    43
    {intros = Symtab.empty, graph = Graph.empty, eqns = Symtab.empty};
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
    44
  val copy = I;
16424
18a07ad8fea8 accomodate change of TheoryDataFun;
wenzelm
parents: 15660
diff changeset
    45
  val extend = I;
18a07ad8fea8 accomodate change of TheoryDataFun;
wenzelm
parents: 15660
diff changeset
    46
  fun merge _ ({intros=intros1, graph=graph1, eqns=eqns1},
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
    47
    {intros=intros2, graph=graph2, eqns=eqns2}) =
18930
29d39c10822e replaced Symtab.merge_multi by local merge_rules;
wenzelm
parents: 18928
diff changeset
    48
    {intros = merge_rules (intros1, intros2),
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
    49
     graph = Graph.merge (K true) (graph1, graph2),
18930
29d39c10822e replaced Symtab.merge_multi by local merge_rules;
wenzelm
parents: 18928
diff changeset
    50
     eqns = merge_rules (eqns1, eqns2)};
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
    51
  fun print _ _ = ();
16424
18a07ad8fea8 accomodate change of TheoryDataFun;
wenzelm
parents: 15660
diff changeset
    52
end);
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
    53
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
    54
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
    55
fun warn thm = warning ("InductiveCodegen: Not a proper clause:\n" ^
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
    56
  string_of_thm thm);
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
    57
14162
f05f299512e9 Fixed problem with "code ind" attribute that caused code generator to
berghofe
parents: 13105
diff changeset
    58
fun add_node (g, x) = Graph.new_node (x, ()) g handle Graph.DUP _ => g;
f05f299512e9 Fixed problem with "code ind" attribute that caused code generator to
berghofe
parents: 13105
diff changeset
    59
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    60
fun add optmod optnparms = Thm.declaration_attribute (fn thm => Context.mapping (fn thy =>
16645
a152d6b21c31 Adapted to modular code generation.
berghofe
parents: 16424
diff changeset
    61
  let
a152d6b21c31 Adapted to modular code generation.
berghofe
parents: 16424
diff changeset
    62
    val {intros, graph, eqns} = CodegenData.get thy;
a152d6b21c31 Adapted to modular code generation.
berghofe
parents: 16424
diff changeset
    63
    fun thyname_of s = (case optmod of
a152d6b21c31 Adapted to modular code generation.
berghofe
parents: 16424
diff changeset
    64
      NONE => thyname_of_const s thy | SOME s => s);
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    65
  in (case Option.map strip_comb (try HOLogic.dest_Trueprop (concl_of thm)) of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    66
      SOME (Const ("op =", _), [t, _]) => (case head_of t of
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
    67
        Const (s, _) =>
18728
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    68
          CodegenData.put {intros = intros, graph = graph,
22642
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
    69
             eqns = eqns |> Symtab.map_default (s, [])
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
    70
               (AList.update Thm.eq_thm_prop (thm, thyname_of s))} thy
18728
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    71
      | _ => (warn thm; thy))
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    72
    | SOME (Const (s, _), _) =>
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    73
        let
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    74
          val cs = foldr add_term_consts [] (prems_of thm);
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    75
          val rules = Symtab.lookup_list intros s;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    76
          val nparms = (case optnparms of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    77
            SOME k => k
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    78
          | NONE => (case rules of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    79
             [] => (case try (InductivePackage.the_inductive (ProofContext.init thy)) s of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    80
                 SOME (_, {raw_induct, ...}) => length (params_of raw_induct)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    81
               | NONE => 0)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    82
            | xs => snd (snd (snd (split_last xs)))))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    83
        in CodegenData.put
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    84
          {intros = intros |>
22642
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
    85
           Symtab.update (s, (AList.update Thm.eq_thm_prop
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
    86
             (thm, (thyname_of s, nparms)) rules)),
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    87
           graph = foldr (uncurry (Graph.add_edge o pair s))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    88
             (Library.foldl add_node (graph, s :: cs)) cs,
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    89
           eqns = eqns} thy
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    90
        end
18728
6790126ab5f6 simplified type attribute;
wenzelm
parents: 18708
diff changeset
    91
    | _ => (warn thm; thy))
20897
3f8d2834b2c4 attribute: Context.mapping;
wenzelm
parents: 20071
diff changeset
    92
  end) I);
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
    93
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
    94
fun get_clauses thy s =
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
    95
  let val {intros, graph, ...} = CodegenData.get thy
17412
e26cb20ef0cc TableFun/Symtab: curried lookup and update;
wenzelm
parents: 17261
diff changeset
    96
  in case Symtab.lookup intros s of
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    97
      NONE => (case try (InductivePackage.the_inductive (ProofContext.init thy)) s of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
    98
        NONE => NONE
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
    99
      | SOME ({names, ...}, {intrs, raw_induct, ...}) =>
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   100
          SOME (names, thyname_of_const s thy, length (params_of raw_induct),
22661
f3ba63a2663e Removed erroneous application of rev in get_clauses that caused
berghofe
parents: 22642
diff changeset
   101
            preprocess thy intrs))
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   102
    | SOME _ =>
16645
a152d6b21c31 Adapted to modular code generation.
berghofe
parents: 16424
diff changeset
   103
        let
a152d6b21c31 Adapted to modular code generation.
berghofe
parents: 16424
diff changeset
   104
          val SOME names = find_first
22642
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
   105
            (fn xs => member (op =) xs s) (Graph.strong_conn graph);
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
   106
          val intrs as (_, (thyname, nparms)) :: _ =
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
   107
            maps (the o Symtab.lookup intros) names;
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
   108
        in SOME (names, thyname, nparms, preprocess thy (map fst (rev intrs))) end
14162
f05f299512e9 Fixed problem with "code ind" attribute that caused code generator to
berghofe
parents: 13105
diff changeset
   109
  end;
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   110
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   111
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   112
(**** check if a term contains only constructor functions ****)
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   113
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   114
fun is_constrt thy =
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   115
  let
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   116
    val cnstrs = List.concat (List.concat (map
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   117
      (map (fn (_, (_, _, cs)) => map (apsnd length) cs) o #descr o snd)
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   118
      (Symtab.dest (DatatypePackage.get_datatypes thy))));
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   119
    fun check t = (case strip_comb t of
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   120
        (Var _, []) => true
17521
0f1c48de39f5 introduced AList module in favor of assoc etc.
haftmann
parents: 17412
diff changeset
   121
      | (Const (s, _), ts) => (case AList.lookup (op =) cnstrs s of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   122
            NONE => false
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   123
          | SOME i => length ts = i andalso forall check ts)
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   124
      | _ => false)
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   125
  in check end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   126
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   127
(**** check if a type is an equality type (i.e. doesn't contain fun) ****)
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   128
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   129
fun is_eqT (Type (s, Ts)) = s <> "fun" andalso forall is_eqT Ts
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   130
  | is_eqT _ = true;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   131
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   132
(**** mode inference ****)
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   133
15204
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   134
fun string_of_mode (iss, is) = space_implode " -> " (map
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   135
  (fn NONE => "X"
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   136
    | SOME js => enclose "[" "]" (commas (map string_of_int js)))
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   137
       (iss @ [SOME is]));
15204
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   138
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   139
fun print_modes modes = message ("Inferred modes:\n" ^
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   140
  space_implode "\n" (map (fn (s, ms) => s ^ ": " ^ commas (map
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   141
    string_of_mode ms)) modes));
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   142
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   143
val term_vs = map (fst o fst o dest_Var) o term_vars;
19046
bc5c6c9b114e removed distinct, renamed gen_distinct to distinct;
wenzelm
parents: 19025
diff changeset
   144
val terms_vs = distinct (op =) o List.concat o (map term_vs);
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   145
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   146
(** collect all Vars in a term (with duplicates!) **)
16861
7446b4be013b tuned fold on terms;
wenzelm
parents: 16645
diff changeset
   147
fun term_vTs tm =
7446b4be013b tuned fold on terms;
wenzelm
parents: 16645
diff changeset
   148
  fold_aterms (fn Var ((x, _), T) => cons (x, T) | _ => I) tm [];
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   149
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   150
fun get_args _ _ [] = ([], [])
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   151
  | get_args is i (x::xs) = (if i mem is then apfst else apsnd) (cons x)
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   152
      (get_args is (i+1) xs);
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   153
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   154
fun merge xs [] = xs
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   155
  | merge [] ys = ys
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   156
  | merge (x::xs) (y::ys) = if length x >= length y then x::merge xs (y::ys)
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   157
      else y::merge (x::xs) ys;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   158
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   159
fun subsets i j = if i <= j then
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   160
       let val is = subsets (i+1) j
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   161
       in merge (map (fn ks => i::ks) is) is end
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   162
     else [[]];
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   163
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   164
fun cprod ([], ys) = []
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   165
  | cprod (x :: xs, ys) = map (pair x) ys @ cprod (xs, ys);
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   166
15574
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
   167
fun cprods xss = foldr (map op :: o cprod) [[]] xss;
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   168
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   169
datatype mode = Mode of (int list option list * int list) * int list * mode option list;
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   170
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   171
fun modes_of modes t =
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   172
  let
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   173
    val ks = 1 upto length (binder_types (fastype_of t));
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   174
    val default = [Mode (([], ks), ks, [])];
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   175
    fun mk_modes name args = Option.map (List.concat o
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   176
      map (fn (m as (iss, is)) =>
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   177
        let
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   178
          val (args1, args2) =
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   179
            if length args < length iss then
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   180
              error ("Too few arguments for inductive predicate " ^ name)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   181
            else chop (length iss) args;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   182
          val k = length args2;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   183
          val prfx = 1 upto k
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   184
        in
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   185
          if not (is_prefix op = prfx is) then [] else
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   186
          let val is' = map (fn i => i - k) (List.drop (is, k))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   187
          in map (fn x => Mode (m, is', x)) (cprods (map
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   188
            (fn (NONE, _) => [NONE]
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   189
              | (SOME js, arg) => map SOME (List.filter
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   190
                  (fn Mode (_, js', _) => js=js') (modes_of modes arg)))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   191
                    (iss ~~ args1)))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   192
          end
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   193
        end)) (AList.lookup op = modes name)
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   194
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   195
  in (case strip_comb t of
14163
5ffa75ce4919 Improved handling of modes for equality predicate, to avoid ill-typed
berghofe
parents: 14162
diff changeset
   196
      (Const ("op =", Type (_, [T, _])), _) =>
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   197
        [Mode (([], [1]), [1], []), Mode (([], [2]), [2], [])] @
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   198
        (if is_eqT T then [Mode (([], [1, 2]), [1, 2], [])] else [])
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   199
    | (Const (name, _), args) => the_default default (mk_modes name args)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   200
    | (Var ((name, _), _), args) => the (mk_modes name args)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   201
    | (Free (name, _), args) => the (mk_modes name args)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   202
    | _ => default)
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   203
  end;
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   204
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   205
datatype indprem = Prem of term list * term | Sidecond of term;
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   206
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   207
fun select_mode_prem thy modes vs ps =
19861
620d90091788 tuned Seq/Envir/Unify interfaces;
wenzelm
parents: 19046
diff changeset
   208
  find_first (is_some o snd) (ps ~~ map
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   209
    (fn Prem (us, t) => find_first (fn Mode (_, is, _) =>
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   210
          let
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   211
            val (in_ts, out_ts) = get_args is 1 us;
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   212
            val (out_ts', in_ts') = List.partition (is_constrt thy) out_ts;
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   213
            val vTs = List.concat (map term_vTs out_ts');
18964
67f572e03236 renamed gen_duplicates to duplicates;
wenzelm
parents: 18930
diff changeset
   214
            val dupTs = map snd (duplicates (op =) vTs) @
17521
0f1c48de39f5 introduced AList module in favor of assoc etc.
haftmann
parents: 17412
diff changeset
   215
              List.mapPartial (AList.lookup (op =) vTs) vs;
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   216
          in
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   217
            terms_vs (in_ts @ in_ts') subset vs andalso
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   218
            forall (is_eqT o fastype_of) in_ts' andalso
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   219
            term_vs t subset vs andalso
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   220
            forall is_eqT dupTs
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   221
          end)
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   222
            (modes_of modes t handle Option => [Mode (([], []), [], [])])
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   223
      | Sidecond t => if term_vs t subset vs then SOME (Mode (([], []), [], []))
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   224
          else NONE) ps);
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   225
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   226
fun check_mode_clause thy arg_vs modes (iss, is) (ts, ps) =
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   227
  let
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   228
    val modes' = modes @ List.mapPartial
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   229
      (fn (_, NONE) => NONE | (v, SOME js) => SOME (v, [([], js)]))
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   230
        (arg_vs ~~ iss);
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   231
    fun check_mode_prems vs [] = SOME vs
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   232
      | check_mode_prems vs ps = (case select_mode_prem thy modes' vs ps of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   233
          NONE => NONE
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   234
        | SOME (x, _) => check_mode_prems
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   235
            (case x of Prem (us, _) => vs union terms_vs us | _ => vs)
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   236
            (filter_out (equal x) ps));
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   237
    val (in_ts, in_ts') = List.partition (is_constrt thy) (fst (get_args is 1 ts));
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   238
    val in_vs = terms_vs in_ts;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   239
    val concl_vs = terms_vs ts
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   240
  in
18964
67f572e03236 renamed gen_duplicates to duplicates;
wenzelm
parents: 18930
diff changeset
   241
    forall is_eqT (map snd (duplicates (op =) (List.concat (map term_vTs in_ts)))) andalso
15204
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   242
    forall (is_eqT o fastype_of) in_ts' andalso
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   243
    (case check_mode_prems (arg_vs union in_vs) ps of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   244
       NONE => false
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   245
     | SOME vs => concl_vs subset vs)
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   246
  end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   247
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   248
fun check_modes_pred thy arg_vs preds modes (p, ms) =
17521
0f1c48de39f5 introduced AList module in favor of assoc etc.
haftmann
parents: 17412
diff changeset
   249
  let val SOME rs = AList.lookup (op =) preds p
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   250
  in (p, List.filter (fn m => case find_index
15204
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   251
    (not o check_mode_clause thy arg_vs modes m) rs of
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   252
      ~1 => true
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   253
    | i => (message ("Clause " ^ string_of_int (i+1) ^ " of " ^
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   254
      p ^ " violates mode " ^ string_of_mode m); false)) ms)
d15f85347fcb - Inserted additional check for equality types in check_mode_clause that
berghofe
parents: 15126
diff changeset
   255
  end;
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   256
22642
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
   257
fun fixp f (x : (string * (int list option list * int list) list) list) =
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   258
  let val y = f x
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   259
  in if x = y then x else fixp f y end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   260
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   261
fun infer_modes thy extra_modes arities arg_vs preds = fixp (fn modes =>
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   262
  map (check_modes_pred thy arg_vs preds (modes @ extra_modes)) modes)
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   263
    (map (fn (s, (ks, k)) => (s, cprod (cprods (map
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   264
      (fn NONE => [NONE]
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   265
        | SOME k' => map SOME (subsets 1 k')) ks),
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   266
      subsets 1 k))) arities);
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   267
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   268
(**** code generation ****)
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   269
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   270
fun mk_eq (x::xs) =
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   271
  let fun mk_eqs _ [] = []
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   272
        | mk_eqs a (b::cs) = Pretty.str (a ^ " = " ^ b) :: mk_eqs b cs
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   273
  in mk_eqs x xs end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   274
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   275
fun mk_tuple xs = Pretty.block (Pretty.str "(" ::
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   276
  List.concat (separate [Pretty.str ",", Pretty.brk 1] (map single xs)) @
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   277
  [Pretty.str ")"]);
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   278
17521
0f1c48de39f5 introduced AList module in favor of assoc etc.
haftmann
parents: 17412
diff changeset
   279
fun mk_v ((names, vs), s) = (case AList.lookup (op =) vs s of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   280
      NONE => ((names, (s, [s])::vs), s)
20071
8f3e1ddb50e6 replaced Term.variant(list) by Name.variant(_list);
wenzelm
parents: 19861
diff changeset
   281
    | SOME xs => let val s' = Name.variant names s in
17521
0f1c48de39f5 introduced AList module in favor of assoc etc.
haftmann
parents: 17412
diff changeset
   282
        ((s'::names, AList.update (op =) (s, s'::xs) vs), s') end);
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   283
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   284
fun distinct_v (nvs, Var ((s, 0), T)) =
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   285
      apsnd (Var o rpair T o rpair 0) (mk_v (nvs, s))
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   286
  | distinct_v (nvs, t $ u) =
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   287
      let
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   288
        val (nvs', t') = distinct_v (nvs, t);
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   289
        val (nvs'', u') = distinct_v (nvs', u);
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   290
      in (nvs'', t' $ u') end
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   291
  | distinct_v x = x;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   292
15061
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   293
fun is_exhaustive (Var _) = true
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   294
  | is_exhaustive (Const ("Pair", _) $ t $ u) =
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   295
      is_exhaustive t andalso is_exhaustive u
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   296
  | is_exhaustive _ = false;
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   297
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   298
fun compile_match nvs eq_ps out_ps success_p can_fail =
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   299
  let val eqs = List.concat (separate [Pretty.str " andalso", Pretty.brk 1]
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   300
    (map single (List.concat (map (mk_eq o snd) nvs) @ eq_ps)));
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   301
  in
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   302
    Pretty.block
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   303
     ([Pretty.str "(fn ", mk_tuple out_ps, Pretty.str " =>", Pretty.brk 1] @
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   304
      (Pretty.block ((if eqs=[] then [] else Pretty.str "if " ::
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   305
         [Pretty.block eqs, Pretty.brk 1, Pretty.str "then "]) @
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   306
         (success_p ::
15061
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   307
          (if eqs=[] then [] else [Pretty.brk 1, Pretty.str "else Seq.empty"]))) ::
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   308
       (if can_fail then
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   309
          [Pretty.brk 1, Pretty.str "| _ => Seq.empty)"]
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   310
        else [Pretty.str ")"])))
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   311
  end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   312
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   313
fun modename module s (iss, is) gr =
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   314
  let val (gr', id) = if s = "op =" then (gr, ("", "equal"))
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   315
    else mk_const_id module s gr
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   316
  in (gr', space_implode "__"
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   317
    (mk_qual_id module id ::
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   318
      map (space_implode "_" o map string_of_int) (List.mapPartial I iss @ [is])))
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   319
  end;
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   320
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   321
fun mk_funcomp brack s k p = (if brack then parens else I)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   322
  (Pretty.block [Pretty.block ((if k = 0 then [] else [Pretty.str "("]) @
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   323
    separate (Pretty.brk 1) (Pretty.str s :: replicate k (Pretty.str "|> ???")) @
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   324
    (if k = 0 then [] else [Pretty.str ")"])), Pretty.brk 1, p]);
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   325
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   326
fun compile_expr thy defs dep module brack modes (gr, (NONE, t)) =
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   327
      apsnd single (invoke_codegen thy defs dep module brack (gr, t))
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   328
  | compile_expr _ _ _ _ _ _ (gr, (SOME _, Var ((name, _), _))) =
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   329
      (gr, [Pretty.str name])
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   330
  | compile_expr thy defs dep module brack modes (gr, (SOME (Mode (mode, _, ms)), t)) =
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   331
      (case strip_comb t of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   332
         (Const (name, _), args) =>
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   333
           if name = "op =" orelse AList.defined op = modes name then
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   334
             let
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   335
               val (args1, args2) = chop (length ms) args;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   336
               val (gr', (ps, mode_id)) = foldl_map
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   337
                   (compile_expr thy defs dep module true modes) (gr, ms ~~ args1) |>>>
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   338
                 modename module name mode;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   339
               val (gr'', ps') = foldl_map
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   340
                 (invoke_codegen thy defs dep module true) (gr', args2)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   341
             in (gr', (if brack andalso not (null ps andalso null ps') then
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   342
               single o parens o Pretty.block else I)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   343
                 (List.concat (separate [Pretty.brk 1]
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   344
                   ([Pretty.str mode_id] :: ps @ map single ps'))))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   345
             end
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   346
           else apsnd (single o mk_funcomp brack "??" (length (binder_types (fastype_of t))))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   347
             (invoke_codegen thy defs dep module true (gr, t))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   348
       | _ => apsnd (single o mk_funcomp brack "??" (length (binder_types (fastype_of t))))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   349
           (invoke_codegen thy defs dep module true (gr, t)));
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   350
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   351
fun compile_clause thy defs gr dep module all_vs arg_vs modes (iss, is) (ts, ps) inp =
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   352
  let
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   353
    val modes' = modes @ List.mapPartial
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   354
      (fn (_, NONE) => NONE | (v, SOME js) => SOME (v, [([], js)]))
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   355
        (arg_vs ~~ iss);
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   356
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   357
    fun check_constrt ((names, eqs), t) =
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   358
      if is_constrt thy t then ((names, eqs), t) else
20071
8f3e1ddb50e6 replaced Term.variant(list) by Name.variant(_list);
wenzelm
parents: 19861
diff changeset
   359
        let val s = Name.variant names "x";
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   360
        in ((s::names, (s, t)::eqs), Var ((s, 0), fastype_of t)) end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   361
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   362
    fun compile_eq (gr, (s, t)) =
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   363
      apsnd (Pretty.block o cons (Pretty.str (s ^ " = ")) o single)
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   364
        (invoke_codegen thy defs dep module false (gr, t));
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   365
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   366
    val (in_ts, out_ts) = get_args is 1 ts;
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   367
    val ((all_vs', eqs), in_ts') =
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   368
      foldl_map check_constrt ((all_vs, []), in_ts);
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   369
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   370
    fun is_ind t = (case head_of t of
17521
0f1c48de39f5 introduced AList module in favor of assoc etc.
haftmann
parents: 17412
diff changeset
   371
          Const (s, _) => s = "op =" orelse AList.defined (op =) modes s
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   372
        | Var ((s, _), _) => s mem arg_vs);
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   373
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   374
    fun compile_prems out_ts' vs names gr [] =
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   375
          let
12453
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   376
            val (gr2, out_ps) = foldl_map
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   377
              (invoke_codegen thy defs dep module false) (gr, out_ts);
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   378
            val (gr3, eq_ps) = foldl_map compile_eq (gr2, eqs);
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   379
            val ((names', eqs'), out_ts'') =
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   380
              foldl_map check_constrt ((names, []), out_ts');
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   381
            val (nvs, out_ts''') = foldl_map distinct_v
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   382
              ((names', map (fn x => (x, [x])) vs), out_ts'');
12453
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   383
            val (gr4, out_ps') = foldl_map
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   384
              (invoke_codegen thy defs dep module false) (gr3, out_ts''');
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   385
            val (gr5, eq_ps') = foldl_map compile_eq (gr4, eqs')
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   386
          in
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   387
            (gr5, compile_match (snd nvs) (eq_ps @ eq_ps') out_ps'
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   388
              (Pretty.block [Pretty.str "Seq.single", Pretty.brk 1, mk_tuple out_ps])
15061
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   389
              (exists (not o is_exhaustive) out_ts'''))
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   390
          end
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   391
      | compile_prems out_ts vs names gr ps =
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   392
          let
19046
bc5c6c9b114e removed distinct, renamed gen_distinct to distinct;
wenzelm
parents: 19025
diff changeset
   393
            val vs' = distinct (op =) (List.concat (vs :: map term_vs out_ts));
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   394
            val SOME (p, mode as SOME (Mode (_, js, _))) =
15126
54ae6c6ef3b1 Fixed bug in compile_clause that caused equality constraints
berghofe
parents: 15061
diff changeset
   395
              select_mode_prem thy modes' vs' ps;
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   396
            val ps' = filter_out (equal p) ps;
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   397
            val ((names', eqs), out_ts') =
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   398
              foldl_map check_constrt ((names, []), out_ts);
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   399
            val (nvs, out_ts'') = foldl_map distinct_v
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   400
              ((names', map (fn x => (x, [x])) vs), out_ts');
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   401
            val (gr0, out_ps) = foldl_map
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   402
              (invoke_codegen thy defs dep module false) (gr, out_ts'');
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   403
            val (gr1, eq_ps) = foldl_map compile_eq (gr0, eqs)
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   404
          in
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   405
            (case p of
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   406
               Prem (us, t) =>
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   407
                 let
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   408
                   val (in_ts, out_ts''') = get_args js 1 us;
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   409
                   val (gr2, in_ps) = foldl_map
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   410
                     (invoke_codegen thy defs dep module true) (gr1, in_ts);
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   411
                   val (gr3, ps) = if is_ind t then
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   412
                       apsnd (fn ps => ps @ Pretty.brk 1 ::
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   413
                           separate (Pretty.brk 1) in_ps)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   414
                         (compile_expr thy defs dep module false modes
16645
a152d6b21c31 Adapted to modular code generation.
berghofe
parents: 16424
diff changeset
   415
                           (gr2, (mode, t)))
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   416
                     else
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   417
                       apsnd (fn p => [Pretty.str "Seq.of_list", Pretty.brk 1, p])
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   418
                           (invoke_codegen thy defs dep module true (gr2, t));
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   419
                   val (gr4, rest) = compile_prems out_ts''' vs' (fst nvs) gr3 ps';
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   420
                 in
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   421
                   (gr4, compile_match (snd nvs) eq_ps out_ps
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   422
                      (Pretty.block (ps @
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   423
                         [Pretty.str " :->", Pretty.brk 1, rest]))
15061
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   424
                      (exists (not o is_exhaustive) out_ts''))
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   425
                 end
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   426
             | Sidecond t =>
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   427
                 let
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   428
                   val (gr2, side_p) = invoke_codegen thy defs dep module true (gr1, t);
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   429
                   val (gr3, rest) = compile_prems [] vs' (fst nvs) gr2 ps';
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   430
                 in
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   431
                   (gr3, compile_match (snd nvs) eq_ps out_ps
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   432
                      (Pretty.block [Pretty.str "?? ", side_p,
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   433
                        Pretty.str " :->", Pretty.brk 1, rest])
15061
61a52739cd82 Added simple check that allows code generator to produce code containing
berghofe
parents: 15031
diff changeset
   434
                      (exists (not o is_exhaustive) out_ts''))
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   435
                 end)
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   436
          end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   437
15126
54ae6c6ef3b1 Fixed bug in compile_clause that caused equality constraints
berghofe
parents: 15061
diff changeset
   438
    val (gr', prem_p) = compile_prems in_ts' arg_vs all_vs' gr ps;
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   439
  in
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   440
    (gr', Pretty.block [Pretty.str "Seq.single", Pretty.brk 1, inp,
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   441
       Pretty.str " :->", Pretty.brk 1, prem_p])
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   442
  end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   443
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   444
fun compile_pred thy defs gr dep module prfx all_vs arg_vs modes s cls mode =
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   445
  let
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   446
    val xs = map Pretty.str (Name.variant_list arg_vs
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   447
      (map (fn i => "x" ^ string_of_int i) (snd mode)));
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   448
    val (gr', (cl_ps, mode_id)) =
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   449
      foldl_map (fn (gr, cl) => compile_clause thy defs
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   450
        gr dep module all_vs arg_vs modes mode cl (mk_tuple xs)) (gr, cls) |>>>
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   451
      modename module s mode
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   452
  in
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   453
    ((gr', "and "), Pretty.block
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   454
      ([Pretty.block (separate (Pretty.brk 1)
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   455
         (Pretty.str (prfx ^ mode_id) ::
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   456
           map Pretty.str arg_vs @ xs) @
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   457
         [Pretty.str " ="]),
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   458
        Pretty.brk 1] @
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   459
       List.concat (separate [Pretty.str " ++", Pretty.brk 1] (map single cl_ps))))
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   460
  end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   461
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   462
fun compile_preds thy defs gr dep module all_vs arg_vs modes preds =
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   463
  let val ((gr', _), prs) = foldl_map (fn ((gr, prfx), (s, cls)) =>
16645
a152d6b21c31 Adapted to modular code generation.
berghofe
parents: 16424
diff changeset
   464
    foldl_map (fn ((gr', prfx'), mode) => compile_pred thy defs gr'
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   465
      dep module prfx' all_vs arg_vs modes s cls mode)
17521
0f1c48de39f5 introduced AList module in favor of assoc etc.
haftmann
parents: 17412
diff changeset
   466
        ((gr, prfx), ((the o AList.lookup (op =) modes) s))) ((gr, "fun "), preds)
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   467
  in
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   468
    (gr', space_implode "\n\n" (map Pretty.string_of (List.concat prs)) ^ ";\n\n")
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   469
  end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   470
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   471
(**** processing of introduction rules ****)
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   472
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   473
exception Modes of
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   474
  (string * (int list option list * int list) list) list *
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   475
  (string * (int option list * int)) list;
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   476
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   477
fun lookup_modes gr dep = apfst List.concat (apsnd List.concat (ListPair.unzip
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   478
  (map ((fn (SOME (Modes x), _, _) => x | _ => ([], [])) o get_node gr)
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   479
    (Graph.all_preds (fst gr) [dep]))));
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   480
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   481
fun print_arities arities = message ("Arities:\n" ^
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   482
  space_implode "\n" (map (fn (s, (ks, k)) => s ^ ": " ^
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   483
    space_implode " -> " (map
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   484
      (fn NONE => "X" | SOME k' => string_of_int k')
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   485
        (ks @ [SOME k]))) arities));
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   486
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   487
fun prep_intrs intrs = map (rename_term o #prop o rep_thm o standard) intrs;
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   488
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   489
fun constrain cs [] = []
22642
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
   490
  | constrain cs ((s, xs) :: ys) = (s, case AList.lookup (op =) cs (s : string) of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   491
      NONE => xs
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   492
    | SOME xs' => xs inter xs') :: constrain cs ys;
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   493
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   494
fun mk_extra_defs thy defs gr dep names module ts =
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   495
  Library.foldl (fn (gr, name) =>
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   496
    if name mem names then gr
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   497
    else (case get_clauses thy name of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15257
diff changeset
   498
        NONE => gr
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   499
      | SOME (names, thyname, nparms, intrs) =>
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   500
          mk_ind_def thy defs gr dep names (if_library thyname module)
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   501
            [] (prep_intrs intrs) nparms))
15574
b1d1b5bfc464 Removed practically all references to Library.foldr.
skalberg
parents: 15570
diff changeset
   502
            (gr, foldr add_term_consts [] ts)
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   503
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   504
and mk_ind_def thy defs gr dep names module modecs intrs nparms =
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   505
  add_edge (hd names, dep) gr handle Graph.UNDEF _ =>
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   506
    let
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   507
      val _ $ u = Logic.strip_imp_concl (hd intrs);
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   508
      val args = List.take (snd (strip_comb u), nparms);
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 15531
diff changeset
   509
      val arg_vs = List.concat (map term_vs args);
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   510
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   511
      fun get_nparms s = if s mem names then SOME nparms else
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   512
        Option.map #3 (get_clauses thy s);
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   513
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   514
      fun dest_prem (_ $ (Const ("op :", _) $ t $ u)) = Prem ([t], u)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   515
        | dest_prem (_ $ ((eq as Const ("op =", _)) $ t $ u)) = Prem ([t, u], eq)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   516
        | dest_prem (_ $ t) =
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   517
            (case strip_comb t of
22556
b067fdca022d Fixed bug in dest_prem: premises of the form "p x_1 ... x_n"
berghofe
parents: 22360
diff changeset
   518
               (v as Var _, ts) => if v mem args then Prem (ts, v) else Sidecond t
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   519
             | (c as Const (s, _), ts) => (case get_nparms s of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   520
                 NONE => Sidecond t
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   521
               | SOME k =>
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   522
                   let val (ts1, ts2) = chop k ts
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   523
                   in Prem (ts2, list_comb (c, ts1)) end)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   524
             | _ => Sidecond t);
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   525
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   526
      fun add_clause intr (clauses, arities) =
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   527
        let
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   528
          val _ $ t = Logic.strip_imp_concl intr;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   529
          val (Const (name, T), ts) = strip_comb t;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   530
          val (ts1, ts2) = chop nparms ts;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   531
          val prems = map dest_prem (Logic.strip_imp_prems intr);
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   532
          val (Ts, Us) = chop nparms (binder_types T)
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   533
        in
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   534
          (AList.update op = (name, these (AList.lookup op = clauses name) @
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   535
             [(ts2, prems)]) clauses,
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   536
           AList.update op = (name, (map (fn U => (case strip_type U of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   537
                 (Rs as _ :: _, Type ("bool", [])) => SOME (length Rs)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   538
               | _ => NONE)) Ts,
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   539
             length Us)) arities)
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   540
        end;
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   541
16645
a152d6b21c31 Adapted to modular code generation.
berghofe
parents: 16424
diff changeset
   542
      val gr' = mk_extra_defs thy defs
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   543
        (add_edge (hd names, dep)
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   544
          (new_node (hd names, (NONE, "", "")) gr)) (hd names) names module intrs;
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   545
      val (extra_modes, extra_arities) = lookup_modes gr' (hd names);
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   546
      val (clauses, arities) = fold add_clause intrs ([], []);
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   547
      val modes = constrain modecs
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   548
        (infer_modes thy extra_modes arities arg_vs clauses);
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   549
      val _ = print_arities arities;
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   550
      val _ = print_modes modes;
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   551
      val (gr'', s) = compile_preds thy defs gr' (hd names) module (terms_vs intrs)
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   552
        arg_vs (modes @ extra_modes) clauses;
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   553
    in
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   554
      (map_node (hd names)
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   555
        (K (SOME (Modes (modes, arities)), module, s)) gr'')
16645
a152d6b21c31 Adapted to modular code generation.
berghofe
parents: 16424
diff changeset
   556
    end;
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   557
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   558
fun find_mode gr dep s u modes is = (case find_first (fn Mode (_, js, _) => is=js)
15660
255055554c67 handle Option instead of OPTION;
wenzelm
parents: 15574
diff changeset
   559
  (modes_of modes u handle Option => []) of
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   560
     NONE => codegen_error gr dep
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   561
       ("No such mode for " ^ s ^ ": " ^ string_of_mode ([], is))
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   562
   | mode => mode);
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   563
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   564
fun mk_ind_call thy defs gr dep module is_query s T ts names thyname k intrs =
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   565
  let
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   566
    val (ts1, ts2) = chop k ts;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   567
    val u = list_comb (Const (s, T), ts1);
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   568
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   569
    fun mk_mode (((ts, mode), i), Const ("dummy_pattern", _)) =
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   570
          ((ts, mode), i+1)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   571
      | mk_mode (((ts, mode), i), t) = ((ts @ [t], mode @ [i]), i+1);
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   572
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   573
    val module' = if_library thyname module;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   574
    val gr1 = mk_extra_defs thy defs
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   575
      (mk_ind_def thy defs gr dep names module'
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   576
      [] (prep_intrs intrs) k) dep names module' [u];
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   577
    val (modes, _) = lookup_modes gr1 dep;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   578
    val (ts', is) = if is_query then
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   579
        fst (Library.foldl mk_mode ((([], []), 1), ts2))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   580
      else (ts2, 1 upto length (binder_types T) - k);
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   581
    val mode = find_mode gr1 dep s u modes is;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   582
    val (gr2, in_ps) = foldl_map
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   583
      (invoke_codegen thy defs dep module true) (gr1, ts');
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   584
    val (gr3, ps) =
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   585
      compile_expr thy defs dep module false modes (gr2, (mode, u))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   586
  in
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   587
    (gr3, Pretty.block (ps @ (if null in_ps then [] else [Pretty.brk 1]) @
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   588
       separate (Pretty.brk 1) in_ps))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   589
  end;
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   590
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   591
fun clause_of_eqn eqn =
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   592
  let
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   593
    val (t, u) = HOLogic.dest_eq (HOLogic.dest_Trueprop (concl_of eqn));
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   594
    val (Const (s, T), ts) = strip_comb t;
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   595
    val (Ts, U) = strip_type T
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   596
  in
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   597
    rename_term (Logic.list_implies (prems_of eqn, HOLogic.mk_Trueprop
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   598
      (list_comb (Const (s ^ "_aux", Ts @ [U] ---> HOLogic.boolT), ts @ [u]))))
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   599
  end;
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   600
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   601
fun mk_fun thy defs name eqns dep module module' gr =
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   602
  case try (get_node gr) name of
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   603
    NONE =>
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   604
    let
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   605
      val clauses = map clause_of_eqn eqns;
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   606
      val pname = name ^ "_aux";
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   607
      val arity = length (snd (strip_comb (fst (HOLogic.dest_eq
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   608
        (HOLogic.dest_Trueprop (concl_of (hd eqns)))))));
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   609
      val mode = 1 upto arity;
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   610
      val (gr', (fun_id, mode_id)) = gr |>
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   611
        mk_const_id module' name |>>>
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   612
        modename module' pname ([], mode);
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   613
      val vars = map (fn i => Pretty.str ("x" ^ string_of_int i)) mode;
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   614
      val s = Pretty.string_of (Pretty.block
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   615
        [mk_app false (Pretty.str ("fun " ^ snd fun_id)) vars, Pretty.str " =",
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   616
         Pretty.brk 1, Pretty.str "Seq.hd", Pretty.brk 1,
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   617
         parens (Pretty.block (separate (Pretty.brk 1) (Pretty.str mode_id ::
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   618
           vars)))]) ^ ";\n\n";
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   619
      val gr'' = mk_ind_def thy defs (add_edge (name, dep)
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   620
        (new_node (name, (NONE, module', s)) gr')) name [pname] module'
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   621
        [(pname, [([], mode)])] clauses 0;
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   622
      val (modes, _) = lookup_modes gr'' dep;
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   623
      val _ = find_mode gr'' dep pname (head_of (HOLogic.dest_Trueprop
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   624
        (Logic.strip_imp_concl (hd clauses)))) modes mode
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   625
    in (gr'', mk_qual_id module fun_id) end
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   626
  | SOME _ =>
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   627
      (add_edge (name, dep) gr, mk_qual_id module (get_const_id name gr));
15031
726dc9146bb1 - Added support for conditional equations whose premises involve
berghofe
parents: 14981
diff changeset
   628
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   629
fun inductive_codegen thy defs gr dep module brack t = (case strip_comb t of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   630
    (Const ("Collect", Type (_, [_, Type (_, [U])])), [u]) => (case strip_comb u of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   631
        (Const (s, T), ts) => (case (get_clauses thy s, get_assoc_code thy s T) of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   632
          (SOME (names, thyname, k, intrs), NONE) =>
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   633
            let val (gr', call_p) = mk_ind_call thy defs gr dep module true
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   634
              s T (ts @ [Term.dummy_pattern U]) names thyname k intrs
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   635
            in SOME (gr', (if brack then parens else I) (Pretty.block
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   636
              [Pretty.str "Seq.list_of", Pretty.brk 1, Pretty.str "(",
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   637
               call_p, Pretty.str ")"]))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   638
            end
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   639
        | _ => NONE)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   640
      | _ => NONE)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   641
  | (Const (s, T), ts) => (case Symtab.lookup (#eqns (CodegenData.get thy)) s of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   642
      NONE => (case (get_clauses thy s, get_assoc_code thy s T) of
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   643
        (SOME (names, thyname, k, intrs), NONE) =>
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   644
          if length ts < k then NONE else SOME
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   645
            (let val (gr', call_p) = mk_ind_call thy defs gr dep module false
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   646
               s T (map Term.no_dummy_patterns ts) names thyname k intrs
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   647
             in (gr', mk_funcomp brack "?!"
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   648
               (length (binder_types T) - length ts) (parens call_p))
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   649
             end handle TERM _ => mk_ind_call thy defs gr dep module true
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   650
               s T ts names thyname k intrs)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   651
      | _ => NONE)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   652
    | SOME eqns =>
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   653
        let
22642
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
   654
          val (_, thyname) :: _ = eqns;
bfdb29f11eb4 canonical merge operations
haftmann
parents: 22556
diff changeset
   655
          val (gr', id) = mk_fun thy defs s (preprocess thy (map fst (rev eqns)))
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   656
            dep module (if_library thyname module) gr;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   657
          val (gr'', ps) = foldl_map
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   658
            (invoke_codegen thy defs dep module true) (gr', ts);
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   659
        in SOME (gr'', mk_app brack (Pretty.str id) ps)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   660
        end)
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   661
  | _ => NONE);
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   662
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   663
val setup =
18708
4b3dadb4fe33 setup: theory -> theory;
wenzelm
parents: 18388
diff changeset
   664
  add_codegen "inductive" inductive_codegen #>
4b3dadb4fe33 setup: theory -> theory;
wenzelm
parents: 18388
diff changeset
   665
  CodegenData.init #>
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   666
  add_attribute "ind" (Scan.option (Args.$$$ "target" |-- Args.colon |-- Args.name) --
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   667
    Scan.option (Args.$$$ "params" |-- Args.colon |-- Args.nat) >> uncurry add);
11537
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   668
e007d35359c3 New code generators for HOL.
berghofe
parents:
diff changeset
   669
end;
12453
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   670
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   671
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   672
(**** combinators for code generated from inductive predicates ****)
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   673
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   674
infix 5 :->;
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   675
infix 3 ++;
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   676
19861
620d90091788 tuned Seq/Envir/Unify interfaces;
wenzelm
parents: 19046
diff changeset
   677
fun s :-> f = Seq.maps f s;
12453
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   678
19861
620d90091788 tuned Seq/Envir/Unify interfaces;
wenzelm
parents: 19046
diff changeset
   679
fun s1 ++ s2 = Seq.append s1 s2;
12453
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   680
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   681
fun ?? b = if b then Seq.single () else Seq.empty;
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   682
22271
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   683
fun ??? f g = f o g;
51a80e238b29 Adapted to new inductive definition package.
berghofe
parents: 21022
diff changeset
   684
19861
620d90091788 tuned Seq/Envir/Unify interfaces;
wenzelm
parents: 19046
diff changeset
   685
fun ?! s = is_some (Seq.pull s);
12453
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   686
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   687
fun equal__1 x = Seq.single x;
12453
806502073957 - Changed type of invoke_codegen
berghofe
parents: 11539
diff changeset
   688
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   689
val equal__2 = equal__1;
12557
bb2e4689347e Implemented higher order modes.
berghofe
parents: 12453
diff changeset
   690
17144
6642e0f96f44 Implemented incremental code generation.
berghofe
parents: 16861
diff changeset
   691
fun equal__1_2 (x, y) = ?? (x = y);