src/HOL/Tools/BNF/bnf_fp_rec_sugar_util.ML
author blanchet
Mon, 05 Jan 2015 10:09:42 +0100
changeset 59281 1b4dc8a9f7d9
parent 59275 77cd4992edcd
child 59314 91649ea1b32c
permissions -rw-r--r--
added plugins syntax to prim(co)rec
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55061
a0adf838e2d1 adjusted comments
blanchet
parents: 55060
diff changeset
     1
(*  Title:      HOL/Tools/BNF/bnf_fp_rec_sugar_util.ML
53303
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
     2
    Author:     Lorenz Panny, TU Muenchen
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
     3
    Author:     Jasmin Blanchette, TU Muenchen
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
     4
    Copyright   2013
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
     5
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
     6
Library for recursor and corecursor sugar.
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
     7
*)
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
     8
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
     9
signature BNF_FP_REC_SUGAR_UTIL =
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    10
sig
59275
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    11
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    12
  datatype fp_kind = Least_FP | Greatest_FP
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    13
55966
972f0aa7091b balance tuples that represent curried functions
blanchet
parents: 55869
diff changeset
    14
  val case_fp: fp_kind -> 'a -> 'a -> 'a
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    15
59275
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    16
  type fp_rec_sugar =
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    17
    {transfers: bool list,
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    18
     fun_names: string list,
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    19
     funs: term list,
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    20
     fun_defs: thm list,
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    21
     fpTs: typ list}
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    22
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    23
  val morph_fp_rec_sugar: morphism -> fp_rec_sugar -> fp_rec_sugar
59281
1b4dc8a9f7d9 added plugins syntax to prim(co)rec
blanchet
parents: 59275
diff changeset
    24
  val transfer_fp_rec_sugar: theory -> fp_rec_sugar -> fp_rec_sugar
59275
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    25
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    26
  val flat_rec_arg_args: 'a list list -> 'a list
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    27
54246
8fdb4dc08ed1 split 'primrec_new' and 'primcorec' code (to ease bootstrapping, e.g. dependency on datatype 'String' in 'primcorec')
blanchet
parents: 54243
diff changeset
    28
  val indexed: 'a list -> int -> int list * int
8fdb4dc08ed1 split 'primrec_new' and 'primcorec' code (to ease bootstrapping, e.g. dependency on datatype 'String' in 'primcorec')
blanchet
parents: 54243
diff changeset
    29
  val indexedd: 'a list list -> int -> int list list * int
54299
bc24e1ccfd35 tuned signature
blanchet
parents: 54246
diff changeset
    30
  val indexeddd: 'a list list list -> int -> int list list list * int
54246
8fdb4dc08ed1 split 'primrec_new' and 'primcorec' code (to ease bootstrapping, e.g. dependency on datatype 'String' in 'primcorec')
blanchet
parents: 54243
diff changeset
    31
  val indexedddd: 'a list list list list -> int -> int list list list list * int
8fdb4dc08ed1 split 'primrec_new' and 'primcorec' code (to ease bootstrapping, e.g. dependency on datatype 'String' in 'primcorec')
blanchet
parents: 54243
diff changeset
    32
  val find_index_eq: ''a list -> ''a -> int
8fdb4dc08ed1 split 'primrec_new' and 'primcorec' code (to ease bootstrapping, e.g. dependency on datatype 'String' in 'primcorec')
blanchet
parents: 54243
diff changeset
    33
  val finds: ('a * 'b -> bool) -> 'a list -> 'b list -> ('a * 'b list) list * 'b list
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    34
  val find_indices: ('b * 'a -> bool) -> 'a list -> 'b list -> int list
53303
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    35
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    36
  val mk_common_name: string list -> string
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    37
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    38
  val num_binder_types: typ -> int
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    39
  val exists_subtype_in: typ list -> typ -> bool
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    40
  val exists_strict_subtype_in: typ list -> typ -> bool
55571
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
    41
  val tvar_subst: theory -> typ list -> typ list -> ((string * int) * typ) list
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
    42
56651
fc105315822a localize new size function generation code
blanchet
parents: 56245
diff changeset
    43
  val retype_const_or_free: typ -> term -> term
54979
d7593bfccf25 correctly extract code RHS, with loose bound variables
blanchet
parents: 54614
diff changeset
    44
  val drop_all: term -> term
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    45
  val permute_args: int -> term -> term
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    46
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    47
  val mk_partial_compN: int -> typ -> term -> term
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    48
  val mk_compN: int -> typ list -> term * term -> term
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    49
  val mk_comp: typ list -> term * term -> term
