author | wenzelm |
Wed, 13 Jun 2007 00:01:57 +0200 | |
changeset 23354 | a189707c1d76 |
parent 23169 | 37091da05d8e |
child 23411 | c524900454f3 |
permissions | -rw-r--r-- |
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
1 |
(* Title: Pure/conv.ML |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
2 |
ID: $Id$ |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
3 |
Author: Amine Chaieb and Makarius |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
4 |
|
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
5 |
Conversions: primitive equality reasoning. |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
6 |
*) |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
7 |
|
22937 | 8 |
infix 1 then_conv; |
9 |
infix 0 else_conv; |
|
23169 | 10 |
|
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
11 |
signature CONV = |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
12 |
sig |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
13 |
type conv = cterm -> thm |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
14 |
val no_conv: conv |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
15 |
val all_conv: conv |
22937 | 16 |
val then_conv: conv * conv -> conv |
17 |
val else_conv: conv * conv -> conv |
|
22926 | 18 |
val first_conv: conv list -> conv |
19 |
val every_conv: conv list -> conv |
|
22937 | 20 |
val try_conv: conv -> conv |
21 |
val repeat_conv: conv -> conv |
|
22926 | 22 |
val cache_conv: conv -> conv |
23 |
val abs_conv: conv -> conv |
|
24 |
val combination_conv: conv -> conv -> conv |
|
25 |
val comb_conv: conv -> conv |
|
26 |
val arg_conv: conv -> conv |
|
27 |
val fun_conv: conv -> conv |
|
28 |
val arg1_conv: conv -> conv |
|
29 |
val fun2_conv: conv -> conv |
|
23034 | 30 |
val binop_conv: conv -> conv |
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
31 |
val forall_conv: int -> conv -> conv |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
32 |
val concl_conv: int -> conv -> conv |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
33 |
val prems_conv: int -> (int -> conv) -> conv |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
34 |
val goals_conv: (int -> bool) -> conv -> conv |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
35 |
val fconv_rule: conv -> thm -> thm |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
36 |
end; |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
37 |
|
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
38 |
structure Conv: CONV = |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
39 |
struct |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
40 |
|
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
41 |
(* conversionals *) |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
42 |
|
22926 | 43 |
type conv = cterm -> thm; |
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
44 |
|
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
45 |
fun no_conv _ = raise CTERM ("no conversion", []); |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
46 |
val all_conv = Thm.reflexive; |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
47 |
|
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
48 |
val is_refl = op aconv o Logic.dest_equals o Thm.prop_of; |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
49 |
|
22937 | 50 |
fun (cv1 then_conv cv2) ct = |
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
51 |
let |
22926 | 52 |
val eq1 = cv1 ct; |
53 |
val eq2 = cv2 (Thm.rhs_of eq1); |
|
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
54 |
in |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
55 |
if is_refl eq1 then eq2 |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
56 |
else if is_refl eq2 then eq1 |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
57 |
else Thm.transitive eq1 eq2 |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
58 |
end; |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
59 |
|
22937 | 60 |
fun (cv1 else_conv cv2) ct = |
22926 | 61 |
(case try cv1 ct of SOME eq => eq | NONE => cv2 ct); |
62 |
||
22937 | 63 |
fun first_conv cvs = fold_rev (curry op else_conv) cvs no_conv; |
64 |
fun every_conv cvs = fold_rev (curry op then_conv) cvs all_conv; |
|
22926 | 65 |
|
22937 | 66 |
fun try_conv cv = cv else_conv all_conv; |
67 |
fun repeat_conv cv ct = try_conv (cv then_conv repeat_conv cv) ct; |
|
22926 | 68 |
|
69 |
fun cache_conv cv = |
|
70 |
let |
|
71 |
val cache = ref Termtab.empty; |
|
72 |
fun conv ct = |
|
73 |
(case Termtab.lookup (! cache) (term_of ct) of |
|
74 |
SOME th => th |
|
75 |
| NONE => |
|
76 |
let val th = cv ct |
|
77 |
in change cache (Termtab.update (term_of ct, th)); th end); |
|
78 |
in conv end; |
|
79 |
||
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
80 |
|
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
81 |
|
22926 | 82 |
(** Pure conversions **) |
83 |
||
84 |
(* lambda terms *) |
|
85 |
||
86 |
fun abs_conv cv ct = |
|
87 |
(case term_of ct of |
|
88 |
Abs (x, _, _) => |
|
89 |
let val (v, ct') = Thm.dest_abs (SOME (gensym "abs_")) ct |
|
90 |
in Thm.abstract_rule x v (cv ct') end |
|
91 |
| _ => raise CTERM ("abs_conv", [ct])); |
|
92 |
||
93 |
fun combination_conv cv1 cv2 ct = |
|
94 |
let val (ct1, ct2) = Thm.dest_comb ct |
|
95 |
in Thm.combination (cv1 ct1) (cv2 ct2) end; |
|
96 |
||
97 |
fun comb_conv cv = combination_conv cv cv; |
|
98 |
fun arg_conv cv = combination_conv all_conv cv; |
|
99 |
fun fun_conv cv = combination_conv cv all_conv; |
|
100 |
||
101 |
val arg1_conv = fun_conv o arg_conv; |
|
102 |
val fun2_conv = fun_conv o fun_conv; |
|
103 |
||
23034 | 104 |
fun binop_conv cv = combination_conv (arg_conv cv) cv; |
22926 | 105 |
|
23169 | 106 |
|
22926 | 107 |
(* logic *) |
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
108 |
|
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
109 |
(*rewrite B in !!x1 ... xn. B*) |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
110 |
fun forall_conv 0 cv ct = cv ct |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
111 |
| forall_conv n cv ct = |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
112 |
(case try Thm.dest_comb ct of |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
113 |
NONE => cv ct |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
114 |
| SOME (A, B) => |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
115 |
(case (term_of A, term_of B) of |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
116 |
(Const ("all", _), Abs (x, _, _)) => |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
117 |
let val (v, B') = Thm.dest_abs (SOME (gensym "all_")) B in |
22926 | 118 |
Thm.combination (all_conv A) |
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
119 |
(Thm.abstract_rule x v (forall_conv (n - 1) cv B')) |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
120 |
end |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
121 |
| _ => cv ct)); |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
122 |
|
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
123 |
(*rewrite B in A1 ==> ... ==> An ==> B*) |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
124 |
fun concl_conv 0 cv ct = cv ct |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
125 |
| concl_conv n cv ct = |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
126 |
(case try Thm.dest_implies ct of |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
127 |
NONE => cv ct |
22926 | 128 |
| 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
|
129 |
|
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
130 |
(*rewrite the A's in A1 ==> ... ==> An ==> B*) |
22926 | 131 |
fun prems_conv 0 _ = all_conv |
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
132 |
| prems_conv n cv = |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
133 |
let |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
134 |
fun conv i ct = |
22926 | 135 |
if i = n + 1 then all_conv ct |
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
136 |
else |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
137 |
(case try Thm.dest_implies ct of |
22926 | 138 |
NONE => all_conv ct |
22905
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
139 |
| SOME (A, B) => Drule.imp_cong_rule (cv i A) (conv (i + 1) B)); |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
140 |
in conv 1 end; |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
141 |
|
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
142 |
fun goals_conv pred cv = prems_conv ~1 (fn i => if pred i then cv else all_conv); |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
143 |
fun fconv_rule cv th = equal_elim (cv (cprop_of th)) th; |
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
144 |
|
dab6a898b47c
Conversions: primitive equality reasoning (from drule.ML);
wenzelm
parents:
diff
changeset
|
145 |
end; |