| author | wenzelm | 
| Fri, 01 Oct 2021 12:45:47 +0200 | |
| changeset 74400 | 269a39b6c5f8 | 
| parent 74270 | ad2899cdd528 | 
| child 74518 | de4f151c2a34 | 
| permissions | -rw-r--r-- | 
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 1 | (* Title: Pure/conv.ML | 
| 32843 
c8f5a7c8353f
moved cache_conv to src/Pure/conv.ML, use Thm.cterm_cache;
 wenzelm parents: 
30136diff
changeset | 2 | Author: Amine Chaieb, TU Muenchen | 
| 36936 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 3 | Author: Sascha Boehme, TU Muenchen | 
| 32843 
c8f5a7c8353f
moved cache_conv to src/Pure/conv.ML, use Thm.cterm_cache;
 wenzelm parents: 
30136diff
changeset | 4 | Author: Makarius | 
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 5 | |
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 6 | Conversions: primitive equality reasoning. | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 7 | *) | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 8 | |
| 22937 | 9 | infix 1 then_conv; | 
| 10 | infix 0 else_conv; | |
| 23169 | 11 | |
| 30136 
6a874aedb964
Made then_conv and else_conv available as infix operations.
 boehmes parents: 
29606diff
changeset | 12 | signature BASIC_CONV = | 
| 
6a874aedb964
Made then_conv and else_conv available as infix operations.
 boehmes parents: 
29606diff
changeset | 13 | sig | 
| 
6a874aedb964
Made then_conv and else_conv available as infix operations.
 boehmes parents: 
29606diff
changeset | 14 | val then_conv: conv * conv -> conv | 
| 
6a874aedb964
Made then_conv and else_conv available as infix operations.
 boehmes parents: 
29606diff
changeset | 15 | val else_conv: conv * conv -> conv | 
| 
6a874aedb964
Made then_conv and else_conv available as infix operations.
 boehmes parents: 
29606diff
changeset | 16 | end; | 
| 
6a874aedb964
Made then_conv and else_conv available as infix operations.
 boehmes parents: 
29606diff
changeset | 17 | |
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 18 | signature CONV = | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 19 | sig | 
| 30136 
6a874aedb964
Made then_conv and else_conv available as infix operations.
 boehmes parents: 
29606diff
changeset | 20 | include BASIC_CONV | 
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 21 | val no_conv: conv | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 22 | val all_conv: conv | 
| 22926 | 23 | val first_conv: conv list -> conv | 
| 24 | val every_conv: conv list -> conv | |
| 22937 | 25 | val try_conv: conv -> conv | 
| 26 | val repeat_conv: conv -> conv | |
| 32843 
c8f5a7c8353f
moved cache_conv to src/Pure/conv.ML, use Thm.cterm_cache;
 wenzelm parents: 
30136diff
changeset | 27 | val cache_conv: conv -> conv | 
| 26571 | 28 | val abs_conv: (cterm * Proof.context -> conv) -> Proof.context -> conv | 
| 22926 | 29 | val combination_conv: conv -> conv -> conv | 
| 30 | val comb_conv: conv -> conv | |
| 31 | val arg_conv: conv -> conv | |
| 32 | val fun_conv: conv -> conv | |
| 33 | val arg1_conv: conv -> conv | |
| 34 | val fun2_conv: conv -> conv | |
| 23034 | 35 | val binop_conv: conv -> conv | 
| 36936 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 36 | val binder_conv: (cterm * Proof.context -> conv) -> Proof.context -> conv | 
| 26571 | 37 | val forall_conv: (cterm * Proof.context -> conv) -> Proof.context -> conv | 
| 38 | val implies_conv: conv -> conv -> conv | |
| 39 | val implies_concl_conv: conv -> conv | |
| 40 | val rewr_conv: thm -> conv | |
| 36936 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 41 | val rewrs_conv: thm list -> conv | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 42 | val sub_conv: (Proof.context -> conv) -> Proof.context -> conv | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 43 | val bottom_conv: (Proof.context -> conv) -> Proof.context -> conv | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 44 | val top_conv: (Proof.context -> conv) -> Proof.context -> conv | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 45 | val top_sweep_conv: (Proof.context -> conv) -> Proof.context -> conv | 
| 26571 | 46 | val params_conv: int -> (Proof.context -> conv) -> Proof.context -> conv | 
| 47 | val prems_conv: int -> conv -> conv | |
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 48 | val concl_conv: int -> conv -> conv | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 49 | val fconv_rule: conv -> thm -> thm | 
| 23583 
00751df1f98c
else_conv: only handle THM | CTERM | TERM | TYPE;
 wenzelm parents: 