54202
0a06b51ffa56 handle applied ctor arguments gracefully when computing 'callssss' (for recursion through functions)
blanchet
parents: 54200
diff changeset
    50
58211
c1f3fa32d322 extended 'datatype_compat' to generate the expected, old-style recursor in the presence of recursion through functions
blanchet
parents: 56651
diff changeset
    51
  val mk_co_rec: theory -> fp_kind -> typ list -> typ -> term -> term
55571
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
    52
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    53
  val mk_conjunctN: int -> int -> thm
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    54
  val conj_dests: int -> thm -> thm list
53303
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    55
end;
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    56
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    57
structure BNF_FP_Rec_Sugar_Util : BNF_FP_REC_SUGAR_UTIL =
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    58
struct
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    59
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    60
datatype fp_kind = Least_FP | Greatest_FP;
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    61
55966
972f0aa7091b balance tuples that represent curried functions
blanchet
parents: 55869
diff changeset
    62
fun case_fp Least_FP l _ = l
972f0aa7091b balance tuples that represent curried functions
blanchet
parents: 55869
diff changeset
    63
  | case_fp Greatest_FP _ g = g;
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    64
59275
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    65
type fp_rec_sugar =
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    66
  {transfers: bool list,
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    67
   fun_names: string list,
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    68
   funs: term list,
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    69
   fun_defs: thm list,
59281
1b4dc8a9f7d9 added plugins syntax to prim(co)rec
blanchet
parents: 59275
diff changeset
    70
   fpTs: typ list};
59275
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    71
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    72
fun morph_fp_rec_sugar phi {transfers, fun_names, funs, fun_defs, fpTs} =
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    73
  {transfers = transfers,
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    74
   fun_names = fun_names,
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    75
   funs = map (Morphism.term phi) funs,
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    76
   fun_defs = map (Morphism.thm phi) fun_defs,
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    77
   fpTs = map (Morphism.typ phi) fpTs};
77cd4992edcd Add plugin to generate transfer theorem for primrec and primcorec
desharna
parents: 58337
diff changeset
    78
59281
1b4dc8a9f7d9 added plugins syntax to prim(co)rec
blanchet
parents: 59275
diff changeset
    79
val transfer_fp_rec_sugar = morph_fp_rec_sugar o Morphism.transfer_morphism;
1b4dc8a9f7d9 added plugins syntax to prim(co)rec
blanchet
parents: 59275
diff changeset
    80
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    81
fun flat_rec_arg_args xss =
59281
1b4dc8a9f7d9 added plugins syntax to prim(co)rec
blanchet
parents: 59275
diff changeset
    82
  (* FIXME (once the old datatype package is completely phased out): The first line below gives the
1b4dc8a9f7d9 added plugins syntax to prim(co)rec
blanchet
parents: 59275
diff changeset
    83
     preferred order. The second line is for compatibility with the old datatype package. *)
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    84
  (* flat xss *)
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    85
  map hd xss @ maps tl xss;
55571
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
    86
54614
689398f0953f simpler code
blanchet
parents: 54299
diff changeset
    87
fun indexe _ h = (h, h + 1);
689398f0953f simpler code
blanchet
parents: 54299
diff changeset
    88
fun indexed xs = fold_map indexe xs;
53303
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    89
fun indexedd xss = fold_map indexed xss;
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    90
fun indexeddd xsss = fold_map indexedd xsss;
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    91
fun indexedddd xssss = fold_map indexeddd xssss;
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    92
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    93
fun find_index_eq hs h = find_index (curry (op =) h) hs;
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    94
54246
8fdb4dc08ed1 split 'primrec_new' and 'primcorec' code (to ease bootstrapping, e.g. dependency on datatype 'String' in 'primcorec')
blanchet
parents: 54243
diff changeset
    95
