src/HOL/Tools/Ctr_Sugar/ctr_sugar_util.ML
author traytel
Thu, 16 Jul 2015 12:23:22 +0200
changeset 60728 26ffdb966759
parent 59877 a04ea4709c8d
child 60752 b48830b670a1
permissions -rw-r--r--
{r,e,d,f}tac with proper context in BNF
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
54701
4ed7454aebde tuning -- moved ML files to subdirectory
blanchet
parents: 54540
diff changeset
     1
(*  Title:      HOL/Tools/Ctr_Sugar/ctr_sugar_util.ML
54397
f4b4fa25ce56 tuned headers
blanchet
parents: 54396
diff changeset
     2
    Author:     Dmitriy Traytel, TU Muenchen
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
     3
    Author:     Jasmin Blanchette, TU Muenchen
54397
f4b4fa25ce56 tuned headers
blanchet
parents: 54396
diff changeset
     4
    Copyright   2012, 2013
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
     5
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
     6
Library for wrapping existing freely generated type's constructors.
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
     7
*)
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
     8
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
     9
signature CTR_SUGAR_UTIL =
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    10
sig
57527
1b07ca054327 add helper function map_prod
desharna
parents: 57091
diff changeset
    11
  val map_prod: ('a -> 'b) -> ('c -> 'd) -> 'a * 'c -> 'b * 'd
1b07ca054327 add helper function map_prod
desharna
parents: 57091
diff changeset
    12
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    13
  val seq_conds: (bool -> 'a -> 'b) -> int -> int -> 'a list -> 'b list
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    14
  val transpose: 'a list list -> 'a list list
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    15
  val pad_list: 'a -> int -> 'a list -> 'a list
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    16
  val splice: 'a list -> 'a list -> 'a list
55480
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
    17
  val permute_like_unique: ('a * 'b -> bool) -> 'a list -> 'b list -> 'c list -> 'c list
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
    18
  val permute_like: ('a * 'a -> bool) -> 'a list -> 'a list -> 'b list -> 'b list
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    19
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    20
  val mk_names: int -> string -> string list
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    21
  val mk_fresh_names: Proof.context -> int -> string -> string list * Proof.context
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    22
  val mk_TFrees': sort list -> Proof.context -> typ list * Proof.context
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    23
  val mk_TFrees: int -> Proof.context -> typ list * Proof.context
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    24
  val mk_Frees': string -> typ list -> Proof.context ->
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    25
    (term list * (string * typ) list) * Proof.context
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    26
  val mk_Freess': string -> typ list list -> Proof.context ->
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    27
    (term list list * (string * typ) list list) * Proof.context
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    28
  val mk_Frees: string -> typ list -> Proof.context -> term list * Proof.context
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    29
  val mk_Freess: string -> typ list list -> Proof.context -> term list list * Proof.context
58227
d91f7a80f412 use right sort constraints
blanchet
parents: 58220
diff changeset
    30
  val dest_TFree_or_TVar: typ -> string * sort
58234
265aea1e9985 honour sorts in N2M
blanchet
parents: 58227
diff changeset
    31
  val resort_tfree_or_tvar: sort -> typ -> typ
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    32
  val variant_types: string list -> sort list -> Proof.context ->
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    33
    (string * sort) list * Proof.context
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    34
  val variant_tfrees: string list -> Proof.context -> typ list * Proof.context
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    35
58284
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
    36
  val base_name_of_typ: typ -> string
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
    37
  val name_of_const: string -> (typ -> typ) -> term -> string
57700
a2c4adb839a9 generate 'set_induct' theorem for codatatypes
desharna
parents: 57633
diff changeset
    38
54435
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
    39
  val typ_subst_nonatomic: (typ * typ) list -> typ -> typ
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
    40
  val subst_nonatomic_types: (typ * typ) list -> term -> term
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
    41
55535
10194808430d name derivations in 'primrec' for code extraction from proof terms
blanchet
parents: 55480
diff changeset
    42
  val lhs_head_of : thm -> term
55471
198498f861ee more precise spec rules for selectors
blanchet
parents: 55469
diff changeset
    43
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    44
  val mk_predT: typ list -> typ
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    45
  val mk_pred1T: typ -> typ
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    46
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    47
  val mk_disjIN: int -> int -> thm
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    48
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    49
  val mk_unabs_def: int -> thm -> thm
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    50
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    51
  val mk_IfN: typ -> term list -> term list -> term
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    52
  val mk_Trueprop_eq: term * term -> term