23534diff
changeset | 50 | val gconv_rule: conv -> int -> thm -> thm | 
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 51 | end; | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 52 | |
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 53 | structure Conv: CONV = | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 54 | struct | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 55 | |
| 32843 
c8f5a7c8353f
moved cache_conv to src/Pure/conv.ML, use Thm.cterm_cache;
 wenzelm parents: 
30136diff
changeset | 56 | (* basic conversionals *) | 
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 57 | |
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 58 | fun no_conv _ = raise CTERM ("no conversion", []);
 | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 59 | val all_conv = Thm.reflexive; | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 60 | |
| 22937 | 61 | fun (cv1 then_conv cv2) ct = | 
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 62 | let | 
| 22926 | 63 | val eq1 = cv1 ct; | 
| 64 | val eq2 = cv2 (Thm.rhs_of eq1); | |
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 65 | in | 
| 23596 | 66 | if Thm.is_reflexive eq1 then eq2 | 
| 67 | else if Thm.is_reflexive eq2 then eq1 | |
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 68 | else Thm.transitive eq1 eq2 | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 69 | end; | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 70 | |
| 22937 | 71 | fun (cv1 else_conv cv2) ct = | 
| 23583 
00751df1f98c
else_conv: only handle THM | CTERM | TERM | TYPE;
 wenzelm parents: 
23534diff
changeset | 72 | (cv1 ct | 
| 
00751df1f98c
else_conv: only handle THM | CTERM | TERM | TYPE;
 wenzelm parents: 
23534diff
changeset | 73 | handle THM _ => cv2 ct | 
| 
00751df1f98c
else_conv: only handle THM | CTERM | TERM | TYPE;
 wenzelm parents: 
23534diff
changeset | 74 | | CTERM _ => cv2 ct | 
| 
00751df1f98c
else_conv: only handle THM | CTERM | TERM | TYPE;
 wenzelm parents: 
23534diff
changeset | 75 | | TERM _ => cv2 ct | 
| 
00751df1f98c
else_conv: only handle THM | CTERM | TERM | TYPE;
 wenzelm parents: 
23534diff
changeset | 76 | | TYPE _ => cv2 ct); | 
| 22926 | 77 | |
| 22937 | 78 | fun first_conv cvs = fold_rev (curry op else_conv) cvs no_conv; | 
| 79 | fun every_conv cvs = fold_rev (curry op then_conv) cvs all_conv; | |
| 22926 | 80 | |
| 22937 | 81 | fun try_conv cv = cv else_conv all_conv; | 
| 82 | fun repeat_conv cv ct = try_conv (cv then_conv repeat_conv cv) ct; | |
| 22926 | 83 | |
| 74270 | 84 | fun cache_conv (cv: conv) = Ctermtab.cterm_cache cv; | 
| 32843 
c8f5a7c8353f
moved cache_conv to src/Pure/conv.ML, use Thm.cterm_cache;
 wenzelm parents: 
30136diff
changeset | 85 | |
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 86 | |
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 87 | |
| 22926 | 88 | (** Pure conversions **) | 
| 89 | ||
| 90 | (* lambda terms *) | |
| 91 | ||
| 24834 
5684cbf8c895
abs_conv/forall_conv: proper context (avoid gensym);
 wenzelm parents: 
