src/Provers/simplifier.ML
changeset 217 c972c57e7762
parent 146 dbee71d43339
child 406 4d4e0442b106
equal deleted inserted replaced
216:4a10bc05210a 217:c972c57e7762
   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;