57567
d554b0097ad4 add mk_Trueprop_mem utility function
desharna
parents: 57527
diff changeset
    53
  val mk_Trueprop_mem: term * term -> term
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    54
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    55
  val rapp: term -> term -> term
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    56
60728
26ffdb966759 {r,e,d,f}tac with proper context in BNF
traytel
parents: 59877
diff changeset
    57
  val rtac: Proof.context -> thm -> int -> tactic
26ffdb966759 {r,e,d,f}tac with proper context in BNF
traytel
parents: 59877
diff changeset
    58
  val etac: Proof.context -> thm -> int -> tactic
26ffdb966759 {r,e,d,f}tac with proper context in BNF
traytel
parents: 59877
diff changeset
    59
  val dtac: Proof.context -> thm -> int -> tactic
26ffdb966759 {r,e,d,f}tac with proper context in BNF
traytel
parents: 59877
diff changeset
    60
  val ftac: Proof.context -> thm -> int -> tactic
26ffdb966759 {r,e,d,f}tac with proper context in BNF
traytel
parents: 59877
diff changeset
    61
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    62
  val list_all_free: term list -> term -> term
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    63
  val list_exists_free: term list -> term -> term
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    64
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    65
  val fo_match: Proof.context -> term -> term -> Type.tyenv * Envir.tenv
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    66
54540
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
    67
  val cterm_instantiate_pos: cterm option list -> thm -> thm
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    68
  val unfold_thms: Proof.context -> thm list -> thm -> thm
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    69
57633
4ff8c090d580 repaired named derivations
blanchet
parents: 57631
diff changeset
    70
  val name_noted_thms: string -> string -> (string * thm list) list -> (string * thm list) list
57629
e88b5f59cade use the noted theorem whenever possible, because it has a named derivation (leading to cleaner proof terms)
blanchet
parents: 57567
diff changeset
    71
  val substitute_noted_thm: (string * thm list) list -> morphism
e88b5f59cade use the noted theorem whenever possible, because it has a named derivation (leading to cleaner proof terms)
blanchet
parents: 57567
diff changeset
    72
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    73
  val standard_binding: binding
55469
b19dd108f0c2 aligned the syntax for 'free_constructors' on the 'datatype_new' and 'codatatype' syntax
blanchet
parents: 54701
diff changeset
    74
  val parse_binding_colon: binding parser
b19dd108f0c2 aligned the syntax for 'free_constructors' on the 'datatype_new' and 'codatatype' syntax
blanchet
parents: 54701
diff changeset
    75
  val parse_opt_binding_colon: binding parser
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    76
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    77
  val ss_only: thm list -> Proof.context -> Proof.context
54540
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
    78
59271
c448752e8b9d generate 'disc_eq_case' for Ctr_Sugars
desharna
parents: 58659
diff changeset
    79
  (*parameterized thms*)
c448752e8b9d generate 'disc_eq_case' for Ctr_Sugars
desharna
parents: 58659
diff changeset
    80
  val eqTrueI: thm
c448752e8b9d generate 'disc_eq_case' for Ctr_Sugars
desharna
parents: 58659
diff changeset
    81
  val eqFalseI: thm
c448752e8b9d generate 'disc_eq_case' for Ctr_Sugars
desharna
parents: 58659
diff changeset
    82