23656diff
changeset | 92 | fun abs_conv cv ctxt ct = | 
| 23587 | 93 | (case Thm.term_of ct of | 
| 22926 | 94 | Abs (x, _, _) => | 
| 23596 | 95 | let | 
| 42485 | 96 | val (u, ctxt') = yield_singleton Variable.variant_fixes Name.uu ctxt; | 
| 24834 
5684cbf8c895
abs_conv/forall_conv: proper context (avoid gensym);
 wenzelm parents: 
23656diff
changeset | 97 | val (v, ct') = Thm.dest_abs (SOME u) ct; | 
| 26571 | 98 | val eq = cv (v, ctxt') ct'; | 
| 23596 | 99 | in if Thm.is_reflexive eq then all_conv ct else Thm.abstract_rule x v eq end | 
| 22926 | 100 |   | _ => raise CTERM ("abs_conv", [ct]));
 | 
| 101 | ||
| 102 | fun combination_conv cv1 cv2 ct = | |
| 103 | let val (ct1, ct2) = Thm.dest_comb ct | |
| 104 | in Thm.combination (cv1 ct1) (cv2 ct2) end; | |
| 105 | ||
| 106 | fun comb_conv cv = combination_conv cv cv; | |
| 107 | fun arg_conv cv = combination_conv all_conv cv; | |
| 108 | fun fun_conv cv = combination_conv cv all_conv; | |
| 109 | ||
| 110 | val arg1_conv = fun_conv o arg_conv; | |
| 111 | val fun2_conv = fun_conv o fun_conv; | |
| 112 | ||
| 23034 | 113 | fun binop_conv cv = combination_conv (arg_conv cv) cv; | 
| 22926 | 114 | |
| 36936 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 115 | fun binder_conv cv ctxt = arg_conv (abs_conv cv ctxt); | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 116 | |
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 117 | |
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 118 | (* subterm structure *) | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 119 | |
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 120 | (*cf. SUB_CONV in HOL*) | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 121 | fun sub_conv conv ctxt = | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 122 | comb_conv (conv ctxt) else_conv | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 123 | abs_conv (conv o snd) ctxt else_conv | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 124 | all_conv; | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 125 | |
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 126 | (*cf. BOTTOM_CONV in HOL*) | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 127 | fun bottom_conv conv ctxt ct = | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 128 | (sub_conv (bottom_conv conv) ctxt then_conv conv ctxt) ct; | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 129 | |
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 130 | (*cf. TOP_CONV in HOL*) | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 131 | fun top_conv conv ctxt ct = | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 132 | (conv ctxt then_conv sub_conv (top_conv conv) ctxt) ct; | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 133 | |
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 134 | (*cf. TOP_SWEEP_CONV in HOL*) | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 135 | fun top_sweep_conv conv ctxt ct = | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 136 | (conv ctxt else_conv sub_conv (top_sweep_conv conv) ctxt) ct; | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 137 | |
| 23169 | 138 | |
| 26571 | 139 | (* primitive logic *) | 
| 140 | ||
| 141 | fun forall_conv cv ctxt ct = | |
| 142 | (case Thm.term_of ct of | |
| 56245 | 143 |     Const ("Pure.all", _) $ Abs _ => arg_conv (abs_conv cv ctxt) ct
 | 
| 26571 | 144 |   | _ => raise CTERM ("forall_conv", [ct]));
 | 
| 145 | ||
| 146 | fun implies_conv cv1 cv2 ct = | |
| 147 | (case Thm.term_of ct of | |
| 56245 | 148 |     Const ("Pure.imp", _) $ _ $ _ => combination_conv (arg_conv cv1) cv2 ct
 | 
| 26571 | 149 |   | _ => raise CTERM ("implies_conv", [ct]));
 | 
| 150 | ||
| 151 | fun implies_concl_conv cv ct = | |
| 152 | (case Thm.term_of ct of | |
| 56245 | 153 |     Const ("Pure.imp", _) $ _ $ _ => arg_conv cv ct
 | 
| 26571 | 154 |   | _ => raise CTERM ("implies_concl_conv", [ct]));
 | 
| 155 | ||
| 156 | ||
| 50639 | 157 | (* single rewrite step, cf. REWR_CONV in HOL *) | 
| 158 | ||
| 26571 | 159 | fun rewr_conv rule ct = | 
| 160 | let | |
| 59586 | 161 | val rule1 = Thm.incr_indexes (Thm.maxidx_of_cterm ct + 1) rule; | 
| 26571 | 162 | val lhs = Thm.lhs_of rule1; | 
| 163 | val rule2 = Thm.rename_boundvars (Thm.term_of lhs) (Thm.term_of ct) rule1; | |
| 49974 
791157a4179a
ensured that rewr_conv rule t = "t == u" literally not just modulo beta-eta
 nipkow parents: 
43333diff
changeset | 164 | val rule3 = | 
| 
791157a4179a
ensured that rewr_conv rule t = "t == u" literally not just modulo beta-eta
 nipkow parents: 
43333diff
changeset | 165 | Thm.instantiate (Thm.match (lhs, ct)) rule2 | 
| 50639 | 166 |         handle Pattern.MATCH => raise CTERM ("rewr_conv", [lhs, ct]);
 | 
| 49974 
791157a4179a
ensured that rewr_conv rule t = "t == u" literally not just modulo beta-eta
 nipkow parents: 
43333diff
changeset | 167 | val rule4 = | 
| 50639 | 168 | if Thm.lhs_of rule3 aconvc ct then rule3 | 
| 49974 
791157a4179a
ensured that rewr_conv rule t = "t == u" literally not just modulo beta-eta
 nipkow parents: 
43333diff
changeset | 169 | else | 
| 
791157a4179a
ensured that rewr_conv rule t = "t == u" literally not just modulo beta-eta
 nipkow parents: 
43333diff
changeset | 170 | let val ceq = Thm.dest_fun2 (Thm.cprop_of rule3) | 
| 50639 | 171 | in rule3 COMP Thm.trivial (Thm.mk_binop ceq ct (Thm.rhs_of rule3)) end; | 
| 172 | in Thm.transitive rule4 (Thm.beta_conversion true (Thm.rhs_of rule4)) end; | |
| 26571 | 173 | |
| 36936 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 174 | fun rewrs_conv rules = first_conv (map rewr_conv rules); | 
| 
c52d1c130898
incorporated further conversions and conversionals, after some minor tuning;
 wenzelm parents: 
32843diff
changeset | 175 | |
| 26571 | 176 | |
| 177 | (* conversions on HHF rules *) | |
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 178 | |
| 67721 | 179 | (*rewrite B in \<And>x1 ... xn. B*) | 
| 26571 | 180 | fun params_conv n cv ctxt ct = | 
| 27332 | 181 | if n <> 0 andalso Logic.is_all (Thm.term_of ct) | 
| 26571 | 182 | then arg_conv (abs_conv (params_conv (n - 1) cv o #2) ctxt) ct | 
| 24834 
5684cbf8c895
abs_conv/forall_conv: proper context (avoid gensym);
 wenzelm parents: 
23656diff
changeset | 183 | else cv ctxt ct; | 
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 184 | |
| 67721 | 185 | (*rewrite the A's in A1 \<Longrightarrow> ... \<Longrightarrow> An \<Longrightarrow> B*) | 
| 26571 | 186 | fun prems_conv 0 _ ct = all_conv ct | 
| 187 | | prems_conv n cv ct = | |
| 188 | (case try Thm.dest_implies ct of | |
| 189 | NONE => all_conv ct | |
| 190 | | SOME (A, B) => Drule.imp_cong_rule (cv A) (prems_conv (n - 1) cv B)); | |
| 191 | ||
| 67721 | 192 | (*rewrite B in A1 \<Longrightarrow> ... \<Longrightarrow> An \<Longrightarrow> B*) | 
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 193 | fun concl_conv 0 cv ct = cv ct | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 194 | | concl_conv n cv ct = | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 195 | (case try Thm.dest_implies ct of | 
| 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 196 | NONE => cv ct | 
| 22926 | 197 | | SOME (A, B) => Drule.imp_cong_rule (all_conv A) (concl_conv (n - 1) cv B)); | 
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 198 | |
| 23596 | 199 | |
| 26571 | 200 | (* conversions as inference rules *) | 
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 201 | |
| 23596 | 202 | (*forward conversion, cf. FCONV_RULE in LCF*) | 
| 203 | fun fconv_rule cv th = | |
| 204 | let val eq = cv (Thm.cprop_of th) in | |
| 205 | if Thm.is_reflexive eq then th | |
| 206 | else Thm.equal_elim eq th | |
| 207 | end; | |
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 208 | |
| 23596 | 209 | (*goal conversion*) | 
| 210 | fun gconv_rule cv i th = | |
| 211 | (case try (Thm.cprem_of th) i of | |
| 212 | SOME ct => | |
| 213 | let val eq = cv ct in | |
| 214 | if Thm.is_reflexive eq then th | |
| 215 | else Drule.with_subgoal i (fconv_rule (arg1_conv (K eq))) th | |
| 216 | end | |
| 217 |   | NONE => raise THM ("gconv_rule", i, [th]));
 | |
| 23411 
c524900454f3
Added eta_conv and eta-expansion conversion: waiting for it to be in thm.ML; exported is_refl
 chaieb parents: 
23169diff
changeset | 218 | |
| 22905 
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
 wenzelm parents: diff
changeset | 219 | end; | 
| 30136 
6a874aedb964
Made then_conv and else_conv available as infix operations.
 boehmes parents: 
29606diff
changeset | 220 | |
| 32843 
c8f5a7c8353f
moved cache_conv to src/Pure/conv.ML, use Thm.cterm_cache;
 wenzelm parents: 
30136diff
changeset | 221 | structure Basic_Conv: BASIC_CONV = Conv; | 
| 
c8f5a7c8353f
moved cache_conv to src/Pure/conv.ML, use Thm.cterm_cache;
 wenzelm parents: 
30136diff
changeset | 222 | open Basic_Conv; |