src/LK/LK.ML
author paulson
Wed, 21 Aug 1996 13:22:23 +0200
changeset 1933 8b24773de6db
parent 1461 6bcb44e4d6e5
permissions -rw-r--r--
Addition of message NS5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
     1
(*  Title:      LK/lk.ML
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1992  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
Tactics and lemmas for lk.thy (thanks also to Philippe de Groote)  
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
open LK;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
(*Higher precedence than := facilitates use of references*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
infix 4 add_safes add_unsafes;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
(*Cut and thin, replacing the right-side formula*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
fun cutR_tac (sP: string) i = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
    res_inst_tac [ ("P",sP) ] cut i  THEN  rtac thinR i;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
(*Cut and thin, replacing the left-side formula*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
fun cutL_tac (sP: string) i = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
    res_inst_tac [ ("P",sP) ] cut i  THEN  rtac thinL (i+1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
(** If-and-only-if rules **)
1297
7ac266cf82d0 added calls of init_html and make_chart;
clasohm
parents: 0
diff changeset
    24
qed_goalw "iffR" LK.thy [iff_def]
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
    "[| $H,P |- $E,Q,$F;  $H,Q |- $E,P,$F |] ==> $H |- $E, P <-> Q, $F"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
 (fn prems=> [ (REPEAT (resolve_tac (prems@[conjR,impR]) 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
1297
7ac266cf82d0 added calls of init_html and make_chart;
clasohm
parents: 0
diff changeset
    28
qed_goalw "iffL" LK.thy [iff_def]
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
   "[| $H,$G |- $E,P,Q;  $H,Q,P,$G |- $E |] ==> $H, P <-> Q, $G |- $E"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
 (fn prems=> [ (REPEAT (resolve_tac (prems@[conjL,impL,basic]) 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
1297
7ac266cf82d0 added calls of init_html and make_chart;
clasohm
parents: 0
diff changeset
    32
qed_goalw "TrueR" LK.thy [True_def]
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
    "$H |- $E, True, $F"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
 (fn _=> [ rtac impR 1, rtac basic 1 ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
(** Weakened quantifier rules.  Incomplete, they let the search terminate.**)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
1297
7ac266cf82d0 added calls of init_html and make_chart;
clasohm
parents: 0
diff changeset
    39
qed_goal "allL_thin" LK.thy 
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
    "$H, P(x), $G |- $E ==> $H, ALL x.P(x), $G |- $E"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
 (fn prems=> [ (rtac allL 1), (rtac thinL 1), (resolve_tac prems 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
1297
7ac266cf82d0 added calls of init_html and make_chart;
clasohm
parents: 0
diff changeset
    43
qed_goal "exR_thin" LK.thy 
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
    "$H |- $E, P(x), $F ==> $H |- $E, EX x.P(x), $F"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
 (fn prems=> [ (rtac exR 1), (rtac thinR 1), (resolve_tac prems 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
(* Symmetry of equality in hypotheses *)
1297
7ac266cf82d0 added calls of init_html and make_chart;
clasohm
parents: 0
diff changeset
    48
qed_goal "symL" LK.thy 
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
    "$H, $G, B = A |- $E ==> $H, A = B, $G |- $E" 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
 (fn prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
  [ (rtac cut 1),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
    (rtac thinL 2),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
    (resolve_tac prems 2),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
    (resolve_tac [basic RS sym] 1) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
(**** Theorem Packs ****)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
datatype pack = Pack of thm list * thm list;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
(*A theorem pack has the form  (safe rules, unsafe rules)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
  An unsafe rule is incomplete or introduces variables in subgoals,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
  and is tried only when the safe rules are not applicable.  *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
fun less (rl1,rl2) = (nprems_of rl1) < (nprems_of rl2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
val empty_pack = Pack([],[]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
fun (Pack(safes,unsafes)) add_safes ths   = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
    Pack(sort less (ths@safes), unsafes);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
fun (Pack(safes,unsafes)) add_unsafes ths = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
    Pack(safes, sort less (ths@unsafes));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
(*The rules of LK*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
val prop_pack = empty_pack add_safes 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
    77
                [basic, refl, conjL, conjR, disjL, disjR, impL, impR, 
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
    78
                 notL, notR, iffL, iffR];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
val LK_pack = prop_pack add_safes   [allR, exL] 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
    81
                        add_unsafes [allL_thin, exR_thin];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
val LK_dup_pack = prop_pack add_safes   [allR, exL] 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
    84
                            add_unsafes [allL, exR];
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
(*Returns the list of all formulas in the sequent*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
fun forms_of_seq (Const("Seqof",_) $ P $ u) = P :: forms_of_seq u
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
  | forms_of_seq (H $ u) = forms_of_seq u
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
  | forms_of_seq _ = [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
(*Tests whether two sequences (left or right sides) could be resolved.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
  seqp is a premise (subgoal), seqc is a conclusion of an object-rule.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
  Assumes each formula in seqc is surrounded by sequence variables
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
  -- checks that each concl formula looks like some subgoal formula.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
  It SHOULD check order as well, using recursion rather than forall/exists*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
fun could_res (seqp,seqc) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
      forall (fn Qc => exists (fn Qp => could_unify (Qp,Qc)) 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
                              (forms_of_seq seqp))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
             (forms_of_seq seqc);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
(*Tests whether two sequents G|-H could be resolved, comparing each side.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
fun could_resolve_seq (prem,conc) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
  case (prem,conc) of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
      (_ $ Abs(_,_,leftp) $ Abs(_,_,rightp),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
       _ $ Abs(_,_,leftc) $ Abs(_,_,rightc)) =>
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
   108
          could_res (leftp,leftc)  andalso  could_res (rightp,rightc)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
    | _ => false;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
(*Like filt_resolve_tac, using could_resolve_seq
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
  Much faster than resolve_tac when there are many rules.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
  Resolve subgoal i using the rules, unless more than maxr are compatible. *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
fun filseq_resolve_tac rules maxr = SUBGOAL(fn (prem,i) =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
  let val rls = filter_thms could_resolve_seq (maxr+1, prem, rules)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
  in  if length rls > maxr  then  no_tac  else resolve_tac rls i
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
  end);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
(*Predicate: does the rule have n premises? *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
fun has_prems n rule =  (nprems_of rule = n);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
(*Continuation-style tactical for resolution.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
  The list of rules is partitioned into 0, 1, 2 premises.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
  The resulting tactic, gtac, tries to resolve with rules.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
  If successful, it recursively applies nextac to the new subgoals only.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
  Else fails.  (Treatment of goals due to Ph. de Groote) 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
  Bind (RESOLVE_THEN rules) to a variable: it preprocesses the rules. *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
(*Takes rule lists separated in to 0, 1, 2, >2 premises.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
  The abstraction over state prevents needless divergence in recursion.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
  The 9999 should be a parameter, to delay treatment of flexible goals. *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
fun RESOLVE_THEN rules =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
  let val [rls0,rls1,rls2] = partition_list has_prems 0 2 rules;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
      fun tac nextac i = STATE (fn state =>  
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
   137
          filseq_resolve_tac rls0 9999 i 
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
   138
          ORELSE
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
   139
          (DETERM(filseq_resolve_tac rls1 9999 i) THEN  TRY(nextac i))
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
   140
          ORELSE
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
   141
          (DETERM(filseq_resolve_tac rls2 9999 i) THEN  TRY(nextac(i+1))
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
   142
                                        THEN  TRY(nextac i)) )
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
  in  tac  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
(*repeated resolution applied to the designated goal*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
fun reresolve_tac rules = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
  let val restac = RESOLVE_THEN rules;  (*preprocessing done now*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
      fun gtac i = restac gtac i
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
  in  gtac  end; 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
(*tries the safe rules repeatedly before the unsafe rules. *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
fun repeat_goal_tac (Pack(safes,unsafes)) = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
  let val restac  =    RESOLVE_THEN safes
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
      and lastrestac = RESOLVE_THEN unsafes;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
      fun gtac i = restac gtac i  ORELSE  lastrestac gtac i
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   157
  in  gtac  end; 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   158
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
(*Tries safe rules only*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
fun safe_goal_tac (Pack(safes,unsafes)) = reresolve_tac safes;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
(*Tries a safe rule or else a unsafe rule.  Single-step for tracing. *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164
fun step_tac (thm_pack as Pack(safes,unsafes)) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165
    safe_goal_tac thm_pack  ORELSE'
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   166
    filseq_resolve_tac unsafes 9999;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   167
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   168
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   169
(* Tactic for reducing a goal, using Predicate Calculus rules.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   170
   A decision procedure for Propositional Calculus, it is incomplete
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   171
   for Predicate-Calculus because of allL_thin and exR_thin.  
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
   Fails if it can do nothing.      *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
fun pc_tac thm_pack = SELECT_GOAL (DEPTH_SOLVE (repeat_goal_tac thm_pack 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
(*The following two tactics are analogous to those provided by 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
  Provers/classical.  In fact, pc_tac is usually FASTER than fast_tac!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
fun fast_tac thm_pack =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
  SELECT_GOAL (DEPTH_SOLVE (step_tac thm_pack 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
fun best_tac thm_pack  = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   181
  SELECT_GOAL (BEST_FIRST (has_fewer_prems 1, size_of_thm) 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1297
diff changeset
   182
               (step_tac thm_pack 1));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   183
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   184
(** Contraction.  Useful since some rules are not complete. **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
1297
7ac266cf82d0 added calls of init_html and make_chart;
clasohm
parents: 0
diff changeset
   186
qed_goal "conR" LK.thy 
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   187
    "$H |- $E, P, $F, P ==> $H |- $E, P, $F"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   188
 (fn prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
  [ (rtac cut 1), (REPEAT (resolve_tac (prems@[basic]) 1)) ]);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   190
1297
7ac266cf82d0 added calls of init_html and make_chart;
clasohm
parents: 0
diff changeset
   191
qed_goal "conL" LK.thy 
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   192
    "$H, P, $G, P |- $E ==> $H, P, $G |- $E"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   193
 (fn prems=>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   194
  [ (rtac cut 1), (REPEAT (resolve_tac (prems@[basic]) 1)) ]);