54540
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
    83
  val WRAP: ('a -> tactic) -> ('a -> tactic) -> 'a list -> tactic -> tactic
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
    84
  val WRAP': ('a -> int -> tactic) -> ('a -> int -> tactic) -> 'a list -> (int -> tactic) -> int ->
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
    85
    tactic
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
    86
  val CONJ_WRAP_GEN: tactic -> ('a -> tactic) -> 'a list -> tactic
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
    87
  val CONJ_WRAP_GEN': (int -> tactic) -> ('a -> int -> tactic) -> 'a list -> int -> tactic
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
    88
  val CONJ_WRAP: ('a -> tactic) -> 'a list -> tactic
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
    89
  val CONJ_WRAP': ('a -> int -> tactic) -> 'a list -> int -> tactic
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    90
end;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    91
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    92
structure Ctr_Sugar_Util : CTR_SUGAR_UTIL =
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    93
struct
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    94
58220
a2afad27a0b1 wildcards in plugins
blanchet
parents: 58189
diff changeset
    95
fun map_prod f g (x, y) = (f x, g y);
57527
1b07ca054327 add helper function map_prod
desharna
parents: 57091
diff changeset
    96
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    97
fun seq_conds f n k xs =
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    98
  if k = n then
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
    99
    map (f false) (take (k - 1) xs)
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   100
  else
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   101
    let val (negs, pos) = split_last (take k xs) in
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   102
      map (f false) negs @ [f true pos]
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   103
    end;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   104
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   105
fun transpose [] = []
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   106
  | transpose ([] :: xss) = transpose xss
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   107
  | transpose xss = map hd xss :: transpose (map tl xss);
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   108
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   109
fun pad_list x n xs = xs @ replicate (n - length xs) x;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   110
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   111
fun splice xs ys = flat (map2 (fn x => fn y => [x, y]) xs ys);
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   112
55480
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   113
fun permute_like_unique eq xs xs' ys =
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   114
  map (nth ys o (fn y => find_index (fn x => eq (x, y)) xs)) xs';
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   115
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   116
fun fresh eq x names =
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   117
  (case AList.lookup eq names x of
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   118
    NONE => ((x, 0), (x, 0) :: names)
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   119
  | SOME n => ((x, n + 1), AList.update eq (x, n + 1) names));
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   120
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   121
fun deambiguate eq xs = fst (fold_map (fresh eq) xs []);
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   122
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   123
fun permute_like eq xs xs' =
59cc4a8bc28a allow different functions to recurse on the same type, like in the old package
blanchet
parents: 55471
diff changeset
   124
  permute_like_unique (eq_pair eq (op =)) (deambiguate eq xs) (deambiguate eq xs');
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   125
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   126
fun mk_names n x = if n = 1 then [x] else map (fn i => x ^ string_of_int i) (1 upto n);
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   127
fun mk_fresh_names ctxt = (fn xs => Variable.variant_fixes xs ctxt) oo mk_names;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   128
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   129
val mk_TFrees' = apfst (map TFree) oo Variable.invent_types;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   130
56254
a2dd9200854d more antiquotations;
wenzelm
parents: 55535
diff changeset
   131
fun mk_TFrees n = mk_TFrees' (replicate n @{sort type});
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   132
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   133
fun mk_Frees' x Ts ctxt = mk_fresh_names ctxt (length Ts) x |>> (fn xs => `(map Free) (xs ~~ Ts));
58634
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58284
diff changeset
   134
fun mk_Freess' x Tss = @{fold_map 2} mk_Frees' (mk_names (length Tss) x) Tss #>> split_list;
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   135
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   136
fun mk_Frees x Ts ctxt = mk_fresh_names ctxt (length Ts) x |>> (fn xs => map2 (curry Free) xs Ts);
58634
9f10d82e8188 added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents: 58284
diff changeset
   137
fun mk_Freess x Tss = @{fold_map 2} mk_Frees (mk_names (length Tss) x) Tss;
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   138
58227
d91f7a80f412 use right sort constraints
blanchet
parents: 58220
diff changeset
   139
fun dest_TFree_or_TVar (TFree sS) = sS
d91f7a80f412 use right sort constraints
blanchet
parents: 58220
diff changeset
   140
  | dest_TFree_or_TVar (TVar ((s, _), S)) = (s, S)
d91f7a80f412 use right sort constraints
blanchet
parents: 58220
diff changeset
   141
  | dest_TFree_or_TVar _ = error "Invalid type argument";
d91f7a80f412 use right sort constraints
blanchet
parents: 58220
diff changeset
   142
58234
265aea1e9985 honour sorts in N2M
blanchet
parents: 58227
diff changeset
   143
fun resort_tfree_or_tvar S (TFree (s, _)) = TFree (s, S)
265aea1e9985 honour sorts in N2M
blanchet
parents: 58227
diff changeset
   144
  | resort_tfree_or_tvar S (TVar (x, _)) = TVar (x, S);
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   145
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   146
fun ensure_prefix pre s = s |> not (String.isPrefix pre s) ? prefix pre;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   147
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   148
fun variant_types ss Ss ctxt =
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   149
  let
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   150
    val (tfrees, _) =
59650
wenzelm
parents: 59621
diff changeset
   151
      @{fold_map 2} (fn s => fn S => Name.variant s #> apfst (rpair S))
wenzelm
parents: 59621
diff changeset
   152
        ss Ss (Variable.names_of ctxt);
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   153
    val ctxt' = fold (Variable.declare_constraints o Logic.mk_type o TFree) tfrees ctxt;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   154
  in (tfrees, ctxt') end;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   155
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   156
fun variant_tfrees ss =
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   157
  apfst (map TFree) o
56254
a2dd9200854d more antiquotations;
wenzelm
parents: 55535
diff changeset
   158
    variant_types (map (ensure_prefix "'") ss) (replicate (length ss) @{sort type});
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   159
58284
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   160
fun add_components_of_typ (Type (s, Ts)) =
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   161
    cons (Long_Name.base_name s) #> fold_rev add_components_of_typ Ts
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   162
  | add_components_of_typ _ = I;
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   163
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   164
fun base_name_of_typ T = space_implode "_" (add_components_of_typ T []);
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   165
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   166
fun suffix_with_type s (Type (_, Ts)) =
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   167
    space_implode "_" (s :: fold_rev add_components_of_typ Ts [])
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   168
  | suffix_with_type s _ = s;
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   169
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   170
fun name_of_const what get_fcT t =
57700
a2c4adb839a9 generate 'set_induct' theorem for codatatypes
desharna
parents: 57633
diff changeset
   171
  (case head_of t of
58284
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   172
    Const (s, T) => suffix_with_type s (get_fcT T)
f9b6af3017fd nicer case names in the N2M case, similar to those generated by the old package (e.g. 'Cons_tree' instead of just 'Cons')
blanchet
parents: 58234
diff changeset
   173
  | Free (s, T) => suffix_with_type s (get_fcT T)
57700
a2c4adb839a9 generate 'set_induct' theorem for codatatypes
desharna
parents: 57633
diff changeset
   174
  | _ => error ("Cannot extract name of " ^ what));
a2c4adb839a9 generate 'set_induct' theorem for codatatypes
desharna
parents: 57633
diff changeset
   175
54435
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
   176
(*Replace each Ti by Ui (starting from the leaves); inst = [(T1, U1), ..., (Tn, Un)].*)
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
   177
fun typ_subst_nonatomic [] = I
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
   178
  | typ_subst_nonatomic inst =
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
   179
    let
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
   180
      fun subst (Type (s, Ts)) = perhaps (AList.lookup (op =) inst) (Type (s, map subst Ts))
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
   181
        | subst T = perhaps (AList.lookup (op =) inst) T;
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
   182
    in subst end;
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
   183
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
   184
fun subst_nonatomic_types [] = I
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
   185
  | subst_nonatomic_types inst = map_types (typ_subst_nonatomic inst);
4a655e62ad34 fixed type variable confusion in 'datatype_new_compat'
blanchet
parents: 54397
diff changeset
   186
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59580
diff changeset
   187
fun lhs_head_of thm =
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59580
diff changeset
   188
  Term.head_of (fst (HOLogic.dest_eq (HOLogic.dest_Trueprop (Thm.prop_of thm))));
55471
198498f861ee more precise spec rules for selectors
blanchet
parents: 55469
diff changeset
   189
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   190
fun mk_predT Ts = Ts ---> HOLogic.boolT;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   191
fun mk_pred1T T = mk_predT [T];
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   192
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   193
fun mk_disjIN 1 1 = @{thm TrueE[OF TrueI]}
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   194
  | mk_disjIN _ 1 = disjI1
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   195
  | mk_disjIN 2 2 = disjI2
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   196
  | mk_disjIN n m = (mk_disjIN (n - 1) (m - 1)) RS disjI2;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   197
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   198
fun mk_unabs_def n = funpow n (fn thm => thm RS fun_cong);
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   199
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   200
fun mk_IfN _ _ [t] = t
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   201
  | mk_IfN T (c :: cs) (t :: ts) =
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   202
    Const (@{const_name If}, HOLogic.boolT --> T --> T --> T) $ c $ t $ mk_IfN T cs ts;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   203
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   204
val mk_Trueprop_eq = HOLogic.mk_Trueprop o HOLogic.mk_eq;
57567
d554b0097ad4 add mk_Trueprop_mem utility function
desharna
parents: 57527
diff changeset
   205
val mk_Trueprop_mem = HOLogic.mk_Trueprop o HOLogic.mk_mem;
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   206
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   207
fun rapp u t = betapply (t, u);
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   208
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   209
fun list_quant_free quant_const =
54491
27966e17d075 case_if -> case_eq_if + docs
blanchet
parents: 54435
diff changeset
   210
  fold_rev (fn Free (xT as (_, T)) => fn P => quant_const T $ Term.absfree xT P);
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   211
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   212
val list_all_free = list_quant_free HOLogic.all_const;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   213
val list_exists_free = list_quant_free HOLogic.exists_const;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   214
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   215
fun fo_match ctxt t pat =
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   216
  let val thy = Proof_Context.theory_of ctxt in
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   217
    Pattern.first_order_match thy (pat, t) (Vartab.empty, Vartab.empty)
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   218
  end;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   219
54540
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   220
fun cterm_instantiate_pos cts thm =
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   221
  let
59617
b60e65ad13df tuned -- more explicit use of context;
wenzelm
parents: 59582
diff changeset
   222
    val thy = Thm.theory_of_thm thm;
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59580
diff changeset
   223
    val vars = Term.add_vars (Thm.prop_of thm) [];
54540
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   224
    val vars' = rev (drop (length vars - length cts) vars);
59617
b60e65ad13df tuned -- more explicit use of context;
wenzelm
parents: 59582
diff changeset
   225
    val ps =
b60e65ad13df tuned -- more explicit use of context;
wenzelm
parents: 59582
diff changeset
   226
      map_filter
b60e65ad13df tuned -- more explicit use of context;
wenzelm
parents: 59582
diff changeset
   227
        (fn (_, NONE) => NONE
59621
291934bac95e Thm.cterm_of and Thm.ctyp_of operate on local context;
wenzelm
parents: 59617
diff changeset
   228
          | (var, SOME ct) => SOME (Thm.global_cterm_of thy (Var var), ct)) (vars' ~~ cts);
54540
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   229
  in
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   230
    Drule.cterm_instantiate ps thm
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   231
  end;
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   232
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   233
fun unfold_thms ctxt thms = Local_Defs.unfold ctxt (distinct Thm.eq_thm_prop thms);
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   234
57633
4ff8c090d580 repaired named derivations
blanchet
parents: 57631
diff changeset
   235
fun name_noted_thms _ _ [] = []
4ff8c090d580 repaired named derivations
blanchet
parents: 57631
diff changeset
   236
  | name_noted_thms qualifier base ((local_name, thms) :: noted) =
4ff8c090d580 repaired named derivations
blanchet
parents: 57631
diff changeset
   237
    if Long_Name.base_name local_name = base then
4ff8c090d580 repaired named derivations
blanchet
parents: 57631
diff changeset
   238
      (local_name,
59877
a04ea4709c8d more standard Long_Name operations;
wenzelm
parents: 59650
diff changeset
   239
       map_index (uncurry (fn j => Thm.name_derivation (Long_Name.append qualifier base ^
57633
4ff8c090d580 repaired named derivations
blanchet
parents: 57631
diff changeset
   240
         (if can the_single thms then "" else "_" ^ string_of_int (j + 1))))) thms) :: noted
4ff8c090d580 repaired named derivations
blanchet
parents: 57631
diff changeset
   241
    else
4ff8c090d580 repaired named derivations
blanchet
parents: 57631
diff changeset
   242
      ((local_name, thms) :: name_noted_thms qualifier base noted);
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   243
57629
e88b5f59cade use the noted theorem whenever possible, because it has a named derivation (leading to cleaner proof terms)
blanchet
parents: 57567
diff changeset
   244
fun substitute_noted_thm noted =
57630
04ab38720b50 use termtab instead of (perhaps overly sensitive) thmtab
blanchet
parents: 57629
diff changeset
   245
  let val tab = fold (fold (Termtab.default o `Thm.full_prop_of) o snd) noted Termtab.empty in
04ab38720b50 use termtab instead of (perhaps overly sensitive) thmtab
blanchet
parents: 57629
diff changeset
   246
    Morphism.thm_morphism "Ctr_Sugar_Util.substitute_noted_thm"
57631
959caab43a3d use the noted theorem whenever possible, also in 'BNF_Def'
blanchet
parents: 57630
diff changeset
   247
      (perhaps (Termtab.lookup tab o Thm.full_prop_of) o Drule.zero_var_indexes)
57633
4ff8c090d580 repaired named derivations
blanchet
parents: 57631
diff changeset
   248
  end;
57629
e88b5f59cade use the noted theorem whenever possible, because it has a named derivation (leading to cleaner proof terms)
blanchet
parents: 57567
diff changeset
   249
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   250
(* The standard binding stands for a name generated following the canonical convention (e.g.,
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   251
   "is_Nil" from "Nil"). In contrast, the empty binding is either the standard binding or no
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   252
   binding at all, depending on the context. *)
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   253
val standard_binding = @{binding _};
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   254
57091
1fa9c19ba2c9 got rid of '=:' squiggly
blanchet
parents: 57090
diff changeset
   255
val parse_binding_colon = Parse.binding --| @{keyword ":"};
55469
b19dd108f0c2 aligned the syntax for 'free_constructors' on the 'datatype_new' and 'codatatype' syntax
blanchet
parents: 54701
diff changeset
   256
val parse_opt_binding_colon = Scan.optional parse_binding_colon Binding.empty;
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   257
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   258
fun ss_only thms ctxt = clear_simpset (put_simpset HOL_basic_ss ctxt) addsimps thms;
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   259
59271
c448752e8b9d generate 'disc_eq_case' for Ctr_Sugars
desharna
parents: 58659
diff changeset
   260
val eqTrueI = @{thm iffD2[OF eq_True]};
c448752e8b9d generate 'disc_eq_case' for Ctr_Sugars
desharna
parents: 58659
diff changeset
   261
val eqFalseI =  @{thm iffD2[OF eq_False]};
c448752e8b9d generate 'disc_eq_case' for Ctr_Sugars
desharna
parents: 58659
diff changeset
   262
54540
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   263
(*Tactical WRAP surrounds a static given tactic (core) with two deterministic chains of tactics*)
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   264
fun WRAP gen_before gen_after xs core_tac =
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   265
  fold_rev (fn x => fn tac => gen_before x THEN tac THEN gen_after x) xs core_tac;
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   266
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   267
fun WRAP' gen_before gen_after xs core_tac =
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   268
  fold_rev (fn x => fn tac => gen_before x THEN' tac THEN' gen_after x) xs core_tac;
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   269
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   270
fun CONJ_WRAP_GEN conj_tac gen_tac xs =
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   271
  let val (butlast, last) = split_last xs;
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   272
  in WRAP (fn thm => conj_tac THEN gen_tac thm) (K all_tac) butlast (gen_tac last) end;
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   273
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   274
fun CONJ_WRAP_GEN' conj_tac gen_tac xs =
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   275
  let val (butlast, last) = split_last xs;
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   276
  in WRAP' (fn thm => conj_tac THEN' gen_tac thm) (K (K all_tac)) butlast (gen_tac last) end;
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   277
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   278
fun CONJ_WRAP gen_tac = CONJ_WRAP_GEN (rtac conjI 1) gen_tac;
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   279
fun CONJ_WRAP' gen_tac = CONJ_WRAP_GEN' (rtac conjI) gen_tac;
5d7006e9205e moved 'coinduction' proof method to 'HOL'
blanchet
parents: 54491
diff changeset
   280
60728
26ffdb966759 {r,e,d,f}tac with proper context in BNF
traytel
parents: 59877
diff changeset
   281
fun rtac ctxt thm = resolve_tac ctxt [thm];
26ffdb966759 {r,e,d,f}tac with proper context in BNF
traytel
parents: 59877
diff changeset
   282
fun etac ctxt thm = eresolve_tac ctxt [thm];
26ffdb966759 {r,e,d,f}tac with proper context in BNF
traytel
parents: 59877
diff changeset
   283
fun dtac ctxt thm = dresolve_tac ctxt [thm];
26ffdb966759 {r,e,d,f}tac with proper context in BNF
traytel
parents: 59877
diff changeset
   284
fun ftac ctxt thm = forward_tac ctxt [thm];
26ffdb966759 {r,e,d,f}tac with proper context in BNF
traytel
parents: 59877
diff changeset
   285
54008
b15cfc2864de refactoring -- splitting between constructor sugar dependencies and true BNF dependencies
blanchet
parents:
diff changeset
   286
end;