src/Pure/tactic.ML
author wenzelm
Mon, 25 Jun 2007 00:36:41 +0200
changeset 23492 60cf5cf30b81
parent 23223 7791128b39a9
child 23539 df5440e241a1
permissions -rw-r--r--
added eta_long_tac;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10805
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
     1
(*  Title:      Pure/tactic.ML
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
10805
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1991  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
10805
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
     6
Tactics.
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
11774
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
     9
signature BASIC_TACTIC =
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
    10
sig
23223
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    11
  val trace_goalno_tac: (int -> tactic) -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    12
  val rule_by_tactic: tactic -> thm -> thm
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    13
  val assume_tac: int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    14
  val eq_assume_tac: int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    15
  val compose_tac: (bool * thm * int) -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    16
  val make_elim: thm -> thm
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    17
  val biresolve_tac: (bool * thm) list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    18
  val resolve_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    19
  val eresolve_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    20
  val forward_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    21
  val dresolve_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    22
  val atac: int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    23
  val rtac: thm -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    24
  val dtac: thm -> int ->tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    25
  val etac: thm -> int ->tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    26
  val ftac: thm -> int ->tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    27
  val datac: thm -> int -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    28
  val eatac: thm -> int -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    29
  val fatac: thm -> int -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    30
  val ares_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    31
  val solve_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    32
  val bimatch_tac: (bool * thm) list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    33
  val match_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    34
  val ematch_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    35
  val dmatch_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    36
  val flexflex_tac: tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    37
  val distinct_subgoal_tac: int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    38
  val distinct_subgoals_tac: tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    39
  val lift_inst_rule: thm * int * (string*string)list * thm -> thm
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    40
  val term_lift_inst_rule:
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    41
    thm * int * ((indexname * sort) * typ) list * ((indexname * typ) * term) list * thm -> thm
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    42
  val compose_inst_tac: (string * string) list -> (bool * thm * int) -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    43
  val res_inst_tac: (string * string) list -> thm -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    44
  val eres_inst_tac: (string * string) list -> thm -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    45
  val cut_inst_tac: (string * string) list -> thm -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    46
  val forw_inst_tac: (string * string) list -> thm -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    47
  val dres_inst_tac: (string * string) list -> thm -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    48
  val instantiate_tac: (string * string) list -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    49
  val thin_tac: string -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    50
  val metacut_tac: thm -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    51
  val cut_rules_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    52
  val cut_facts_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    53
  val subgoal_tac: string -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    54
  val subgoals_tac: string list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    55
  val filter_thms: (term * term -> bool) -> int * term * thm list -> thm list
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    56
  val biresolution_from_nets_tac: ('a list -> (bool * thm) list) ->
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    57
    bool -> 'a Net.net * 'a Net.net -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    58
  val biresolve_from_nets_tac: (int * (bool * thm)) Net.net * (int * (bool * thm)) Net.net ->
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    59
    int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    60
  val bimatch_from_nets_tac: (int * (bool * thm)) Net.net * (int * (bool * thm)) Net.net ->
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    61
    int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    62
  val net_biresolve_tac: (bool * thm) list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    63
  val net_bimatch_tac: (bool * thm) list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    64
  val build_net: thm list -> (int * thm) Net.net
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    65
  val filt_resolve_tac: thm list -> int -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    66
  val resolve_from_net_tac: (int * thm) Net.net -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    67
  val match_from_net_tac: (int * thm) Net.net -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    68
  val net_resolve_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    69
  val net_match_tac: thm list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    70
  val subgoals_of_brl: bool * thm -> int
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    71
  val lessb: (bool * thm) * (bool * thm) -> bool
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    72
  val rename_params_tac: string list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    73
  val rename_tac: string -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    74
  val rename_last_tac: string -> string list -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    75
  val rotate_tac: int -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    76
  val defer_tac: int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    77
  val filter_prems_tac: (term -> bool) -> int -> tactic
23492
60cf5cf30b81 added eta_long_tac;
wenzelm
parents: 23223
diff changeset
    78
  val eta_long_tac: int -> tactic
11774
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
    79
end;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
11774
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
    81
signature TACTIC =
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
    82
sig
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
    83
  include BASIC_TACTIC
11929
a77ad6c86564 innermost_params;
wenzelm
parents: 11774
diff changeset
    84
  val innermost_params: int -> thm -> (string * typ) list
23223
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    85
  val lift_inst_rule': thm * int * (indexname * string) list * thm -> thm
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    86
  val compose_inst_tac': (indexname * string) list -> (bool * thm * int) -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    87
  val res_inst_tac': (indexname * string) list -> thm -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    88
  val eres_inst_tac': (indexname * string) list -> thm -> int -> tactic
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    89
  val make_elim_preserve: thm -> thm
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    90
  val instantiate_tac': (indexname * string) list -> tactic
11774
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
    91
  val untaglist: (int * 'a) list -> 'a list
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
    92
  val orderlist: (int * 'a) list -> 'a list
23223
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    93
  val insert_tagged_brl: 'a * (bool * thm) ->
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    94
    ('a * (bool * thm)) Net.net * ('a * (bool * thm)) Net.net ->
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    95
      ('a * (bool * thm)) Net.net * ('a * (bool * thm)) Net.net
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    96
  val build_netpair: (int * (bool * thm)) Net.net * (int * (bool * thm)) Net.net ->
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    97
    (bool * thm) list -> (int * (bool * thm)) Net.net * (int * (bool * thm)) Net.net
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    98
  val delete_tagged_brl: bool * thm ->
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
    99
    ('a * (bool * thm)) Net.net * ('a * (bool * thm)) Net.net ->
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
   100
      ('a * (bool * thm)) Net.net * ('a * (bool * thm)) Net.net
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
   101
  val eq_kbrl: ('a * (bool * thm)) * ('a * (bool * thm)) -> bool
11774
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
   102
end;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
11774
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
   104
structure Tactic: TACTIC =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
struct
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   107
(*Discover which goal is chosen:  SOMEGOAL(trace_goalno_tac tac) *)
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   108
fun trace_goalno_tac tac i st =
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   109
    case Seq.pull(tac i st) of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15464
diff changeset
   110
        NONE    => Seq.empty
12262
11ff5f47df6e use tracing function for trace output;
wenzelm
parents: 12212
diff changeset
   111
      | seqcell => (tracing ("Subgoal " ^ string_of_int i ^ " selected");
10805
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
   112
                         Seq.make(fn()=> seqcell));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
(*Makes a rule by applying a tactic to an existing rule*)
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   115
fun rule_by_tactic tac rl =
19925
3f9341831812 eliminated freeze/varify in favour of Variable.import/export/trade;
wenzelm
parents: 19743
diff changeset
   116
  let
3f9341831812 eliminated freeze/varify in favour of Variable.import/export/trade;
wenzelm
parents: 19743
diff changeset
   117
    val ctxt = Variable.thm_context rl;
22568
ed7aa5a350ef renamed Variable.import to import_thms (avoid clash with Alice keywords);
wenzelm
parents: 22560
diff changeset
   118
    val ((_, [st]), ctxt') = Variable.import_thms true [rl] ctxt;
19925
3f9341831812 eliminated freeze/varify in favour of Variable.import/export/trade;
wenzelm
parents: 19743
diff changeset
   119
  in
3f9341831812 eliminated freeze/varify in favour of Variable.import/export/trade;
wenzelm
parents: 19743
diff changeset
   120
    (case Seq.pull (tac st) of
3f9341831812 eliminated freeze/varify in favour of Variable.import/export/trade;
wenzelm
parents: 19743
diff changeset
   121
      NONE => raise THM ("rule_by_tactic", 0, [rl])
3f9341831812 eliminated freeze/varify in favour of Variable.import/export/trade;
wenzelm
parents: 19743
diff changeset
   122
    | SOME (st', _) => zero_var_indexes (singleton (Variable.export ctxt' ctxt) st'))
2688
889a1cbd1aca rule_by_tactic no longer standardizes its result
paulson
parents: 2672
diff changeset
   123
  end;
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   124
19925
3f9341831812 eliminated freeze/varify in favour of Variable.import/export/trade;
wenzelm
parents: 19743
diff changeset
   125
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
(*** Basic tactics ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
(*** The following fail if the goal number is out of range:
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
     thus (REPEAT (resolve_tac rules i)) stops once subgoal i disappears. *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
(*Solve subgoal i by assumption*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
fun assume_tac i = PRIMSEQ (assumption i);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
(*Solve subgoal i by assumption, using no unification*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
fun eq_assume_tac i = PRIMITIVE (eq_assumption i);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
23223
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
   137
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
(** Resolution/matching tactics **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
(*The composition rule/state: no lifting or var renaming.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
  The arg = (bires_flg, orule, m) ;  see bicompose for explanation.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
fun compose_tac arg i = PRIMSEQ (bicompose false arg i);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
(*Converts a "destruct" rule like P&Q==>P to an "elimination" rule
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
  like [| P&Q; P==>R |] ==> R *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
fun make_elim rl = zero_var_indexes (rl RS revcut_rl);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
(*Attack subgoal i by resolution, using flags to indicate elimination rules*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
fun biresolve_tac brules i = PRIMSEQ (biresolution false brules i);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
(*Resolution: the simple case, works for introduction rules*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
fun resolve_tac rules = biresolve_tac (map (pair false) rules);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
(*Resolution with elimination rules only*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
fun eresolve_tac rules = biresolve_tac (map (pair true) rules);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   157
(*Forward reasoning using destruction rules.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   158
fun forward_tac rls = resolve_tac (map make_elim rls) THEN' assume_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
(*Like forward_tac, but deletes the assumption after use.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
fun dresolve_tac rls = eresolve_tac (map make_elim rls);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
(*Shorthand versions: for resolution with a single theorem*)
7491
95a4af0e10a7 added ftac, eatac, datac, fatac
oheimb
parents: 7248
diff changeset
   164
val atac    =   assume_tac;
95a4af0e10a7 added ftac, eatac, datac, fatac
oheimb
parents: 7248
diff changeset
   165
fun rtac rl =  resolve_tac [rl];
95a4af0e10a7 added ftac, eatac, datac, fatac
oheimb
parents: 7248
diff changeset
   166
fun dtac rl = dresolve_tac [rl];
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   167
fun etac rl = eresolve_tac [rl];
7491
95a4af0e10a7 added ftac, eatac, datac, fatac
oheimb
parents: 7248
diff changeset
   168
fun ftac rl =  forward_tac [rl];
95a4af0e10a7 added ftac, eatac, datac, fatac
oheimb
parents: 7248
diff changeset
   169
fun datac thm j = EVERY' (dtac thm::replicate j atac);
95a4af0e10a7 added ftac, eatac, datac, fatac
oheimb
parents: 7248
diff changeset
   170
fun eatac thm j = EVERY' (etac thm::replicate j atac);
95a4af0e10a7 added ftac, eatac, datac, fatac
oheimb
parents: 7248
diff changeset
   171
fun fatac thm j = EVERY' (ftac thm::replicate j atac);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
(*Use an assumption or some rules ... A popular combination!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
fun ares_tac rules = assume_tac  ORELSE'  resolve_tac rules;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
5263
8862ed2db431 added solve_tac;
wenzelm
parents: 4713
diff changeset
   176
fun solve_tac rules = resolve_tac rules THEN_ALL_NEW assume_tac;
8862ed2db431 added solve_tac;
wenzelm
parents: 4713
diff changeset
   177
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
(*Matching tactics -- as above, but forbid updating of state*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
fun bimatch_tac brules i = PRIMSEQ (biresolution true brules i);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
fun match_tac rules  = bimatch_tac (map (pair false) rules);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   181
fun ematch_tac rules = bimatch_tac (map (pair true) rules);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   182
fun dmatch_tac rls   = ematch_tac (map make_elim rls);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   183
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   184
(*Smash all flex-flex disagreement pairs in the proof state.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
val flexflex_tac = PRIMSEQ flexflex_rule;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
19056
6ac9dfe98e54 sane version of distinct_subgoals_tac, based on composition with Drule.distinct_prems_rl;
wenzelm
parents: 18977
diff changeset
   187
(*Remove duplicate subgoals.*)
22560
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   188
val perm_tac = PRIMITIVE oo Thm.permute_prems;
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   189
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   190
fun distinct_tac (i, k) =
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   191
  perm_tac 0 (i - 1) THEN
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   192
  perm_tac 1 (k - 1) THEN
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   193
  DETERM (PRIMSEQ (fn st =>
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   194
    Thm.compose_no_flatten false (st, 0) 1
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   195
      (Drule.incr_indexes st Drule.distinct_prems_rl))) THEN
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   196
  perm_tac 1 (1 - k) THEN
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   197
  perm_tac 0 (1 - i);
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   198
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   199
fun distinct_subgoal_tac i st =
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   200
  (case Library.drop (i - 1, Thm.prems_of st) of
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   201
    [] => no_tac st
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   202
  | A :: Bs =>
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   203
      st |> EVERY (fold (fn (B, k) =>
23223
7791128b39a9 cleaned up signature;
wenzelm
parents: 23178
diff changeset
   204
        if A aconv B then cons (distinct_tac (i, k)) else I) (Bs ~~ (1 upto length Bs)) []));
22560
f19ddf96c323 now exports distinct_subgoal_tac (needed by MetisAPI)
paulson
parents: 22360
diff changeset
   205
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   206
fun distinct_subgoals_tac state =
19056
6ac9dfe98e54 sane version of distinct_subgoals_tac, based on composition with Drule.distinct_prems_rl;
wenzelm
parents: 18977
diff changeset
   207
  let
6ac9dfe98e54 sane version of distinct_subgoals_tac, based on composition with Drule.distinct_prems_rl;
wenzelm
parents: 18977
diff changeset
   208
    val goals = Thm.prems_of state;
6ac9dfe98e54 sane version of distinct_subgoals_tac, based on composition with Drule.distinct_prems_rl;
wenzelm
parents: 18977
diff changeset
   209
    val dups = distinct (eq_fst (op aconv)) (goals ~~ (1 upto length goals));
6ac9dfe98e54 sane version of distinct_subgoals_tac, based on composition with Drule.distinct_prems_rl;
wenzelm
parents: 18977
diff changeset
   210
  in EVERY (rev (map (distinct_subgoal_tac o snd) dups)) state end;
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   211
11929
a77ad6c86564 innermost_params;
wenzelm
parents: 11774
diff changeset
   212
(*Determine print names of goal parameters (reversed)*)
a77ad6c86564 innermost_params;
wenzelm
parents: 11774
diff changeset
   213
fun innermost_params i st =
a77ad6c86564 innermost_params;
wenzelm
parents: 11774
diff changeset
   214
  let val (_, _, Bi, _) = dest_state (st, i)
a77ad6c86564 innermost_params;
wenzelm
parents: 11774
diff changeset
   215
  in rename_wrt_term Bi (Logic.strip_params Bi) end;
a77ad6c86564 innermost_params;
wenzelm
parents: 11774
diff changeset
   216
15453
6318e634e6cc some rationalizing of res_inst_tac
paulson
parents: 15442
diff changeset
   217
(*params of subgoal i as they are printed*)
19532
dae447f2b0b4 tidied and harmonized "params_of_state"
paulson
parents: 19482
diff changeset
   218
fun params_of_state i st = rev (innermost_params i st);
16425
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   219
15453
6318e634e6cc some rationalizing of res_inst_tac
paulson
parents: 15442
diff changeset
   220
(*read instantiations with respect to subgoal i of proof state st*)
6318e634e6cc some rationalizing of res_inst_tac
paulson
parents: 15442
diff changeset
   221
fun read_insts_in_state (st, i, sinsts, rule) =
16425
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   222
  let val thy = Thm.theory_of_thm st
19532
dae447f2b0b4 tidied and harmonized "params_of_state"
paulson
parents: 19482
diff changeset
   223
      and params = params_of_state i st
16425
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   224
      and rts = types_sorts rule and (types,sorts) = types_sorts st
17271
2756a73f63a5 introduced some new-style AList operations
haftmann
parents: 17203
diff changeset
   225
      fun types'(a, ~1) = (case AList.lookup (op =) params a of NONE => types (a, ~1) | sm => sm)
16425
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   226
        | types' ixn = types ixn;
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   227
      val used = Drule.add_used rule (Drule.add_used st []);
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   228
  in read_insts thy rts (types',sorts) used sinsts end;
15453
6318e634e6cc some rationalizing of res_inst_tac
paulson
parents: 15442
diff changeset
   229
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   230
(*Lift and instantiate a rule wrt the given state and subgoal number *)
15442
3b75e1b22ff1 Added variants of instantiation functions that operate on pairs of type
berghofe
parents: 15021
diff changeset
   231
fun lift_inst_rule' (st, i, sinsts, rule) =
15453
6318e634e6cc some rationalizing of res_inst_tac
paulson
parents: 15442
diff changeset
   232
let val (Tinsts,insts) = read_insts_in_state (st, i, sinsts, rule)
6318e634e6cc some rationalizing of res_inst_tac
paulson
parents: 15442
diff changeset
   233
    and {maxidx,...} = rep_thm st
19532
dae447f2b0b4 tidied and harmonized "params_of_state"
paulson
parents: 19482
diff changeset
   234
    and params = params_of_state i st
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   235
    val paramTs = map #2 params
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   236
    and inc = maxidx+1
16876
f57b38cced32 Logic.incr_tvar;
wenzelm
parents: 16809
diff changeset
   237
    fun liftvar (Var ((a,j), T)) = Var((a, j+inc), paramTs---> Logic.incr_tvar inc T)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   238
      | liftvar t = raise TERM("Variable expected", [t]);
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   239
    fun liftterm t = list_abs_free (params,
10805
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
   240
                                    Logic.incr_indexes(paramTs,inc) t)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   241
    (*Lifts instantiation pair over params*)
230
ec8a2b6aa8a7 Many other files modified as follows:
lcp
parents: 214
diff changeset
   242
    fun liftpair (cv,ct) = (cterm_fun liftvar cv, cterm_fun liftterm ct)
16876
f57b38cced32 Logic.incr_tvar;
wenzelm
parents: 16809
diff changeset
   243
    val lifttvar = pairself (ctyp_fun (Logic.incr_tvar inc))
8129
29e239c7b8c2 Thm.instantiate no longer normalizes, but Drule.instantiate does
paulson
parents: 7596
diff changeset
   244
in Drule.instantiate (map lifttvar Tinsts, map liftpair insts)
18145
6757627acf59 renamed Thm.cgoal_of to Thm.cprem_of;
wenzelm
parents: 18034
diff changeset
   245
                     (Thm.lift_rule (Thm.cprem_of st i) rule)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   246
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   247
15442
3b75e1b22ff1 Added variants of instantiation functions that operate on pairs of type
berghofe
parents: 15021
diff changeset
   248
fun lift_inst_rule (st, i, sinsts, rule) = lift_inst_rule'
20302
265b2342cf21 renamed Syntax.indexname to Syntax.read_indexname;
wenzelm
parents: 20232
diff changeset
   249
  (st, i, map (apfst Syntax.read_indexname) sinsts, rule);
15442
3b75e1b22ff1 Added variants of instantiation functions that operate on pairs of type
berghofe
parents: 15021
diff changeset
   250
3984
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   251
(*
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   252
Like lift_inst_rule but takes terms, not strings, where the terms may contain
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   253
Bounds referring to parameters of the subgoal.
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   254
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   255
insts: [...,(vj,tj),...]
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   256
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   257
The tj may contain references to parameters of subgoal i of the state st
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   258
in the form of Bound k, i.e. the tj may be subterms of the subgoal.
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   259
To saturate the lose bound vars, the tj are enclosed in abstractions
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   260
corresponding to the parameters of subgoal i, thus turning them into
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   261
functions. At the same time, the types of the vj are lifted.
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   262
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   263
NB: the types in insts must be correctly instantiated already,
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   264
    i.e. Tinsts is not applied to insts.
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   265
*)
1975
eec67972b1bf renamed cterm_lift_inst_rule to term_lift_inst_rule and made it take
nipkow
parents: 1966
diff changeset
   266
fun term_lift_inst_rule (st, i, Tinsts, insts, rule) =
16425
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   267
let val {maxidx,thy,...} = rep_thm st
19532
dae447f2b0b4 tidied and harmonized "params_of_state"
paulson
parents: 19482
diff changeset
   268
    val paramTs = map #2 (params_of_state i st)
1966
9e626f86e335 added cterm_lift_inst_rule
nipkow
parents: 1955
diff changeset
   269
    and inc = maxidx+1
16876
f57b38cced32 Logic.incr_tvar;
wenzelm
parents: 16809
diff changeset
   270
    fun liftvar ((a,j), T) = Var((a, j+inc), paramTs---> Logic.incr_tvar inc T)
1975
eec67972b1bf renamed cterm_lift_inst_rule to term_lift_inst_rule and made it take
nipkow
parents: 1966
diff changeset
   271
    (*lift only Var, not term, which must be lifted already*)
16425
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   272
    fun liftpair (v,t) = (cterm_of thy (liftvar v), cterm_of thy t)
15797
a63605582573 - Eliminated nodup_vars check.
berghofe
parents: 15696
diff changeset
   273
    fun liftTpair (((a, i), S), T) =
16425
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   274
      (ctyp_of thy (TVar ((a, i + inc), S)),
16876
f57b38cced32 Logic.incr_tvar;
wenzelm
parents: 16809
diff changeset
   275
       ctyp_of thy (Logic.incr_tvar inc T))
8129
29e239c7b8c2 Thm.instantiate no longer normalizes, but Drule.instantiate does
paulson
parents: 7596
diff changeset
   276
in Drule.instantiate (map liftTpair Tinsts, map liftpair insts)
18145
6757627acf59 renamed Thm.cgoal_of to Thm.cprem_of;
wenzelm
parents: 18034
diff changeset
   277
                     (Thm.lift_rule (Thm.cprem_of st i) rule)
1966
9e626f86e335 added cterm_lift_inst_rule
nipkow
parents: 1955
diff changeset
   278
end;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   279
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   280
(*** Resolve after lifting and instantation; may refer to parameters of the
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   281
     subgoal.  Fails if "i" is out of range.  ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   282
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   283
(*compose version: arguments are as for bicompose.*)
15442
3b75e1b22ff1 Added variants of instantiation functions that operate on pairs of type
berghofe
parents: 15021
diff changeset
   284
fun gen_compose_inst_tac instf sinsts (bires_flg, rule, nsubgoal) i st =
8977
dd8bc754a072 res_inst_tac, etc., no longer print the "dest_state" message when the selected
paulson
parents: 8129
diff changeset
   285
  if i > nprems_of st then no_tac st
dd8bc754a072 res_inst_tac, etc., no longer print the "dest_state" message when the selected
paulson
parents: 8129
diff changeset
   286
  else st |>
15442
3b75e1b22ff1 Added variants of instantiation functions that operate on pairs of type
berghofe
parents: 15021
diff changeset
   287
    (compose_tac (bires_flg, instf (st, i, sinsts, rule), nsubgoal) i
12262
11ff5f47df6e use tracing function for trace output;
wenzelm
parents: 12212
diff changeset
   288
     handle TERM (msg,_)   => (warning msg;  no_tac)
11ff5f47df6e use tracing function for trace output;
wenzelm
parents: 12212
diff changeset
   289
          | THM  (msg,_,_) => (warning msg;  no_tac));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   290
15442
3b75e1b22ff1 Added variants of instantiation functions that operate on pairs of type
berghofe
parents: 15021
diff changeset
   291
val compose_inst_tac = gen_compose_inst_tac lift_inst_rule;
3b75e1b22ff1 Added variants of instantiation functions that operate on pairs of type
berghofe
parents: 15021
diff changeset
   292
val compose_inst_tac' = gen_compose_inst_tac lift_inst_rule';
3b75e1b22ff1 Added variants of instantiation functions that operate on pairs of type
berghofe
parents: 15021
diff changeset
   293
761
04320c295500 res_inst_tac: added comments
lcp
parents: 670
diff changeset
   294
(*"Resolve" version.  Note: res_inst_tac cannot behave sensibly if the
04320c295500 res_inst_tac: added comments
lcp
parents: 670
diff changeset
   295
  terms that are substituted contain (term or type) unknowns from the
04320c295500 res_inst_tac: added comments
lcp
parents: 670
diff changeset
   296
  goal, because it is unable to instantiate goal unknowns at the same time.
04320c295500 res_inst_tac: added comments
lcp
parents: 670
diff changeset
   297
2029
2fa4c4b1a7fe Generalized freeze to freeze_thaw in order to
paulson
parents: 1975
diff changeset
   298
  The type checker is instructed not to freeze flexible type vars that
952
9e10962866b0 Removed an old bug which made some simultaneous instantiations fail if they
nipkow
parents: 949
diff changeset
   299
  were introduced during type inference and still remain in the term at the
9e10962866b0 Removed an old bug which made some simultaneous instantiations fail if they
nipkow
parents: 949
diff changeset
   300
  end.  This increases flexibility but can introduce schematic type vars in
9e10962866b0 Removed an old bug which made some simultaneous instantiations fail if they
nipkow
parents: 949
diff changeset
   301
  goals.
761
04320c295500 res_inst_tac: added comments
lcp
parents: 670
diff changeset
   302
*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   303
fun res_inst_tac sinsts rule i =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   304
    compose_inst_tac sinsts (false, rule, nprems_of rule) i;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   305
15442
3b75e1b22ff1 Added variants of instantiation functions that operate on pairs of type
berghofe
parents: 15021
diff changeset
   306
fun res_inst_tac' sinsts rule i =
3b75e1b22ff1 Added variants of instantiation functions that operate on pairs of type
berghofe
parents: 15021
diff changeset
   307
    compose_inst_tac' sinsts (false, rule, nprems_of rule) i;
3b75e1b22ff1 Added variants of instantiation functions that operate on pairs of type
berghofe
parents: 15021
diff changeset
   308
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   309
(*eresolve elimination version*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   310
fun eres_inst_tac sinsts rule i =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   311
    compose_inst_tac sinsts (true, rule, nprems_of rule) i;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   312
15464
02cc838b64ca Added variant of eres_inst_tac that operates on indexnames instead of strings.
berghofe
parents: 15453
diff changeset
   313
fun eres_inst_tac' sinsts rule i =
02cc838b64ca Added variant of eres_inst_tac that operates on indexnames instead of strings.
berghofe
parents: 15453
diff changeset
   314
    compose_inst_tac' sinsts (true, rule, nprems_of rule) i;
02cc838b64ca Added variant of eres_inst_tac that operates on indexnames instead of strings.
berghofe
parents: 15453
diff changeset
   315
270
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   316
(*For forw_inst_tac and dres_inst_tac.  Preserve Var indexes of rl;
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   317
  increment revcut_rl instead.*)
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   318
fun make_elim_preserve rl =
270
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   319
  let val {maxidx,...} = rep_thm rl
16425
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   320
      fun cvar ixn = cterm_of ProtoPure.thy (Var(ixn,propT));
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   321
      val revcut_rl' =
10805
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
   322
          instantiate ([],  [(cvar("V",0), cvar("V",maxidx+1)),
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
   323
                             (cvar("W",0), cvar("W",maxidx+1))]) revcut_rl
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   324
      val arg = (false, rl, nprems_of rl)
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   325
      val [th] = Seq.list_of (bicompose false arg 1 revcut_rl')
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   326
  in  th  end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   327
  handle Bind => raise THM("make_elim_preserve", 1, [rl]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   328
270
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   329
(*instantiate and cut -- for a FACT, anyway...*)
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   330
fun cut_inst_tac sinsts rule = res_inst_tac sinsts (make_elim_preserve rule);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   331
270
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   332
(*forward tactic applies a RULE to an assumption without deleting it*)
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   333
fun forw_inst_tac sinsts rule = cut_inst_tac sinsts rule THEN' assume_tac;
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   334
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   335
(*dresolve tactic applies a RULE to replace an assumption*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   336
fun dres_inst_tac sinsts rule = eres_inst_tac sinsts (make_elim_preserve rule);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   337
10347
c0cfc4ac12e2 added instantiate_tac
oheimb
parents: 9535
diff changeset
   338
(*instantiate variables in the whole state*)
c0cfc4ac12e2 added instantiate_tac
oheimb
parents: 9535
diff changeset
   339
val instantiate_tac = PRIMITIVE o read_instantiate;
c0cfc4ac12e2 added instantiate_tac
oheimb
parents: 9535
diff changeset
   340
15797
a63605582573 - Eliminated nodup_vars check.
berghofe
parents: 15696
diff changeset
   341
val instantiate_tac' = PRIMITIVE o Drule.read_instantiate';
a63605582573 - Eliminated nodup_vars check.
berghofe
parents: 15696
diff changeset
   342
1951
f2b8005bdc6e Declared thin_tac
paulson
parents: 1801
diff changeset
   343
(*Deletion of an assumption*)
f2b8005bdc6e Declared thin_tac
paulson
parents: 1801
diff changeset
   344
fun thin_tac s = eres_inst_tac [("V",s)] thin_rl;
f2b8005bdc6e Declared thin_tac
paulson
parents: 1801
diff changeset
   345
270
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   346
(*** Applications of cut_rl ***)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   347
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   348
(*Used by metacut_tac*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   349
fun bires_cut_tac arg i =
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   350
    resolve_tac [cut_rl] i  THEN  biresolve_tac arg (i+1) ;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   351
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   352
(*The conclusion of the rule gets assumed in subgoal i,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   353
  while subgoal i+1,... are the premises of the rule.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   354
fun metacut_tac rule = bires_cut_tac [(false,rule)];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   355
13650
31bd2a8cdbe2 fixing the cut_tac method to work when there are no instantiations and the
paulson
parents: 13559
diff changeset
   356
(*"Cut" a list of rules into the goal.  Their premises will become new
31bd2a8cdbe2 fixing the cut_tac method to work when there are no instantiations and the
paulson
parents: 13559
diff changeset
   357
  subgoals.*)
31bd2a8cdbe2 fixing the cut_tac method to work when there are no instantiations and the
paulson
parents: 13559
diff changeset
   358
fun cut_rules_tac ths i = EVERY (map (fn th => metacut_tac th i) ths);
31bd2a8cdbe2 fixing the cut_tac method to work when there are no instantiations and the
paulson
parents: 13559
diff changeset
   359
31bd2a8cdbe2 fixing the cut_tac method to work when there are no instantiations and the
paulson
parents: 13559
diff changeset
   360
(*As above, but inserts only facts (unconditional theorems);
31bd2a8cdbe2 fixing the cut_tac method to work when there are no instantiations and the
paulson
parents: 13559
diff changeset
   361
  generates no additional subgoals. *)
20232
31998a8c7f25 removed obsolete is_fact (cf. Thm.no_prems);
wenzelm
parents: 20218
diff changeset
   362
fun cut_facts_tac ths = cut_rules_tac (filter Thm.no_prems ths);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   363
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   364
(*Introduce the given proposition as a lemma and subgoal*)
12847
afa356dbcb15 fixed subgoal_tac; fails on non-existent subgoal;
wenzelm
parents: 12801
diff changeset
   365
fun subgoal_tac sprop =
afa356dbcb15 fixed subgoal_tac; fails on non-existent subgoal;
wenzelm
parents: 12801
diff changeset
   366
  DETERM o res_inst_tac [("psi", sprop)] cut_rl THEN' SUBGOAL (fn (prop, _) =>
afa356dbcb15 fixed subgoal_tac; fails on non-existent subgoal;
wenzelm
parents: 12801
diff changeset
   367
    let val concl' = Logic.strip_assums_concl prop in
4178
e64ff1c1bc70 subgoal_tac displays a warning if the new subgoal has type variables
paulson
parents: 3991
diff changeset
   368
      if null (term_tvars concl') then ()
e64ff1c1bc70 subgoal_tac displays a warning if the new subgoal has type variables
paulson
parents: 3991
diff changeset
   369
      else warning"Type variables in new subgoal: add a type constraint?";
12847
afa356dbcb15 fixed subgoal_tac; fails on non-existent subgoal;
wenzelm
parents: 12801
diff changeset
   370
      all_tac
afa356dbcb15 fixed subgoal_tac; fails on non-existent subgoal;
wenzelm
parents: 12801
diff changeset
   371
  end);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   372
439
ad3f46c13f1e Pure/tactic/subgoals_tac: new (moved from ZF/Order.ML)
lcp
parents: 270
diff changeset
   373
(*Introduce a list of lemmas and subgoals*)
ad3f46c13f1e Pure/tactic/subgoals_tac: new (moved from ZF/Order.ML)
lcp
parents: 270
diff changeset
   374
fun subgoals_tac sprops = EVERY' (map subgoal_tac sprops);
ad3f46c13f1e Pure/tactic/subgoals_tac: new (moved from ZF/Order.ML)
lcp
parents: 270
diff changeset
   375
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   376
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   377
(**** Indexing and filtering of theorems ****)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   378
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   379
(*Returns the list of potentially resolvable theorems for the goal "prem",
10805
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
   380
        using the predicate  could(subgoal,concl).
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   381
  Resulting list is no longer than "limit"*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   382
fun filter_thms could (limit, prem, ths) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   383
  let val pb = Logic.strip_assums_concl prem;   (*delete assumptions*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   384
      fun filtr (limit, []) = []
10805
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
   385
        | filtr (limit, th::ths) =
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
   386
            if limit=0 then  []
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
   387
            else if could(pb, concl_of th)  then th :: filtr(limit-1, ths)
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
   388
            else filtr(limit,ths)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   389
  in  filtr(limit,ths)  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   390
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   391
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   392
(*** biresolution and resolution using nets ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   393
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   394
(** To preserve the order of the rules, tag them with increasing integers **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   395
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   396
(*insert tags*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   397
fun taglist k [] = []
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   398
  | taglist k (x::xs) = (k,x) :: taglist (k+1) xs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   399
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   400
(*remove tags and suppress duplicates -- list is assumed sorted!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   401
fun untaglist [] = []
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   402
  | untaglist [(k:int,x)] = [x]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   403
  | untaglist ((k,x) :: (rest as (k',x')::_)) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   404
      if k=k' then untaglist rest
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   405
      else    x :: untaglist rest;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   406
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   407
(*return list elements in original order*)
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   408
fun orderlist kbrls = untaglist (sort (int_ord o pairself fst) kbrls);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   409
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   410
(*insert one tagged brl into the pair of nets*)
23178
07ba6b58b3d2 simplified/unified list fold;
wenzelm
parents: 22583
diff changeset
   411
fun insert_tagged_brl (kbrl as (k, (eres, th))) (inet, enet) =
12320
6e70d870ddf0 general type of delete_tagged_brl;
wenzelm
parents: 12262
diff changeset
   412
  if eres then
6e70d870ddf0 general type of delete_tagged_brl;
wenzelm
parents: 12262
diff changeset
   413
    (case try Thm.major_prem_of th of
16809
8ca51a846576 export eq_brl;
wenzelm
parents: 16666
diff changeset
   414
      SOME prem => (inet, Net.insert_term (K false) (prem, kbrl) enet)
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15464
diff changeset
   415
    | NONE => error "insert_tagged_brl: elimination rule with no premises")
16809
8ca51a846576 export eq_brl;
wenzelm
parents: 16666
diff changeset
   416
  else (Net.insert_term (K false) (concl_of th, kbrl) inet, enet);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   417
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   418
(*build a pair of nets for biresolution*)
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   419
fun build_netpair netpair brls =
23178
07ba6b58b3d2 simplified/unified list fold;
wenzelm
parents: 22583
diff changeset
   420
    fold_rev insert_tagged_brl (taglist 1 brls) netpair;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   421
12320
6e70d870ddf0 general type of delete_tagged_brl;
wenzelm
parents: 12262
diff changeset
   422
(*delete one kbrl from the pair of nets*)
22360
26ead7ed4f4b moved eq_thm etc. to structure Thm in Pure/more_thm.ML;
wenzelm
parents: 21708
diff changeset
   423
fun eq_kbrl ((_, (_, th)), (_, (_, th'))) = Thm.eq_thm_prop (th, th')
16809
8ca51a846576 export eq_brl;
wenzelm
parents: 16666
diff changeset
   424
23178
07ba6b58b3d2 simplified/unified list fold;
wenzelm
parents: 22583
diff changeset
   425
fun delete_tagged_brl (brl as (eres, th)) (inet, enet) =
13925
761af5c2fd59 catches exception DELETE
paulson
parents: 13650
diff changeset
   426
  (if eres then
12320
6e70d870ddf0 general type of delete_tagged_brl;
wenzelm
parents: 12262
diff changeset
   427
    (case try Thm.major_prem_of th of
16809
8ca51a846576 export eq_brl;
wenzelm
parents: 16666
diff changeset
   428
      SOME prem => (inet, Net.delete_term eq_kbrl (prem, ((), brl)) enet)
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15464
diff changeset
   429
    | NONE => (inet, enet))  (*no major premise: ignore*)
16809
8ca51a846576 export eq_brl;
wenzelm
parents: 16666
diff changeset
   430
  else (Net.delete_term eq_kbrl (Thm.concl_of th, ((), brl)) inet, enet))
13925
761af5c2fd59 catches exception DELETE
paulson
parents: 13650
diff changeset
   431
  handle Net.DELETE => (inet,enet);
1801
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   432
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   433
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   434
(*biresolution using a pair of nets rather than rules.
3706
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   435
    function "order" must sort and possibly filter the list of brls.
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   436
    boolean "match" indicates matching or unification.*)
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   437
fun biresolution_from_nets_tac order match (inet,enet) =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   438
  SUBGOAL
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   439
    (fn (prem,i) =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   440
      let val hyps = Logic.strip_assums_hyp prem
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   441
          and concl = Logic.strip_assums_concl prem
19482
9f11af8f7ef9 tuned basic list operators (flat, maps, map_filter);
wenzelm
parents: 19473
diff changeset
   442
          val kbrls = Net.unify_term inet concl @ maps (Net.unify_term enet) hyps
3706
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   443
      in PRIMSEQ (biresolution match (order kbrls) i) end);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   444
3706
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   445
(*versions taking pre-built nets.  No filtering of brls*)
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   446
val biresolve_from_nets_tac = biresolution_from_nets_tac orderlist false;
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   447
val bimatch_from_nets_tac   = biresolution_from_nets_tac orderlist true;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   448
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   449
(*fast versions using nets internally*)
670
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
   450
val net_biresolve_tac =
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
   451
    biresolve_from_nets_tac o build_netpair(Net.empty,Net.empty);
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
   452
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
   453
val net_bimatch_tac =
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
   454
    bimatch_from_nets_tac o build_netpair(Net.empty,Net.empty);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   455
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   456
(*** Simpler version for resolve_tac -- only one net, and no hyps ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   457
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   458
(*insert one tagged rl into the net*)
23178
07ba6b58b3d2 simplified/unified list fold;
wenzelm
parents: 22583
diff changeset
   459
fun insert_krl (krl as (k,th)) =
07ba6b58b3d2 simplified/unified list fold;
wenzelm
parents: 22583
diff changeset
   460
  Net.insert_term (K false) (concl_of th, krl);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   461
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   462
(*build a net of rules for resolution*)
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   463
fun build_net rls =
23178
07ba6b58b3d2 simplified/unified list fold;
wenzelm
parents: 22583
diff changeset
   464
  fold_rev insert_krl (taglist 1 rls) Net.empty;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   465
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   466
(*resolution using a net rather than rules; pred supports filt_resolve_tac*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   467
fun filt_resolution_from_net_tac match pred net =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   468
  SUBGOAL
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   469
    (fn (prem,i) =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   470
      let val krls = Net.unify_term net (Logic.strip_assums_concl prem)
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   471
      in
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   472
         if pred krls
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   473
         then PRIMSEQ
10805
89a29437cebc added norm_hhf(_tac);
wenzelm
parents: 10444
diff changeset
   474
                (biresolution match (map (pair false) (orderlist krls)) i)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   475
         else no_tac
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   476
      end);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   477
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   478
(*Resolve the subgoal using the rules (making a net) unless too flexible,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   479
   which means more than maxr rules are unifiable.      *)
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   480
fun filt_resolve_tac rules maxr =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   481
    let fun pred krls = length krls <= maxr
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   482
    in  filt_resolution_from_net_tac false pred (build_net rules)  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   483
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   484
(*versions taking pre-built nets*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   485
val resolve_from_net_tac = filt_resolution_from_net_tac false (K true);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   486
val match_from_net_tac = filt_resolution_from_net_tac true (K true);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   487
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   488
(*fast versions using nets internally*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   489
val net_resolve_tac = resolve_from_net_tac o build_net;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   490
val net_match_tac = match_from_net_tac o build_net;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   491
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   492
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   493
(*** For Natural Deduction using (bires_flg, rule) pairs ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   494
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   495
(*The number of new subgoals produced by the brule*)
1077
c2df11ae8b55 Renamed insert_kbrl to insert_tagged_brl and exported it. Now
lcp
parents: 952
diff changeset
   496
fun subgoals_of_brl (true,rule)  = nprems_of rule - 1
c2df11ae8b55 Renamed insert_kbrl to insert_tagged_brl and exported it. Now
lcp
parents: 952
diff changeset
   497
  | subgoals_of_brl (false,rule) = nprems_of rule;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   498
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   499
(*Less-than test: for sorting to minimize number of new subgoals*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   500
fun lessb (brl1,brl2) = subgoals_of_brl brl1 < subgoals_of_brl brl2;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   501
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   502
69
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   503
(*** Renaming of parameters in a subgoal
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   504
     Names may contain letters, digits or primes and must be
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   505
     separated by blanks ***)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   506
9535
a60b0be5ee96 added rename_params_tac;
wenzelm
parents: 8977
diff changeset
   507
fun rename_params_tac xs i =
14673
3d760a971fde use Syntax.is_identifier;
wenzelm
parents: 13925
diff changeset
   508
  case Library.find_first (not o Syntax.is_identifier) xs of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15464
diff changeset
   509
      SOME x => error ("Not an identifier: " ^ x)
16425
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   510
    | NONE =>
13559
51c3ac47d127 added checking so that (rename_tac "x y") is rejected, since
paulson
parents: 13105
diff changeset
   511
       (if !Logic.auto_rename
16425
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   512
         then (warning "Resetting Logic.auto_rename";
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   513
             Logic.auto_rename := false)
2427be27cc60 accomodate identification of type Sign.sg and theory;
wenzelm
parents: 16325
diff changeset
   514
        else (); PRIMITIVE (rename_params_rule (xs, i)));
9535
a60b0be5ee96 added rename_params_tac;
wenzelm
parents: 8977
diff changeset
   515
22583
4b1ecb19b411 added scanwords from library.ML (for obsolete rename_tac);
wenzelm
parents: 22568
diff changeset
   516
(*scan a list of characters into "words" composed of "letters" (recognized by
4b1ecb19b411 added scanwords from library.ML (for obsolete rename_tac);
wenzelm
parents: 22568
diff changeset
   517
  is_let) and separated by any number of non-"letters"*)
4b1ecb19b411 added scanwords from library.ML (for obsolete rename_tac);
wenzelm
parents: 22568
diff changeset
   518
fun scanwords is_let cs =
4b1ecb19b411 added scanwords from library.ML (for obsolete rename_tac);
wenzelm
parents: 22568
diff changeset
   519
  let fun scan1 [] = []
4b1ecb19b411 added scanwords from library.ML (for obsolete rename_tac);
wenzelm
parents: 22568
diff changeset
   520
        | scan1 cs =
4b1ecb19b411 added scanwords from library.ML (for obsolete rename_tac);
wenzelm
parents: 22568
diff changeset
   521
            let val (lets, rest) = take_prefix is_let cs
4b1ecb19b411 added scanwords from library.ML (for obsolete rename_tac);
wenzelm
parents: 22568
diff changeset
   522
            in implode lets :: scanwords is_let rest end;
4b1ecb19b411 added scanwords from library.ML (for obsolete rename_tac);
wenzelm
parents: 22568
diff changeset
   523
  in scan1 (#2 (take_prefix (not o is_let) cs)) end;
4b1ecb19b411 added scanwords from library.ML (for obsolete rename_tac);
wenzelm
parents: 22568
diff changeset
   524
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   525
fun rename_tac str i =
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   526
  let val cs = Symbol.explode str in
4693
2e47ea2c6109 adapted to baroque chars;
wenzelm
parents: 4611
diff changeset
   527
  case #2 (take_prefix (Symbol.is_letdig orf Symbol.is_blank) cs) of
9535
a60b0be5ee96 added rename_params_tac;
wenzelm
parents: 8977
diff changeset
   528
      [] => rename_params_tac (scanwords Symbol.is_letdig cs) i
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   529
    | c::_ => error ("Illegal character: " ^ c)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   530
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   531
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   532
(*Rename recent parameters using names generated from a and the suffixes,
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   533
  provided the string a, which represents a term, is an identifier. *)
10817
083d4a6734b4 tuned norm_hhf(_tac);
wenzelm
parents: 10805
diff changeset
   534
fun rename_last_tac a sufs i =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   535
  let val names = map (curry op^ a) sufs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   536
  in  if Syntax.is_identifier a
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   537
      then PRIMITIVE (rename_params_rule (names,i))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   538
      else all_tac
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   539
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   540
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   541
(*rotate_tac n i: rotate the assumptions of subgoal i by n positions, from
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   542
  right to left if n is positive, and from left to right if n is negative.*)
2672
85d7e800d754 Replaced "flat" by the Basis Library function List.concat
paulson
parents: 2580
diff changeset
   543
fun rotate_tac 0 i = all_tac
85d7e800d754 Replaced "flat" by the Basis Library function List.concat
paulson
parents: 2580
diff changeset
   544
  | rotate_tac k i = PRIMITIVE (rotate_rule k i);
1209
03dc596b3a18 added rotate_tac.
nipkow
parents: 1077
diff changeset
   545
7248
322151fe6f02 new primitive rule permute_prems to underlie defer_tac and rotate_prems
paulson
parents: 6979
diff changeset
   546
(*Rotates the given subgoal to be the last.*)
322151fe6f02 new primitive rule permute_prems to underlie defer_tac and rotate_prems
paulson
parents: 6979
diff changeset
   547
fun defer_tac i = PRIMITIVE (permute_prems (i-1) 1);
322151fe6f02 new primitive rule permute_prems to underlie defer_tac and rotate_prems
paulson
parents: 6979
diff changeset
   548
5974
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   549
(* remove premises that do not satisfy p; fails if all prems satisfy p *)
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   550
fun filter_prems_tac p =
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15464
diff changeset
   551
  let fun Then NONE tac = SOME tac
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15464
diff changeset
   552
        | Then (SOME tac) tac' = SOME(tac THEN' tac');
19473
wenzelm
parents: 19423
diff changeset
   553
      fun thins H (tac,n) =
5974
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   554
        if p H then (tac,n+1)
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   555
        else (Then tac (rotate_tac n THEN' etac thin_rl),0);
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   556
  in SUBGOAL(fn (subg,n) =>
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   557
       let val Hs = Logic.strip_assums_hyp subg
19473
wenzelm
parents: 19423
diff changeset
   558
       in case fst(fold thins Hs (NONE,0)) of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15464
diff changeset
   559
            NONE => no_tac | SOME tac => tac n
5974
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   560
       end)
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   561
  end;
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   562
23492
60cf5cf30b81 added eta_long_tac;
wenzelm
parents: 23223
diff changeset
   563
(*eta long beta normal form*)
60cf5cf30b81 added eta_long_tac;
wenzelm
parents: 23223
diff changeset
   564
fun eta_long_tac i =
60cf5cf30b81 added eta_long_tac;
wenzelm
parents: 23223
diff changeset
   565
  PRIMITIVE (Conv.fconv_rule (Conv.goals_conv (fn j => i = j) Thm.eta_long_conversion));
60cf5cf30b81 added eta_long_tac;
wenzelm
parents: 23223
diff changeset
   566
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   567
end;
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   568
11774
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
   569
structure BasicTactic: BASIC_TACTIC = Tactic;
3bc4f67d7fe1 qualify some names;
wenzelm
parents: 11768
diff changeset
   570
open BasicTactic;