author | clasohm |
Thu, 26 Oct 1995 13:53:00 +0100 | |
changeset 1312 | 0c0e6298df13 |
parent 1260 | c76ac4a9dc2b |
child 1512 | ce37c64244c0 |
permissions | -rw-r--r-- |
1243 | 1 |
(* Title: Provers/simplifier.ML |
1 | 2 |
ID: $Id$ |
3 |
Author: Tobias Nipkow |
|
4 |
Copyright 1993 TU Munich |
|
5 |
||
6 |
Generic simplifier, suitable for most logics. |
|
7 |
||
8 |
*) |
|
1260 | 9 |
|
983 | 10 |
infix 4 addsimps addeqcongs delsimps |
11 |
setsolver setloop setmksimps setsubgoaler; |
|
0 | 12 |
|
13 |
signature SIMPLIFIER = |
|
14 |
sig |
|
15 |
type simpset |
|
1 | 16 |
val addeqcongs: simpset * thm list -> simpset |
0 | 17 |
val addsimps: simpset * thm list -> simpset |
88 | 18 |
val delsimps: simpset * thm list -> simpset |
0 | 19 |
val asm_full_simp_tac: simpset -> int -> tactic |
20 |
val asm_simp_tac: simpset -> int -> tactic |
|
21 |
val empty_ss: simpset |
|
22 |
val merge_ss: simpset * simpset -> simpset |
|
23 |
val prems_of_ss: simpset -> thm list |
|
24 |
val rep_ss: simpset -> {simps: thm list, congs: thm list} |
|
25 |
val setsolver: simpset * (thm list -> int -> tactic) -> simpset |
|
26 |
val setloop: simpset * (int -> tactic) -> simpset |
|
27 |
val setmksimps: simpset * (thm -> thm list) -> simpset |
|
28 |
val setsubgoaler: simpset * (simpset -> int -> tactic) -> simpset |
|
29 |
val simp_tac: simpset -> int -> tactic |
|
1243 | 30 |
|
31 |
val simpset: simpset ref |
|
32 |
val Addsimps: thm list -> unit |
|
33 |
val Delsimps: thm list -> unit |
|
34 |
val Simp_tac: int -> tactic |
|
35 |
val Asm_simp_tac: int -> tactic |
|
36 |
val Asm_full_simp_tac: int -> tactic |
|
0 | 37 |
end; |
38 |
||
1260 | 39 |
functor SimplifierFun():SIMPLIFIER = |
0 | 40 |
struct |
41 |
||
42 |
datatype simpset = |
|
1260 | 43 |
Simpset of {mss: meta_simpset, |
44 |
simps: thm list, |
|
45 |
congs: thm list, |
|
46 |
subgoal_tac: simpset -> int -> tactic, |
|
47 |
finish_tac: thm list -> int -> tactic, |
|
48 |
loop_tac: int -> tactic}; |
|
0 | 49 |
|
50 |
val empty_ss = |
|
1260 | 51 |
Simpset{mss=empty_mss, |
52 |
simps= [], |
|
53 |
congs= [], |
|
54 |
subgoal_tac= K(K no_tac), |
|
55 |
finish_tac= K(K no_tac), |
|
56 |
loop_tac= K no_tac}; |
|
0 | 57 |
|
1243 | 58 |
val simpset = ref empty_ss; |
0 | 59 |
|
1260 | 60 |
fun (Simpset{mss,simps,congs,subgoal_tac,finish_tac,...}) setloop loop_tac = |
61 |
Simpset{mss=mss, |
|
62 |
simps= simps, |
|
63 |
congs= congs, |
|
64 |
subgoal_tac= subgoal_tac, |
|
65 |
finish_tac=finish_tac, |
|
66 |
loop_tac= DETERM o loop_tac}; |
|
0 | 67 |
|
1260 | 68 |
fun (Simpset{mss,simps,congs,subgoal_tac,loop_tac,...}) setsolver finish_tac = |
69 |
Simpset{mss=mss, |
|
70 |
simps= simps, |
|
71 |
congs= congs, |
|
72 |
subgoal_tac= subgoal_tac, |
|
73 |
finish_tac=finish_tac, |
|
74 |
loop_tac=loop_tac}; |
|
0 | 75 |
|
1260 | 76 |
fun (Simpset{mss,simps,congs,finish_tac,loop_tac,...}) setsubgoaler |
77 |
subgoal_tac = |
|
78 |
Simpset{mss=mss, |
|
79 |
simps= simps, |
|
80 |
congs= congs, |
|
81 |
subgoal_tac= subgoal_tac, |
|
82 |
finish_tac=finish_tac, |
|
83 |
loop_tac=loop_tac}; |
|
84 |
||
85 |
fun (Simpset{mss,simps,congs,subgoal_tac,finish_tac,loop_tac}) setmksimps |
|
86 |
mk_simps = |
|
87 |
Simpset{mss=Thm.set_mk_rews(mss,mk_simps), |
|
88 |
simps= simps, |
|
89 |
congs= congs, |
|
90 |
subgoal_tac= subgoal_tac, |
|
91 |
finish_tac=finish_tac, |
|
92 |
loop_tac=loop_tac}; |
|
0 | 93 |
|
1260 | 94 |
fun (Simpset{mss,simps,congs,subgoal_tac,finish_tac,loop_tac}) addsimps rews = |
88 | 95 |
let val rews' = flat(map (Thm.mk_rews_of_mss mss) rews) in |
1260 | 96 |
Simpset{mss= Thm.add_simps(mss,rews'), |
97 |
simps= rews' @ simps, |
|
98 |
congs= congs, |
|
99 |
subgoal_tac= subgoal_tac, |
|
100 |
finish_tac=finish_tac, |
|
101 |
loop_tac=loop_tac} |
|
0 | 102 |
end; |
103 |
||
1243 | 104 |
fun Addsimps rews = (simpset := !simpset addsimps rews); |
105 |
||
1260 | 106 |
fun (Simpset{mss,simps,congs,subgoal_tac,finish_tac,loop_tac}) delsimps rews = |
88 | 107 |
let val rews' = flat(map (Thm.mk_rews_of_mss mss) rews) in |
1260 | 108 |
Simpset{mss= Thm.del_simps(mss,rews'), |
109 |
simps= foldl (gen_rem eq_thm) (simps,rews'), |
|
110 |
congs= congs, |
|
111 |
subgoal_tac= subgoal_tac, |
|
112 |
finish_tac=finish_tac, |
|
113 |
loop_tac=loop_tac} |
|
88 | 114 |
end; |
115 |
||
1243 | 116 |
fun Delsimps rews = (simpset := !simpset delsimps rews); |
117 |
||
1260 | 118 |
fun (Simpset{mss,simps,congs,subgoal_tac,finish_tac,loop_tac}) addeqcongs |
119 |
newcongs = |
|
120 |
Simpset{mss= Thm.add_congs(mss,newcongs), |
|
121 |
simps= simps, |
|
122 |
congs= newcongs @ congs, |
|
123 |
subgoal_tac= subgoal_tac, |
|
124 |
finish_tac=finish_tac, |
|
125 |
loop_tac=loop_tac}; |
|
126 |
||
127 |
fun merge_ss(Simpset{mss,simps,congs,subgoal_tac,finish_tac,loop_tac}, |
|
128 |
Simpset{simps=simps2,congs=congs2,...}) = |
|
0 | 129 |
let val simps' = gen_union eq_thm (simps,simps2) |
130 |
val congs' = gen_union eq_thm (congs,congs2) |
|
131 |
val mss' = Thm.set_mk_rews(empty_mss,Thm.mk_rews_of_mss mss) |
|
132 |
val mss' = Thm.add_simps(mss',simps') |
|
133 |
val mss' = Thm.add_congs(mss',congs') |
|
1260 | 134 |
in Simpset{mss= mss', |
135 |
simps= simps', |
|
136 |
congs= congs', |
|
137 |
subgoal_tac= subgoal_tac, |
|
138 |
finish_tac= finish_tac, |
|
139 |
loop_tac= loop_tac} |
|
0 | 140 |
end; |
141 |
||
1260 | 142 |
fun prems_of_ss(Simpset{mss,...}) = prems_of_mss mss; |
0 | 143 |
|
1260 | 144 |
fun rep_ss(Simpset{simps,congs,...}) = {simps=simps,congs=congs}; |
0 | 145 |
|
1 | 146 |
fun NEWSUBGOALS tac tacf = |
147 |
STATE(fn state0 => |
|
148 |
tac THEN STATE(fn state1 => tacf(nprems_of state1 - nprems_of state0))); |
|
149 |
||
217
c972c57e7762
got rid of METAHYPS due to the change of the basic simplification routines
nipkow
parents:
146
diff
changeset
|
150 |
fun gen_simp_tac mode = |
1260 | 151 |
fn (Simpset{mss,simps,congs,subgoal_tac,finish_tac,loop_tac}) => |
0 | 152 |
let fun solve_all_tac mss = |
1260 | 153 |
let val ss = Simpset{mss=mss,simps=simps,congs=congs, |
154 |
subgoal_tac=subgoal_tac, |
|
155 |
finish_tac=finish_tac, loop_tac=loop_tac} |
|
1 | 156 |
val solve1_tac = |
157 |
NEWSUBGOALS (subgoal_tac ss 1) |
|
158 |
(fn n => if n<0 then all_tac else no_tac) |
|
159 |
in DEPTH_SOLVE(solve1_tac) end |
|
0 | 160 |
|
161 |
fun simp_loop i thm = |
|
217
c972c57e7762
got rid of METAHYPS due to the change of the basic simplification routines
nipkow
parents:
146
diff
changeset
|
162 |
tapply(asm_rewrite_goal_tac mode solve_all_tac mss i THEN |
1 | 163 |
(finish_tac (prems_of_mss mss) i ORELSE looper i), |
0 | 164 |
thm) |
1 | 165 |
and allsimp i n = EVERY(map (fn j => simp_loop_tac (i+j)) (n downto 0)) |
166 |
and looper i = TRY(NEWSUBGOALS (loop_tac i) (allsimp i)) |
|
0 | 167 |
and simp_loop_tac i = Tactic(simp_loop i) |
168 |
||
217
c972c57e7762
got rid of METAHYPS due to the change of the basic simplification routines
nipkow
parents:
146
diff
changeset
|
169 |
in simp_loop_tac end; |
0 | 170 |
|
217
c972c57e7762
got rid of METAHYPS due to the change of the basic simplification routines
nipkow
parents:
146
diff
changeset
|
171 |
val asm_full_simp_tac = gen_simp_tac (true,true); |
c972c57e7762
got rid of METAHYPS due to the change of the basic simplification routines
nipkow
parents:
146
diff
changeset
|
172 |
val asm_simp_tac = gen_simp_tac (false,true); |
c972c57e7762
got rid of METAHYPS due to the change of the basic simplification routines
nipkow
parents:
146
diff
changeset
|
173 |
val simp_tac = gen_simp_tac (false,false); |
0 | 174 |
|
1243 | 175 |
fun Asm_full_simp_tac i = asm_full_simp_tac (!simpset) i; |
176 |
fun Asm_simp_tac i = asm_simp_tac (!simpset) i; |
|
177 |
fun Simp_tac i = simp_tac (!simpset) i; |
|
406 | 178 |
|
1243 | 179 |
end; |