src/Pure/tactic.ML
author wenzelm
Mon, 12 Jul 1999 22:25:19 +0200
changeset 6979 4b9963810121
parent 6964 0c894ad53457
child 7248 322151fe6f02
permissions -rw-r--r--
removed metacuts_tac;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3575
4e9beacb5339 improved rewrite_thm / rewrite_goals to handle conditional eqns;
wenzelm
parents: 3554
diff changeset
     1
(*  Title: 	Pure/tactic.ML
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
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
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
Tactics 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
signature TACTIC =
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
    10
  sig
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    11
  val ares_tac		: thm list -> int -> tactic
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
  val asm_rewrite_goal_tac:
4713
bea2ab2e360b New simplifier flag for mutual simplification.
nipkow
parents: 4693
diff changeset
    13
    bool*bool*bool -> (meta_simpset -> tactic) -> meta_simpset -> int -> tactic
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    14
  val assume_tac	: int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    15
  val atac	: int ->tactic
670
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
    16
  val bimatch_from_nets_tac: 
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
    17
      (int*(bool*thm)) Net.net * (int*(bool*thm)) Net.net -> int -> tactic
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    18
  val bimatch_tac	: (bool*thm)list -> int -> tactic
3706
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
    19
  val biresolution_from_nets_tac: 
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
    20
	('a list -> (bool * thm) list) ->
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
    21
	bool -> 'a Net.net * 'a Net.net -> int -> tactic
670
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
    22
  val biresolve_from_nets_tac: 
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
    23
      (int*(bool*thm)) Net.net * (int*(bool*thm)) Net.net -> int -> tactic
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    24
  val biresolve_tac	: (bool*thm)list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    25
  val build_net	: thm list -> (int*thm) Net.net
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
    26
  val build_netpair:    (int*(bool*thm)) Net.net * (int*(bool*thm)) Net.net ->
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
    27
      (bool*thm)list -> (int*(bool*thm)) Net.net * (int*(bool*thm)) Net.net
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    28
  val compose_inst_tac	: (string*string)list -> (bool*thm*int) -> 
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    29
                          int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    30
  val compose_tac	: (bool * thm * int) -> int -> tactic 
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    31
  val cut_facts_tac	: thm list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    32
  val cut_inst_tac	: (string*string)list -> thm -> int -> tactic   
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    33
  val defer_tac 	: int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    34
  val distinct_subgoals_tac	: tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    35
  val dmatch_tac	: thm list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    36
  val dresolve_tac	: thm list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    37
  val dres_inst_tac	: (string*string)list -> thm -> int -> tactic   
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    38
  val dtac		: thm -> int ->tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    39
  val etac		: thm -> int ->tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    40
  val eq_assume_tac	: int -> tactic   
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    41
  val ematch_tac	: thm list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    42
  val eresolve_tac	: thm list -> int -> tactic
5974
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
    43
  val eres_inst_tac	: (string*string)list -> thm -> int -> tactic
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
    44
  val filter_prems_tac  : (term -> bool) -> int -> tactic  
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    45
  val filter_thms	: (term*term->bool) -> int*term*thm list -> thm list
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    46
  val filt_resolve_tac	: thm list -> int -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    47
  val flexflex_tac	: tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    48
  val fold_goals_tac	: thm list -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    49
  val fold_tac		: thm list -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    50
  val forward_tac	: thm list -> int -> tactic   
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    51
  val forw_inst_tac	: (string*string)list -> thm -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    52
  val insert_tagged_brl : ('a*(bool*thm)) * 
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    53
                          (('a*(bool*thm))Net.net * ('a*(bool*thm))Net.net) ->
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    54
                          ('a*(bool*thm))Net.net * ('a*(bool*thm))Net.net
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    55
  val delete_tagged_brl	: (bool*thm) * 
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    56
                         ((int*(bool*thm))Net.net * (int*(bool*thm))Net.net) ->
1801
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
    57
                    (int*(bool*thm))Net.net * (int*(bool*thm))Net.net
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    58
  val is_fact		: thm -> bool
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    59
  val lessb		: (bool * thm) * (bool * thm) -> bool
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    60
  val lift_inst_rule	: thm * int * (string*string)list * thm -> thm
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    61
  val make_elim		: thm -> thm
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    62
  val match_from_net_tac	: (int*thm) Net.net -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    63
  val match_tac	: thm list -> int -> tactic
5838
a4122945d638 added metacuts_tac;
wenzelm
parents: 5263
diff changeset
    64
  val metacut_tac	: thm -> int -> tactic
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    65
  val net_bimatch_tac	: (bool*thm) list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    66
  val net_biresolve_tac	: (bool*thm) list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    67
  val net_match_tac	: thm list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    68
  val net_resolve_tac	: thm list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    69
  val orderlist		: (int * 'a) list -> 'a list
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    70
  val PRIMITIVE		: (thm -> thm) -> tactic  
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
    71
  val PRIMSEQ		: (thm -> thm Seq.seq) -> tactic  
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    72
  val prune_params_tac	: tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    73
  val rename_tac	: string -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    74
  val rename_last_tac	: string -> string list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    75
  val resolve_from_net_tac	: (int*thm) Net.net -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    76
  val resolve_tac	: thm list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    77
  val res_inst_tac	: (string*string)list -> thm -> int -> tactic   
3575
4e9beacb5339 improved rewrite_thm / rewrite_goals to handle conditional eqns;
wenzelm
parents: 3554
diff changeset
    78
  val rewrite_goals_rule: thm list -> thm -> thm
4e9beacb5339 improved rewrite_thm / rewrite_goals to handle conditional eqns;
wenzelm
parents: 3554
diff changeset
    79
  val rewrite_rule	: thm list -> thm -> thm
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    80
  val rewrite_goals_tac	: thm list -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    81
  val rewrite_tac	: thm list -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    82
  val rewtac		: thm -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    83
  val rotate_tac	: int -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    84
  val rtac		: thm -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    85
  val rule_by_tactic	: tactic -> thm -> thm
5263
8862ed2db431 added solve_tac;
wenzelm
parents: 4713
diff changeset
    86
  val solve_tac		: thm list -> int -> tactic
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    87
  val subgoal_tac	: string -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    88
  val subgoals_tac	: string list -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    89
  val subgoals_of_brl	: bool * thm -> int
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    90
  val term_lift_inst_rule	:
1975
eec67972b1bf renamed cterm_lift_inst_rule to term_lift_inst_rule and made it take
nipkow
parents: 1966
diff changeset
    91
      thm * int * (indexname*typ)list * ((indexname*typ)*term)list  * thm
eec67972b1bf renamed cterm_lift_inst_rule to term_lift_inst_rule and made it take
nipkow
parents: 1966
diff changeset
    92
      -> thm
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    93
  val thin_tac		: string -> int -> tactic
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
    94
  val trace_goalno_tac	: (int -> tactic) -> int -> tactic
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
    95
  end;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
    98
structure Tactic : TACTIC = 
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
struct
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   101
(*Discover which goal is chosen:  SOMEGOAL(trace_goalno_tac tac) *)
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   102
fun trace_goalno_tac tac i st =  
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   103
    case Seq.pull(tac i st) of
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   104
	None    => Seq.empty
5956
ab4d13e9e77a replaced prs by writeln;
wenzelm
parents: 5838
diff changeset
   105
      | seqcell => (writeln ("Subgoal " ^ string_of_int i ^ " selected"); 
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   106
    			 Seq.make(fn()=> seqcell));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
2029
2fa4c4b1a7fe Generalized freeze to freeze_thaw in order to
paulson
parents: 1975
diff changeset
   109
(*Rotates the given subgoal to be the last.  Useful when re-playing
2fa4c4b1a7fe Generalized freeze to freeze_thaw in order to
paulson
parents: 1975
diff changeset
   110
  an old proof script, when the proof of an early subgoal fails.
4611
18a3f33f2097 moved freeze_thaw to drule.ML
paulson
parents: 4438
diff changeset
   111
  DOES NOT WORK FOR TYPE VARIABLES.
18a3f33f2097 moved freeze_thaw to drule.ML
paulson
parents: 4438
diff changeset
   112
  Similar to drule/rotate_prems*)
6964
0c894ad53457 defer_tac: use try for general exn handling;
wenzelm
parents: 6390
diff changeset
   113
fun defer_rule i state =
2029
2fa4c4b1a7fe Generalized freeze to freeze_thaw in order to
paulson
parents: 1975
diff changeset
   114
    let val (state',thaw) = freeze_thaw state
2fa4c4b1a7fe Generalized freeze to freeze_thaw in order to
paulson
parents: 1975
diff changeset
   115
	val hyps = Drule.strip_imp_prems (adjust_maxidx (cprop_of state'))
2580
e3f680709487 Gradual switching to Basis Library functions nth, drop, etc.
paulson
parents: 2228
diff changeset
   116
	val hyp::hyps' = List.drop(hyps, i-1)
2029
2fa4c4b1a7fe Generalized freeze to freeze_thaw in order to
paulson
parents: 1975
diff changeset
   117
    in  implies_intr hyp (implies_elim_list state' (map assume hyps)) 
2580
e3f680709487 Gradual switching to Basis Library functions nth, drop, etc.
paulson
parents: 2228
diff changeset
   118
        |> implies_intr_list (List.take(hyps, i-1) @ hyps')
2029
2fa4c4b1a7fe Generalized freeze to freeze_thaw in order to
paulson
parents: 1975
diff changeset
   119
        |> thaw
6964
0c894ad53457 defer_tac: use try for general exn handling;
wenzelm
parents: 6390
diff changeset
   120
    end;
0c894ad53457 defer_tac: use try for general exn handling;
wenzelm
parents: 6390
diff changeset
   121
0c894ad53457 defer_tac: use try for general exn handling;
wenzelm
parents: 6390
diff changeset
   122
fun defer_tac i state =
0c894ad53457 defer_tac: use try for general exn handling;
wenzelm
parents: 6390
diff changeset
   123
  (case try (defer_rule i) state of
0c894ad53457 defer_tac: use try for general exn handling;
wenzelm
parents: 6390
diff changeset
   124
    Some state' => Seq.single state'
0c894ad53457 defer_tac: use try for general exn handling;
wenzelm
parents: 6390
diff changeset
   125
  | None => Seq.empty);
2029
2fa4c4b1a7fe Generalized freeze to freeze_thaw in order to
paulson
parents: 1975
diff changeset
   126
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
(*Makes a rule by applying a tactic to an existing rule*)
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   129
fun rule_by_tactic tac rl =
2688
889a1cbd1aca rule_by_tactic no longer standardizes its result
paulson
parents: 2672
diff changeset
   130
  let val (st, thaw) = freeze_thaw (zero_var_indexes rl)
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   131
  in case Seq.pull (tac st)  of
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   132
	None        => raise THM("rule_by_tactic", 0, [rl])
2688
889a1cbd1aca rule_by_tactic no longer standardizes its result
paulson
parents: 2672
diff changeset
   133
      | Some(st',_) => Thm.varifyT (thaw st')
889a1cbd1aca rule_by_tactic no longer standardizes its result
paulson
parents: 2672
diff changeset
   134
  end;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
(*** Basic tactics ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
(*Makes a tactic whose effect on a state is given by thmfun: thm->thm seq.*)
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   139
fun PRIMSEQ thmfun st =  thmfun st handle THM _ => Seq.empty;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
(*Makes a tactic whose effect on a state is given by thmfun: thm->thm.*)
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   142
fun PRIMITIVE thmfun = PRIMSEQ (Seq.single o thmfun);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
(*** The following fail if the goal number is out of range:
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
     thus (REPEAT (resolve_tac rules i)) stops once subgoal i disappears. *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
(*Solve subgoal i by assumption*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
fun assume_tac i = PRIMSEQ (assumption i);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
(*Solve subgoal i by assumption, using no unification*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
fun eq_assume_tac i = PRIMITIVE (eq_assumption i);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
(** Resolution/matching tactics **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
(*The composition rule/state: no lifting or var renaming.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
  The arg = (bires_flg, orule, m) ;  see bicompose for explanation.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   157
fun compose_tac arg i = PRIMSEQ (bicompose false arg i);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   158
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
(*Converts a "destruct" rule like P&Q==>P to an "elimination" rule
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
  like [| P&Q; P==>R |] ==> R *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
fun make_elim rl = zero_var_indexes (rl RS revcut_rl);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
(*Attack subgoal i by resolution, using flags to indicate elimination rules*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164
fun biresolve_tac brules i = PRIMSEQ (biresolution false brules i);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   166
(*Resolution: the simple case, works for introduction rules*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   167
fun resolve_tac rules = biresolve_tac (map (pair false) rules);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   168
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   169
(*Resolution with elimination rules only*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   170
fun eresolve_tac rules = biresolve_tac (map (pair true) rules);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   171
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
(*Forward reasoning using destruction rules.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
fun forward_tac rls = resolve_tac (map make_elim rls) THEN' assume_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
(*Like forward_tac, but deletes the assumption after use.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
fun dresolve_tac rls = eresolve_tac (map make_elim rls);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
(*Shorthand versions: for resolution with a single theorem*)
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   179
fun rtac rl = resolve_tac [rl];
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   180
fun etac rl = eresolve_tac [rl];
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   181
fun dtac rl = dresolve_tac [rl];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   182
val atac = assume_tac;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   183
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   184
(*Use an assumption or some rules ... A popular combination!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
fun ares_tac rules = assume_tac  ORELSE'  resolve_tac rules;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
5263
8862ed2db431 added solve_tac;
wenzelm
parents: 4713
diff changeset
   187
fun solve_tac rules = resolve_tac rules THEN_ALL_NEW assume_tac;
8862ed2db431 added solve_tac;
wenzelm
parents: 4713
diff changeset
   188
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
(*Matching tactics -- as above, but forbid updating of state*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   190
fun bimatch_tac brules i = PRIMSEQ (biresolution true brules i);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   191
fun match_tac rules  = bimatch_tac (map (pair false) rules);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   192
fun ematch_tac rules = bimatch_tac (map (pair true) rules);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   193
fun dmatch_tac rls   = ematch_tac (map make_elim rls);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   194
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   195
(*Smash all flex-flex disagreement pairs in the proof state.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   196
val flexflex_tac = PRIMSEQ flexflex_rule;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   197
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   198
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   199
(*Remove duplicate subgoals.  By Mark Staples*)
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   200
local
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   201
fun cterm_aconv (a,b) = #t (rep_cterm a) aconv #t (rep_cterm b);
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   202
in
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   203
fun distinct_subgoals_tac state = 
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   204
    let val (frozth,thawfn) = freeze_thaw state
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   205
	val froz_prems = cprems_of frozth
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   206
	val assumed = implies_elim_list frozth (map assume froz_prems)
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   207
	val implied = implies_intr_list (gen_distinct cterm_aconv froz_prems)
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   208
					assumed;
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   209
    in  Seq.single (thawfn implied)  end
3409
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   210
end; 
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   211
c0466958df5d Tidying of signature. More robust renaming in freeze_thaw.
paulson
parents: 2814
diff changeset
   212
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   213
(*Lift and instantiate a rule wrt the given state and subgoal number *)
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   214
fun lift_inst_rule (st, i, sinsts, rule) =
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   215
let val {maxidx,sign,...} = rep_thm st
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   216
    val (_, _, Bi, _) = dest_state(st,i)
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   217
    val params = Logic.strip_params Bi	        (*params of subgoal i*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   218
    val params = rev(rename_wrt_term Bi params) (*as they are printed*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   219
    val paramTs = map #2 params
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   220
    and inc = maxidx+1
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   221
    fun liftvar (Var ((a,j), T)) = Var((a, j+inc), paramTs---> incr_tvar inc T)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   222
      | liftvar t = raise TERM("Variable expected", [t]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   223
    fun liftterm t = list_abs_free (params, 
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   224
				    Logic.incr_indexes(paramTs,inc) t)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   225
    (*Lifts instantiation pair over params*)
230
ec8a2b6aa8a7 Many other files modified as follows:
lcp
parents: 214
diff changeset
   226
    fun liftpair (cv,ct) = (cterm_fun liftvar cv, cterm_fun liftterm ct)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   227
    fun lifttvar((a,i),ctyp) =
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   228
	let val {T,sign} = rep_ctyp ctyp
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   229
	in  ((a,i+inc), ctyp_of sign (incr_tvar inc T)) end
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   230
    val rts = types_sorts rule and (types,sorts) = types_sorts st
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   231
    fun types'(a,~1) = (case assoc(params,a) of None => types(a,~1) | sm => sm)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   232
      | types'(ixn) = types ixn;
949
83c588d6fee9 Changed treatment of during type inference internally generated type
nipkow
parents: 947
diff changeset
   233
    val used = add_term_tvarnames
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   234
                  (#prop(rep_thm st) $ #prop(rep_thm rule),[])
949
83c588d6fee9 Changed treatment of during type inference internally generated type
nipkow
parents: 947
diff changeset
   235
    val (Tinsts,insts) = read_insts sign rts (types',sorts) used sinsts
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   236
in instantiate (map lifttvar Tinsts, map liftpair insts)
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   237
               (lift_rule (st,i) rule)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   238
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   239
3984
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   240
(*
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   241
Like lift_inst_rule but takes terms, not strings, where the terms may contain
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   242
Bounds referring to parameters of the subgoal.
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   243
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   244
insts: [...,(vj,tj),...]
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   245
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   246
The tj may contain references to parameters of subgoal i of the state st
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   247
in the form of Bound k, i.e. the tj may be subterms of the subgoal.
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   248
To saturate the lose bound vars, the tj are enclosed in abstractions
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   249
corresponding to the parameters of subgoal i, thus turning them into
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   250
functions. At the same time, the types of the vj are lifted.
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   251
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   252
NB: the types in insts must be correctly instantiated already,
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   253
    i.e. Tinsts is not applied to insts.
8fc76a487616 Modified comment.
nipkow
parents: 3706
diff changeset
   254
*)
1975
eec67972b1bf renamed cterm_lift_inst_rule to term_lift_inst_rule and made it take
nipkow
parents: 1966
diff changeset
   255
fun term_lift_inst_rule (st, i, Tinsts, insts, rule) =
1966
9e626f86e335 added cterm_lift_inst_rule
nipkow
parents: 1955
diff changeset
   256
let val {maxidx,sign,...} = rep_thm st
9e626f86e335 added cterm_lift_inst_rule
nipkow
parents: 1955
diff changeset
   257
    val (_, _, Bi, _) = dest_state(st,i)
9e626f86e335 added cterm_lift_inst_rule
nipkow
parents: 1955
diff changeset
   258
    val params = Logic.strip_params Bi          (*params of subgoal i*)
9e626f86e335 added cterm_lift_inst_rule
nipkow
parents: 1955
diff changeset
   259
    val paramTs = map #2 params
9e626f86e335 added cterm_lift_inst_rule
nipkow
parents: 1955
diff changeset
   260
    and inc = maxidx+1
1975
eec67972b1bf renamed cterm_lift_inst_rule to term_lift_inst_rule and made it take
nipkow
parents: 1966
diff changeset
   261
    fun liftvar ((a,j), T) = Var((a, j+inc), paramTs---> incr_tvar inc T)
eec67972b1bf renamed cterm_lift_inst_rule to term_lift_inst_rule and made it take
nipkow
parents: 1966
diff changeset
   262
    (*lift only Var, not term, which must be lifted already*)
eec67972b1bf renamed cterm_lift_inst_rule to term_lift_inst_rule and made it take
nipkow
parents: 1966
diff changeset
   263
    fun liftpair (v,t) = (cterm_of sign (liftvar v), cterm_of sign t)
eec67972b1bf renamed cterm_lift_inst_rule to term_lift_inst_rule and made it take
nipkow
parents: 1966
diff changeset
   264
    fun liftTpair((a,i),T) = ((a,i+inc), ctyp_of sign (incr_tvar inc T))
eec67972b1bf renamed cterm_lift_inst_rule to term_lift_inst_rule and made it take
nipkow
parents: 1966
diff changeset
   265
in instantiate (map liftTpair Tinsts, map liftpair insts)
1966
9e626f86e335 added cterm_lift_inst_rule
nipkow
parents: 1955
diff changeset
   266
               (lift_rule (st,i) rule)
9e626f86e335 added cterm_lift_inst_rule
nipkow
parents: 1955
diff changeset
   267
end;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   268
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   269
(*** Resolve after lifting and instantation; may refer to parameters of the
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   270
     subgoal.  Fails if "i" is out of range.  ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   271
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   272
(*compose version: arguments are as for bicompose.*)
3538
ed9de44032e0 Removal of the tactical STATE
paulson
parents: 3409
diff changeset
   273
fun compose_inst_tac sinsts (bires_flg, rule, nsubgoal) i st = st |>
ed9de44032e0 Removal of the tactical STATE
paulson
parents: 3409
diff changeset
   274
  (compose_tac (bires_flg, lift_inst_rule (st, i, sinsts, rule), nsubgoal) i
ed9de44032e0 Removal of the tactical STATE
paulson
parents: 3409
diff changeset
   275
   handle TERM (msg,_)   => (writeln msg;  no_tac)
ed9de44032e0 Removal of the tactical STATE
paulson
parents: 3409
diff changeset
   276
	| THM  (msg,_,_) => (writeln msg;  no_tac));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   277
761
04320c295500 res_inst_tac: added comments
lcp
parents: 670
diff changeset
   278
(*"Resolve" version.  Note: res_inst_tac cannot behave sensibly if the
04320c295500 res_inst_tac: added comments
lcp
parents: 670
diff changeset
   279
  terms that are substituted contain (term or type) unknowns from the
04320c295500 res_inst_tac: added comments
lcp
parents: 670
diff changeset
   280
  goal, because it is unable to instantiate goal unknowns at the same time.
04320c295500 res_inst_tac: added comments
lcp
parents: 670
diff changeset
   281
2029
2fa4c4b1a7fe Generalized freeze to freeze_thaw in order to
paulson
parents: 1975
diff changeset
   282
  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
   283
  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
   284
  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
   285
  goals.
761
04320c295500 res_inst_tac: added comments
lcp
parents: 670
diff changeset
   286
*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   287
fun res_inst_tac sinsts rule i =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   288
    compose_inst_tac sinsts (false, rule, nprems_of rule) i;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   289
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   290
(*eresolve elimination version*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   291
fun eres_inst_tac sinsts rule i =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   292
    compose_inst_tac sinsts (true, rule, nprems_of rule) i;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   293
270
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   294
(*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
   295
  increment revcut_rl instead.*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   296
fun make_elim_preserve rl = 
270
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   297
  let val {maxidx,...} = rep_thm rl
6390
5d58c100ca3f qualify Theory.sign_of etc.;
wenzelm
parents: 5974
diff changeset
   298
      fun cvar ixn = cterm_of (Theory.sign_of ProtoPure.thy) (Var(ixn,propT));
270
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   299
      val revcut_rl' = 
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   300
	  instantiate ([],  [(cvar("V",0), cvar("V",maxidx+1)),
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   301
			     (cvar("W",0), cvar("W",maxidx+1))]) revcut_rl
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   302
      val arg = (false, rl, nprems_of rl)
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   303
      val [th] = Seq.list_of (bicompose false arg 1 revcut_rl')
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   304
  in  th  end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   305
  handle Bind => raise THM("make_elim_preserve", 1, [rl]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   306
270
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   307
(*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
   308
fun cut_inst_tac sinsts rule = res_inst_tac sinsts (make_elim_preserve rule);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   309
270
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   310
(*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
   311
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
   312
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   313
(*dresolve tactic applies a RULE to replace an assumption*)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   314
fun dres_inst_tac sinsts rule = eres_inst_tac sinsts (make_elim_preserve rule);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   315
1951
f2b8005bdc6e Declared thin_tac
paulson
parents: 1801
diff changeset
   316
(*Deletion of an assumption*)
f2b8005bdc6e Declared thin_tac
paulson
parents: 1801
diff changeset
   317
fun thin_tac s = eres_inst_tac [("V",s)] thin_rl;
f2b8005bdc6e Declared thin_tac
paulson
parents: 1801
diff changeset
   318
270
d506ea00c825 tactic/make_elim_preserve: recoded to avoid using lift_inst_rule. Instead
lcp
parents: 230
diff changeset
   319
(*** Applications of cut_rl ***)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   320
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   321
(*Used by metacut_tac*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   322
fun bires_cut_tac arg i =
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   323
    resolve_tac [cut_rl] i  THEN  biresolve_tac arg (i+1) ;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   324
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   325
(*The conclusion of the rule gets assumed in subgoal i,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   326
  while subgoal i+1,... are the premises of the rule.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   327
fun metacut_tac rule = bires_cut_tac [(false,rule)];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   328
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   329
(*Recognizes theorems that are not rules, but simple propositions*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   330
fun is_fact rl =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   331
    case prems_of rl of
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   332
	[] => true  |  _::_ => false;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   333
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   334
(*"Cut" all facts from theorem list into the goal as assumptions. *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   335
fun cut_facts_tac ths i =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   336
    EVERY (map (fn th => metacut_tac th i) (filter is_fact ths));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   337
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   338
(*Introduce the given proposition as a lemma and subgoal*)
4178
e64ff1c1bc70 subgoal_tac displays a warning if the new subgoal has type variables
paulson
parents: 3991
diff changeset
   339
fun subgoal_tac sprop i st = 
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   340
  let val st'    = Seq.hd (res_inst_tac [("psi", sprop)] cut_rl i st)
4178
e64ff1c1bc70 subgoal_tac displays a warning if the new subgoal has type variables
paulson
parents: 3991
diff changeset
   341
      val concl' = Logic.strip_assums_concl (List.nth(prems_of st', i))
e64ff1c1bc70 subgoal_tac displays a warning if the new subgoal has type variables
paulson
parents: 3991
diff changeset
   342
  in  
e64ff1c1bc70 subgoal_tac displays a warning if the new subgoal has type variables
paulson
parents: 3991
diff changeset
   343
      if null (term_tvars concl') then ()
e64ff1c1bc70 subgoal_tac displays a warning if the new subgoal has type variables
paulson
parents: 3991
diff changeset
   344
      else warning"Type variables in new subgoal: add a type constraint?";
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   345
      Seq.single st'
4178
e64ff1c1bc70 subgoal_tac displays a warning if the new subgoal has type variables
paulson
parents: 3991
diff changeset
   346
  end;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   347
439
ad3f46c13f1e Pure/tactic/subgoals_tac: new (moved from ZF/Order.ML)
lcp
parents: 270
diff changeset
   348
(*Introduce a list of lemmas and subgoals*)
ad3f46c13f1e Pure/tactic/subgoals_tac: new (moved from ZF/Order.ML)
lcp
parents: 270
diff changeset
   349
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
   350
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   351
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   352
(**** Indexing and filtering of theorems ****)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   353
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   354
(*Returns the list of potentially resolvable theorems for the goal "prem",
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   355
	using the predicate  could(subgoal,concl).
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   356
  Resulting list is no longer than "limit"*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   357
fun filter_thms could (limit, prem, ths) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   358
  let val pb = Logic.strip_assums_concl prem;   (*delete assumptions*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   359
      fun filtr (limit, []) = []
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   360
	| filtr (limit, th::ths) =
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   361
	    if limit=0 then  []
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   362
	    else if could(pb, concl_of th)  then th :: filtr(limit-1, ths)
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   363
	    else filtr(limit,ths)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   364
  in  filtr(limit,ths)  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   365
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   366
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   367
(*** biresolution and resolution using nets ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   368
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   369
(** To preserve the order of the rules, tag them with increasing integers **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   370
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   371
(*insert tags*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   372
fun taglist k [] = []
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   373
  | taglist k (x::xs) = (k,x) :: taglist (k+1) xs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   374
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   375
(*remove tags and suppress duplicates -- list is assumed sorted!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   376
fun untaglist [] = []
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   377
  | untaglist [(k:int,x)] = [x]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   378
  | untaglist ((k,x) :: (rest as (k',x')::_)) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   379
      if k=k' then untaglist rest
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   380
      else    x :: untaglist rest;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   381
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   382
(*return list elements in original order*)
4438
ecfeff48bf0c adapted to new sort function;
wenzelm
parents: 4270
diff changeset
   383
fun orderlist kbrls = untaglist (sort (int_ord o pairself fst) kbrls); 
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   384
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   385
(*insert one tagged brl into the pair of nets*)
1077
c2df11ae8b55 Renamed insert_kbrl to insert_tagged_brl and exported it. Now
lcp
parents: 952
diff changeset
   386
fun insert_tagged_brl (kbrl as (k,(eres,th)), (inet,enet)) =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   387
    if eres then 
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   388
	case prems_of th of
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   389
	    prem::_ => (inet, Net.insert_term ((prem,kbrl), enet, K false))
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   390
	  | [] => error"insert_tagged_brl: elimination rule with no premises"
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   391
    else (Net.insert_term ((concl_of th, kbrl), inet, K false), enet);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   392
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   393
(*build a pair of nets for biresolution*)
670
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
   394
fun build_netpair netpair brls = 
1077
c2df11ae8b55 Renamed insert_kbrl to insert_tagged_brl and exported it. Now
lcp
parents: 952
diff changeset
   395
    foldr insert_tagged_brl (taglist 1 brls, netpair);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   396
1801
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   397
(*delete one kbrl from the pair of nets;
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   398
  we don't know the value of k, so we use 0 and ignore it in the comparison*)
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   399
local
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   400
  fun eq_kbrl ((k,(eres,th)), (k',(eres',th'))) = eq_thm (th,th')
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   401
in
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   402
fun delete_tagged_brl (brl as (eres,th), (inet,enet)) =
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   403
    if eres then 
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   404
	case prems_of th of
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   405
	    prem::_ => (inet, Net.delete_term ((prem, (0,brl)), enet, eq_kbrl))
2814
a318f7f3a65c delete_tagged_brl just ignores non-elimination rules instead of complaining
paulson
parents: 2688
diff changeset
   406
	  | []      => (inet,enet)     (*no major premise: ignore*)
1801
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   407
    else (Net.delete_term ((concl_of th, (0,brl)), inet, eq_kbrl), enet);
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   408
end;
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   409
927a31ba4346 Added delete function for brls
paulson
parents: 1501
diff changeset
   410
3706
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   411
(*biresolution using a pair of nets rather than rules.  
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   412
    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
   413
    boolean "match" indicates matching or unification.*)
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   414
fun biresolution_from_nets_tac order match (inet,enet) =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   415
  SUBGOAL
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   416
    (fn (prem,i) =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   417
      let val hyps = Logic.strip_assums_hyp prem
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   418
          and concl = Logic.strip_assums_concl prem 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   419
          val kbrls = Net.unify_term inet concl @
2672
85d7e800d754 Replaced "flat" by the Basis Library function List.concat
paulson
parents: 2580
diff changeset
   420
                      List.concat (map (Net.unify_term enet) hyps)
3706
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   421
      in PRIMSEQ (biresolution match (order kbrls) i) end);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   422
3706
e57b5902822f Generalized and exported biresolution_from_nets_tac to allow the declaration
paulson
parents: 3575
diff changeset
   423
(*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
   424
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
   425
val bimatch_from_nets_tac   = biresolution_from_nets_tac orderlist true;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   426
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   427
(*fast versions using nets internally*)
670
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
   428
val net_biresolve_tac =
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
   429
    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
   430
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
   431
val net_bimatch_tac =
ff4c6691de9d Pure/tactic/build_netpair: now takes two arguments
lcp
parents: 439
diff changeset
   432
    bimatch_from_nets_tac o build_netpair(Net.empty,Net.empty);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   433
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   434
(*** Simpler version for resolve_tac -- only one net, and no hyps ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   435
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   436
(*insert one tagged rl into the net*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   437
fun insert_krl (krl as (k,th), net) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   438
    Net.insert_term ((concl_of th, krl), net, K false);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   439
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   440
(*build a net of rules for resolution*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   441
fun build_net rls = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   442
    foldr insert_krl (taglist 1 rls, Net.empty);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   443
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   444
(*resolution using a net rather than rules; pred supports filt_resolve_tac*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   445
fun filt_resolution_from_net_tac match pred net =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   446
  SUBGOAL
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   447
    (fn (prem,i) =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   448
      let val krls = Net.unify_term net (Logic.strip_assums_concl prem)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   449
      in 
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   450
	 if pred krls  
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   451
         then PRIMSEQ
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   452
		(biresolution match (map (pair false) (orderlist krls)) i)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   453
         else no_tac
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   454
      end);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   455
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   456
(*Resolve the subgoal using the rules (making a net) unless too flexible,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   457
   which means more than maxr rules are unifiable.      *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   458
fun filt_resolve_tac rules maxr = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   459
    let fun pred krls = length krls <= maxr
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   460
    in  filt_resolution_from_net_tac false pred (build_net rules)  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   461
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   462
(*versions taking pre-built nets*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   463
val resolve_from_net_tac = filt_resolution_from_net_tac false (K true);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   464
val match_from_net_tac = filt_resolution_from_net_tac true (K true);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   465
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   466
(*fast versions using nets internally*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   467
val net_resolve_tac = resolve_from_net_tac o build_net;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   468
val net_match_tac = match_from_net_tac o build_net;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   469
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   470
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   471
(*** For Natural Deduction using (bires_flg, rule) pairs ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   472
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   473
(*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
   474
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
   475
  | subgoals_of_brl (false,rule) = nprems_of rule;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   476
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   477
(*Less-than test: for sorting to minimize number of new subgoals*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   478
fun lessb (brl1,brl2) = subgoals_of_brl brl1 < subgoals_of_brl brl2;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   479
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   480
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   481
(*** Meta-Rewriting Tactics ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   482
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   483
fun result1 tacf mss thm =
4270
957c887b89b5 changed Sequence interface (now Seq, in seq.ML);
wenzelm
parents: 4213
diff changeset
   484
  apsome fst (Seq.pull (tacf mss thm));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   485
3575
4e9beacb5339 improved rewrite_thm / rewrite_goals to handle conditional eqns;
wenzelm
parents: 3554
diff changeset
   486
val simple_prover =
4e9beacb5339 improved rewrite_thm / rewrite_goals to handle conditional eqns;
wenzelm
parents: 3554
diff changeset
   487
  result1 (fn mss => ALLGOALS (resolve_tac (prems_of_mss mss)));
4e9beacb5339 improved rewrite_thm / rewrite_goals to handle conditional eqns;
wenzelm
parents: 3554
diff changeset
   488
4e9beacb5339 improved rewrite_thm / rewrite_goals to handle conditional eqns;
wenzelm
parents: 3554
diff changeset
   489
val rewrite_rule = Drule.rewrite_rule_aux simple_prover;
4e9beacb5339 improved rewrite_thm / rewrite_goals to handle conditional eqns;
wenzelm
parents: 3554
diff changeset
   490
val rewrite_goals_rule = Drule.rewrite_goals_rule_aux simple_prover;
4e9beacb5339 improved rewrite_thm / rewrite_goals to handle conditional eqns;
wenzelm
parents: 3554
diff changeset
   491
4e9beacb5339 improved rewrite_thm / rewrite_goals to handle conditional eqns;
wenzelm
parents: 3554
diff changeset
   492
2145
5e8db0bc195e asm_rewrite_goal_tac now calls SELECT_GOAL.
paulson
parents: 2043
diff changeset
   493
(*Rewrite subgoal i only.  SELECT_GOAL avoids inefficiencies in goals_conv.*)
5e8db0bc195e asm_rewrite_goal_tac now calls SELECT_GOAL.
paulson
parents: 2043
diff changeset
   494
fun asm_rewrite_goal_tac mode prover_tac mss =
5e8db0bc195e asm_rewrite_goal_tac now calls SELECT_GOAL.
paulson
parents: 2043
diff changeset
   495
      SELECT_GOAL 
5e8db0bc195e asm_rewrite_goal_tac now calls SELECT_GOAL.
paulson
parents: 2043
diff changeset
   496
        (PRIMITIVE
5e8db0bc195e asm_rewrite_goal_tac now calls SELECT_GOAL.
paulson
parents: 2043
diff changeset
   497
	   (rewrite_goal_rule mode (result1 prover_tac) mss 1));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   498
69
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   499
(*Rewrite throughout proof state. *)
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   500
fun rewrite_tac defs = PRIMITIVE(rewrite_rule defs);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   501
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   502
(*Rewrite subgoals only, not main goal. *)
69
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   503
fun rewrite_goals_tac defs = PRIMITIVE (rewrite_goals_rule defs);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   504
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   505
fun rewtac def = rewrite_goals_tac [def];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   506
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   507
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   508
(*** for folding definitions, handling critical pairs ***)
69
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   509
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   510
(*The depth of nesting in a term*)
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   511
fun term_depth (Abs(a,T,t)) = 1 + term_depth t
2145
5e8db0bc195e asm_rewrite_goal_tac now calls SELECT_GOAL.
paulson
parents: 2043
diff changeset
   512
  | term_depth (f$t) = 1 + Int.max(term_depth f, term_depth t)
69
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   513
  | term_depth _ = 0;
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   514
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   515
val lhs_of_thm = #1 o Logic.dest_equals o #prop o rep_thm;
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   516
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   517
(*folding should handle critical pairs!  E.g. K == Inl(0),  S == Inr(Inl(0))
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   518
  Returns longest lhs first to avoid folding its subexpressions.*)
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   519
fun sort_lhs_depths defs =
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   520
  let val keylist = make_keylist (term_depth o lhs_of_thm) defs
4438
ecfeff48bf0c adapted to new sort function;
wenzelm
parents: 4270
diff changeset
   521
      val keys = distinct (sort (rev_order o int_ord) (map #2 keylist))
69
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   522
  in  map (keyfilter keylist) keys  end;
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   523
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   524
fun fold_tac defs = EVERY 
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   525
    (map rewrite_tac (sort_lhs_depths (map symmetric defs)));
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   526
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   527
fun fold_goals_tac defs = EVERY 
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   528
    (map rewrite_goals_tac (sort_lhs_depths (map symmetric defs)));
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   529
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   530
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   531
(*** Renaming of parameters in a subgoal
e7588b53d6b0 tactic/fold_tac,fold_goals_tac: now handle critical pairs on the
lcp
parents: 0
diff changeset
   532
     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
   533
     separated by blanks ***)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   534
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   535
(*Calling this will generate the warning "Same as previous level" since
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   536
  it affects nothing but the names of bound variables!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   537
fun rename_tac str i = 
4693
2e47ea2c6109 adapted to baroque chars;
wenzelm
parents: 4611
diff changeset
   538
  let val cs = Symbol.explode str 
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   539
  in  
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   540
  if !Logic.auto_rename 
4213
cef5ef41e70d tuned warning msg;
wenzelm
parents: 4178
diff changeset
   541
  then (warning "Resetting Logic.auto_rename"; 
1460
5a6f2aabd538 inserted tabs again
clasohm
parents: 1458
diff changeset
   542
	Logic.auto_rename := false)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   543
  else ();
4693
2e47ea2c6109 adapted to baroque chars;
wenzelm
parents: 4611
diff changeset
   544
  case #2 (take_prefix (Symbol.is_letdig orf Symbol.is_blank) cs) of
2e47ea2c6109 adapted to baroque chars;
wenzelm
parents: 4611
diff changeset
   545
      [] => PRIMITIVE (rename_params_rule (scanwords Symbol.is_letdig cs, i))
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   546
    | c::_ => error ("Illegal character: " ^ c)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   547
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   548
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   549
(*Rename recent parameters using names generated from a and the suffixes,
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   550
  provided the string a, which represents a term, is an identifier. *)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   551
fun rename_last_tac a sufs i = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   552
  let val names = map (curry op^ a) sufs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   553
  in  if Syntax.is_identifier a
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   554
      then PRIMITIVE (rename_params_rule (names,i))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   555
      else all_tac
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   556
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   557
2043
8de7a0ab463b prune_params_tac no longer rewrites main goal
paulson
parents: 2029
diff changeset
   558
(*Prunes all redundant parameters from the proof state by rewriting.
8de7a0ab463b prune_params_tac no longer rewrites main goal
paulson
parents: 2029
diff changeset
   559
  DOES NOT rewrite main goal, where quantification over an unused bound
8de7a0ab463b prune_params_tac no longer rewrites main goal
paulson
parents: 2029
diff changeset
   560
    variable is sometimes done to avoid the need for cut_facts_tac.*)
8de7a0ab463b prune_params_tac no longer rewrites main goal
paulson
parents: 2029
diff changeset
   561
val prune_params_tac = rewrite_goals_tac [triv_forall_equality];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   562
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   563
(*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
   564
  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
   565
fun rotate_tac 0 i = all_tac
85d7e800d754 Replaced "flat" by the Basis Library function List.concat
paulson
parents: 2580
diff changeset
   566
  | rotate_tac k i = PRIMITIVE (rotate_rule k i);
1209
03dc596b3a18 added rotate_tac.
nipkow
parents: 1077
diff changeset
   567
5974
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   568
(* remove premises that do not satisfy p; fails if all prems satisfy p *)
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   569
fun filter_prems_tac p =
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   570
  let fun Then None tac = Some tac
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   571
        | Then (Some tac) tac' = Some(tac THEN' tac');
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   572
      fun thins ((tac,n),H) =
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   573
        if p H then (tac,n+1)
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   574
        else (Then tac (rotate_tac n THEN' etac thin_rl),0);
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   575
  in SUBGOAL(fn (subg,n) =>
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   576
       let val Hs = Logic.strip_assums_hyp subg
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   577
       in case fst(foldl thins ((None,0),Hs)) of
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   578
            None => no_tac | Some tac => tac n
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   579
       end)
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   580
  end;
6acf3ff0f486 Added filter_prems_tac
nipkow
parents: 5956
diff changeset
   581
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   582
end;
1501
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   583
bb7f99a0a6f0 Elimination of fully-functorial style.
paulson
parents: 1460
diff changeset
   584
open Tactic;