fun finds eq = fold_map (fn x => List.partition (curry eq x) #>> pair x);
53303
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
    96
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    97
fun find_indices eq xs ys =
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    98
  map_filter I (map_index (fn (i, y) => if member eq xs y then SOME i else NONE) ys);
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
    99
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   100
val mk_common_name = space_implode "_";
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   101
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   102
(*stolen from ~~/src/HOL/Tools/Nitpick/nitpick_hol.ML*)
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   103
fun num_binder_types (Type (@{type_name fun}, [_, T])) = 1 + num_binder_types T
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   104
  | num_binder_types _ = 0;
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   105
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   106
val exists_subtype_in = Term.exists_subtype o member (op =);
58337
blanchet
parents: 58211
diff changeset
   107
fun exists_strict_subtype_in Ts T = exists_subtype_in (remove (op =) T Ts) T;
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   108
55571
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
   109
fun tvar_subst thy Ts Us =
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
   110
  Vartab.fold (cons o apsnd snd) (fold (Sign.typ_match thy) (Ts ~~ Us) Vartab.empty) [];
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
   111
56651
fc105315822a localize new size function generation code
blanchet
parents: 56245
diff changeset
   112
fun retype_const_or_free T (Const (s, _)) = Const (s, T)
fc105315822a localize new size function generation code
blanchet
parents: 56245
diff changeset
   113
  | retype_const_or_free T (Free (s, _)) = Free (s, T)
fc105315822a localize new size function generation code
blanchet
parents: 56245
diff changeset
   114
  | retype_const_or_free _ t = raise TERM ("retype_const_or_free", [t]);
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   115
54979
d7593bfccf25 correctly extract code RHS, with loose bound variables
blanchet
parents: 54614
diff changeset
   116
fun drop_all t =
56245
84fc7dfa3cd4 more qualified names;
wenzelm
parents: 55966
diff changeset
   117
  subst_bounds (strip_qnt_vars @{const_name Pure.all} t |> map Free |> rev,
84fc7dfa3cd4 more qualified names;
wenzelm
parents: 55966
diff changeset
   118
    strip_qnt_body @{const_name Pure.all} t);
53303
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
   119
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   120
fun permute_args n t =
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   121
  list_comb (t, map Bound (0 :: (n downto 1))) |> fold (K (Term.abs (Name.uu, dummyT))) (0 upto n);
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   122
55856
bddaada24074 got rid of automatically generated fold constant and theorems (to reduce overhead)
blanchet
parents: 55772
diff changeset
   123
fun mk_partial_comp fT g = fst (Term.dest_comb (HOLogic.mk_comp (g, Free (Name.uu, fT))));
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   124
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   125
fun mk_partial_compN 0 _ g = g
55856
bddaada24074 got rid of automatically generated fold constant and theorems (to reduce overhead)
blanchet
parents: 55772
diff changeset
   126
  | mk_partial_compN n fT g = mk_partial_comp fT (mk_partial_compN (n - 1) (range_type fT) g);
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   127
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   128
fun mk_compN n bound_Ts (g, f) =
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   129
  let val typof = curry fastype_of1 bound_Ts in
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   130
    mk_partial_compN n (typof f) g $ f
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   131
  end;
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   132
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   133
val mk_comp = mk_compN 1;
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   134
58211
c1f3fa32d322 extended 'datatype_compat' to generate the expected, old-style recursor in the presence of recursion through functions
blanchet
parents: 56651
diff changeset
   135
fun mk_co_rec thy fp Cs fpT t =
55571
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
   136
  let
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   137
    val ((f_Cs, prebody), body) = strip_type (fastype_of t) |>> split_last;
55966
972f0aa7091b balance tuples that represent curried functions
blanchet
parents: 55869
diff changeset
   138
    val fpT0 = case_fp fp prebody body;
972f0aa7091b balance tuples that represent curried functions
blanchet
parents: 55869
diff changeset
   139
    val Cs0 = distinct (op =) (map (case_fp fp body_type domain_type) f_Cs);
55571
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
   140
    val rho = tvar_subst thy (fpT0 :: Cs0) (fpT :: Cs);
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
   141
  in
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
   142
    Term.subst_TVars rho t
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
   143
  end;
a6153343c44f prepare two-stage 'primrec' setup
blanchet
parents: 55485
diff changeset
   144
55575
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   145
fun mk_conjunctN 1 1 = @{thm TrueE[OF TrueI]}
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   146
  | mk_conjunctN _ 1 = conjunct1
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   147
  | mk_conjunctN 2 2 = conjunct2
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   148
  | mk_conjunctN n m = conjunct2 RS (mk_conjunctN (n - 1) (m - 1));
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   149
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   150
fun conj_dests n thm = map (fn k => thm RS mk_conjunctN n k) (1 upto n);
a5e33e18fb5c moved 'primrec' up (for real this time) and removed temporary 'old_primrec'
blanchet
parents: 55573
diff changeset
   151
53303
ae49b835ca01 moved files related to "primrec_new", "primcorec", and "datatype_compat" from bitbucket co-rec repository
blanchet
parents:
diff changeset
   152
end;