src/HOL/List.thy
changeset 60159 879918f4ee0f
parent 60158 6696fc3f3347
child 60160 52aa014308cb
equal deleted inserted replaced
60158:6696fc3f3347 60159:879918f4ee0f
   623 fun tac _ [] = rtac set_singleton 1 ORELSE rtac inst_Collect_mem_eq 1
   623 fun tac _ [] = rtac set_singleton 1 ORELSE rtac inst_Collect_mem_eq 1
   624   | tac ctxt (If :: cont) =
   624   | tac ctxt (If :: cont) =
   625       Splitter.split_tac ctxt @{thms split_if} 1
   625       Splitter.split_tac ctxt @{thms split_if} 1
   626       THEN rtac @{thm conjI} 1
   626       THEN rtac @{thm conjI} 1
   627       THEN rtac @{thm impI} 1
   627       THEN rtac @{thm impI} 1
   628       THEN Subgoal.FOCUS (fn {prems, context, ...} =>
   628       THEN Subgoal.FOCUS (fn {prems, context = ctxt', ...} =>
   629         CONVERSION (right_hand_set_comprehension_conv (K
   629         CONVERSION (right_hand_set_comprehension_conv (K
   630           (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_TrueI})) Conv.all_conv
   630           (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_TrueI})) Conv.all_conv
   631            then_conv
   631            then_conv
   632            rewr_conv' @{lemma "(True \<and> P) = P" by simp})) context) 1) ctxt 1
   632            rewr_conv' @{lemma "(True \<and> P) = P" by simp})) ctxt') 1) ctxt 1
   633       THEN tac ctxt cont
   633       THEN tac ctxt cont
   634       THEN rtac @{thm impI} 1
   634       THEN rtac @{thm impI} 1
   635       THEN Subgoal.FOCUS (fn {prems, context, ...} =>
   635       THEN Subgoal.FOCUS (fn {prems, context = ctxt', ...} =>
   636           CONVERSION (right_hand_set_comprehension_conv (K
   636           CONVERSION (right_hand_set_comprehension_conv (K
   637             (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_FalseI})) Conv.all_conv
   637             (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_FalseI})) Conv.all_conv
   638              then_conv rewr_conv' @{lemma "(False \<and> P) = False" by simp})) context) 1) ctxt 1
   638              then_conv rewr_conv' @{lemma "(False \<and> P) = False" by simp})) ctxt') 1) ctxt 1
   639       THEN rtac set_Nil_I 1
   639       THEN rtac set_Nil_I 1
   640   | tac ctxt (Case (T, i) :: cont) =
   640   | tac ctxt (Case (T, i) :: cont) =
   641       let
   641       let
   642         val SOME {injects, distincts, case_thms, split, ...} =
   642         val SOME {injects, distincts, case_thms, split, ...} =
   643           Ctr_Sugar.ctr_sugar_of ctxt (fst (dest_Type T))
   643           Ctr_Sugar.ctr_sugar_of ctxt (fst (dest_Type T))
   648           (if i' < length case_thms - 1 then rtac @{thm conjI} 1 else all_tac)
   648           (if i' < length case_thms - 1 then rtac @{thm conjI} 1 else all_tac)
   649           THEN REPEAT_DETERM (rtac @{thm allI} 1)
   649           THEN REPEAT_DETERM (rtac @{thm allI} 1)
   650           THEN rtac @{thm impI} 1
   650           THEN rtac @{thm impI} 1
   651           THEN (if i' = i then
   651           THEN (if i' = i then
   652             (* continue recursively *)
   652             (* continue recursively *)
   653             Subgoal.FOCUS (fn {prems, context, ...} =>
   653             Subgoal.FOCUS (fn {prems, context = ctxt', ...} =>
   654               CONVERSION (Thm.eta_conversion then_conv right_hand_set_comprehension_conv (K
   654               CONVERSION (Thm.eta_conversion then_conv right_hand_set_comprehension_conv (K
   655                   ((HOLogic.conj_conv
   655                   ((HOLogic.conj_conv
   656                     (HOLogic.eq_conv Conv.all_conv (rewr_conv' (List.last prems)) then_conv
   656                     (HOLogic.eq_conv Conv.all_conv (rewr_conv' (List.last prems)) then_conv
   657                       (Conv.try_conv (Conv.rewrs_conv (map mk_meta_eq injects))))
   657                       (Conv.try_conv (Conv.rewrs_conv (map mk_meta_eq injects))))
   658                     Conv.all_conv)
   658                     Conv.all_conv)
   659                     then_conv (Conv.try_conv (Conv.rewr_conv del_refl_eq))
   659                     then_conv (Conv.try_conv (Conv.rewr_conv del_refl_eq))
   660                     then_conv conjunct_assoc_conv)) context
   660                     then_conv conjunct_assoc_conv)) ctxt'
   661                 then_conv (HOLogic.Trueprop_conv (HOLogic.eq_conv Conv.all_conv (Collect_conv (fn (_, ctxt) =>
   661                 then_conv
   662                   Conv.repeat_conv
   662                   (HOLogic.Trueprop_conv
   663                     (all_but_last_exists_conv
   663                     (HOLogic.eq_conv Conv.all_conv (Collect_conv (fn (_, ctxt'') =>
   664                       (K (rewr_conv'
   664                       Conv.repeat_conv
   665                         @{lemma "(\<exists>x. x = t \<and> P x) = P t" by simp})) ctxt)) context)))) 1) ctxt 1
   665                         (all_but_last_exists_conv
       
   666                           (K (rewr_conv'
       
   667                             @{lemma "(\<exists>x. x = t \<and> P x) = P t" by simp})) ctxt'')) ctxt')))) 1) ctxt 1
   666             THEN tac ctxt cont
   668             THEN tac ctxt cont
   667           else
   669           else
   668             Subgoal.FOCUS (fn {prems, context, ...} =>
   670             Subgoal.FOCUS (fn {prems, context = ctxt', ...} =>
   669               CONVERSION
   671               CONVERSION
   670                 (right_hand_set_comprehension_conv (K
   672                 (right_hand_set_comprehension_conv (K
   671                   (HOLogic.conj_conv
   673                   (HOLogic.conj_conv
   672                     ((HOLogic.eq_conv Conv.all_conv
   674                     ((HOLogic.eq_conv Conv.all_conv
   673                       (rewr_conv' (List.last prems))) then_conv
   675                       (rewr_conv' (List.last prems))) then_conv
   674                       (Conv.rewrs_conv (map (fn th => th RS @{thm Eq_FalseI}) distincts)))
   676                       (Conv.rewrs_conv (map (fn th => th RS @{thm Eq_FalseI}) distincts)))
   675                     Conv.all_conv then_conv
   677                     Conv.all_conv then_conv
   676                     (rewr_conv' @{lemma "(False \<and> P) = False" by simp}))) context then_conv
   678                     (rewr_conv' @{lemma "(False \<and> P) = False" by simp}))) ctxt' then_conv
   677                   HOLogic.Trueprop_conv
   679                   HOLogic.Trueprop_conv
   678                     (HOLogic.eq_conv Conv.all_conv
   680                     (HOLogic.eq_conv Conv.all_conv
   679                       (Collect_conv (fn (_, ctxt) =>
   681                       (Collect_conv (fn (_, ctxt'') =>
   680                         Conv.repeat_conv
   682                         Conv.repeat_conv
   681                           (Conv.bottom_conv
   683                           (Conv.bottom_conv
   682                             (K (rewr_conv'
   684                             (K (rewr_conv' @{lemma "(\<exists>x. P) = P" by simp})) ctxt'')) ctxt'))) 1) ctxt 1
   683                               @{lemma "(\<exists>x. P) = P" by simp})) ctxt)) context))) 1) ctxt 1
       
   684             THEN rtac set_Nil_I 1)) case_thms)
   685             THEN rtac set_Nil_I 1)) case_thms)
   685       end
   686       end
   686 
   687 
   687 in
   688 in
   688 
   689 
   729                 val rhs = HOLogic.mk_Collect ("x", rT, inner_t)
   730                 val rhs = HOLogic.mk_Collect ("x", rT, inner_t)
   730                 val rewrite_rule_t = HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs))
   731                 val rewrite_rule_t = HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs))
   731               in
   732               in
   732                 SOME
   733                 SOME
   733                   ((Goal.prove ctxt [] [] rewrite_rule_t
   734                   ((Goal.prove ctxt [] [] rewrite_rule_t
   734                     (fn {context, ...} => tac context (rev Tis))) RS @{thm eq_reflection})
   735                     (fn {context = ctxt', ...} => tac ctxt' (rev Tis))) RS @{thm eq_reflection})
   735               end))
   736               end))
   736   in
   737   in
   737     make_inner_eqs [] [] [] (dest_set (Thm.term_of redex))
   738     make_inner_eqs [] [] [] (dest_set (Thm.term_of redex))
   738   end
   739   end
   739 
   740 
   740 end
   741 end
   741 
   742 
   742 end
   743 end
   743 *}
   744 *}
   744 
   745 
   745 simproc_setup list_to_set_comprehension ("set xs") = {* K List_to_Set_Comprehension.simproc *}
   746 simproc_setup list_to_set_comprehension ("set xs") =
       
   747   {* K List_to_Set_Comprehension.simproc *}
   746 
   748 
   747 code_datatype set coset
   749 code_datatype set coset
   748 
       
   749 hide_const (open) coset
   750 hide_const (open) coset
   750 
   751 
   751 
   752 
   752 subsubsection {* @{const Nil} and @{const Cons} *}
   753 subsubsection {* @{const Nil} and @{const Cons} *}
   753 
   754