125 |
125 |
126 fun prems_of_ss(SS{mss,...}) = prems_of_mss mss; |
126 fun prems_of_ss(SS{mss,...}) = prems_of_mss mss; |
127 |
127 |
128 fun rep_ss(SS{simps,congs,...}) = {simps=simps,congs=congs}; |
128 fun rep_ss(SS{simps,congs,...}) = {simps=simps,congs=congs}; |
129 |
129 |
130 fun add_asms (SS{mss,simps,congs,subgoal_tac,finish_tac,loop_tac}) prems = |
|
131 let val rews = flat(map (mk_rews_of_mss mss) prems) |
|
132 in SS{mss= add_prems(add_simps(mss,rews),prems), simps=simps, congs=congs, |
|
133 subgoal_tac=subgoal_tac,finish_tac=finish_tac, |
|
134 loop_tac=loop_tac} |
|
135 end; |
|
136 |
|
137 fun NEWSUBGOALS tac tacf = |
130 fun NEWSUBGOALS tac tacf = |
138 STATE(fn state0 => |
131 STATE(fn state0 => |
139 tac THEN STATE(fn state1 => tacf(nprems_of state1 - nprems_of state0))); |
132 tac THEN STATE(fn state1 => tacf(nprems_of state1 - nprems_of state0))); |
140 |
133 |
141 fun asm_full_simp_tac(SS{mss,simps,congs,subgoal_tac,finish_tac,loop_tac}) = |
134 fun gen_simp_tac mode = |
|
135 fn (SS{mss,simps,congs,subgoal_tac,finish_tac,loop_tac}) => |
142 let fun solve_all_tac mss = |
136 let fun solve_all_tac mss = |
143 let val ss = SS{mss=mss,simps=simps,congs=congs, |
137 let val ss = SS{mss=mss,simps=simps,congs=congs, |
144 subgoal_tac=subgoal_tac, |
138 subgoal_tac=subgoal_tac, |
145 finish_tac=finish_tac, loop_tac=loop_tac} |
139 finish_tac=finish_tac, loop_tac=loop_tac} |
146 val solve1_tac = |
140 val solve1_tac = |
147 NEWSUBGOALS (subgoal_tac ss 1) |
141 NEWSUBGOALS (subgoal_tac ss 1) |
148 (fn n => if n<0 then all_tac else no_tac) |
142 (fn n => if n<0 then all_tac else no_tac) |
149 in DEPTH_SOLVE(solve1_tac) end |
143 in DEPTH_SOLVE(solve1_tac) end |
150 |
144 |
151 fun simp_loop i thm = |
145 fun simp_loop i thm = |
152 tapply(asm_rewrite_goal_tac solve_all_tac mss i THEN |
146 tapply(asm_rewrite_goal_tac mode solve_all_tac mss i THEN |
153 (finish_tac (prems_of_mss mss) i ORELSE looper i), |
147 (finish_tac (prems_of_mss mss) i ORELSE looper i), |
154 thm) |
148 thm) |
155 and allsimp i n = EVERY(map (fn j => simp_loop_tac (i+j)) (n downto 0)) |
149 and allsimp i n = EVERY(map (fn j => simp_loop_tac (i+j)) (n downto 0)) |
156 and looper i = TRY(NEWSUBGOALS (loop_tac i) (allsimp i)) |
150 and looper i = TRY(NEWSUBGOALS (loop_tac i) (allsimp i)) |
157 and simp_loop_tac i = Tactic(simp_loop i) |
151 and simp_loop_tac i = Tactic(simp_loop i) |
158 |
152 |
159 in fn i => COND (has_fewer_prems 1) no_tac (simp_loop_tac i) end; |
153 in simp_loop_tac end; |
160 |
154 |
161 fun asm_simp_tac ss = |
155 val asm_full_simp_tac = gen_simp_tac (true,true); |
162 METAHYPS(fn prems => asm_full_simp_tac (add_asms ss prems) 1); |
156 val asm_simp_tac = gen_simp_tac (false,true); |
163 |
157 val simp_tac = gen_simp_tac (false,false); |
164 fun simp_tac ss = METAHYPS(fn _ => asm_full_simp_tac ss 1); |
|
165 |
158 |
166 end; |
159 end; |