src/HOL/List.thy
changeset 51315 536a5603a138
parent 51314 eac4bb5adbf9
child 51489 f738e6dbd844
equal deleted inserted replaced
51314:eac4bb5adbf9 51315:536a5603a138
   512 fun Collect_conv cv ctxt ct =
   512 fun Collect_conv cv ctxt ct =
   513   (case Thm.term_of ct of
   513   (case Thm.term_of ct of
   514     Const (@{const_name Set.Collect}, _) $ Abs _ => Conv.arg_conv (Conv.abs_conv cv ctxt) ct
   514     Const (@{const_name Set.Collect}, _) $ Abs _ => Conv.arg_conv (Conv.abs_conv cv ctxt) ct
   515   | _ => raise CTERM ("Collect_conv", [ct]))
   515   | _ => raise CTERM ("Collect_conv", [ct]))
   516 
   516 
   517 fun eq_conv cv1 cv2 ct =
       
   518   (case Thm.term_of ct of
       
   519     Const (@{const_name HOL.eq}, _) $ _ $ _ => Conv.combination_conv (Conv.arg_conv cv1) cv2 ct
       
   520   | _ => raise CTERM ("eq_conv", [ct]))
       
   521 
       
   522 fun conj_conv cv1 cv2 ct =
       
   523   (case Thm.term_of ct of
       
   524     Const (@{const_name HOL.conj}, _) $ _ $ _ => Conv.combination_conv (Conv.arg_conv cv1) cv2 ct
       
   525   | _ => raise CTERM ("conj_conv", [ct]))
       
   526 
       
   527 fun rewr_conv' th = Conv.rewr_conv (mk_meta_eq th)
   517 fun rewr_conv' th = Conv.rewr_conv (mk_meta_eq th)
   528 
   518 
   529 fun conjunct_assoc_conv ct =
   519 fun conjunct_assoc_conv ct =
   530   Conv.try_conv
   520   Conv.try_conv
   531     (rewr_conv' @{thm conj_assoc} then_conv conj_conv Conv.all_conv conjunct_assoc_conv) ct
   521     (rewr_conv' @{thm conj_assoc} then_conv HOLogic.conj_conv Conv.all_conv conjunct_assoc_conv) ct
   532 
   522 
   533 fun right_hand_set_comprehension_conv conv ctxt =
   523 fun right_hand_set_comprehension_conv conv ctxt =
   534   HOLogic.Trueprop_conv (eq_conv Conv.all_conv
   524   HOLogic.Trueprop_conv (HOLogic.eq_conv Conv.all_conv
   535     (Collect_conv (all_exists_conv conv o #2) ctxt))
   525     (Collect_conv (all_exists_conv conv o #2) ctxt))
   536 
   526 
   537 
   527 
   538 (* term abstraction of list comprehension patterns *)
   528 (* term abstraction of list comprehension patterns *)
   539 
   529 
   591           Splitter.split_tac [@{thm split_if}] 1
   581           Splitter.split_tac [@{thm split_if}] 1
   592           THEN rtac @{thm conjI} 1
   582           THEN rtac @{thm conjI} 1
   593           THEN rtac @{thm impI} 1
   583           THEN rtac @{thm impI} 1
   594           THEN Subgoal.FOCUS (fn {prems, context, ...} =>
   584           THEN Subgoal.FOCUS (fn {prems, context, ...} =>
   595             CONVERSION (right_hand_set_comprehension_conv (K
   585             CONVERSION (right_hand_set_comprehension_conv (K
   596               (conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_TrueI})) Conv.all_conv
   586               (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_TrueI})) Conv.all_conv
   597                then_conv
   587                then_conv
   598                rewr_conv' @{lemma "(True & P) = P" by simp})) context) 1) ctxt 1
   588                rewr_conv' @{lemma "(True & P) = P" by simp})) context) 1) ctxt 1
   599           THEN tac ctxt cont
   589           THEN tac ctxt cont
   600           THEN rtac @{thm impI} 1
   590           THEN rtac @{thm impI} 1
   601           THEN Subgoal.FOCUS (fn {prems, context, ...} =>
   591           THEN Subgoal.FOCUS (fn {prems, context, ...} =>
   602               CONVERSION (right_hand_set_comprehension_conv (K
   592               CONVERSION (right_hand_set_comprehension_conv (K
   603                 (conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_FalseI})) Conv.all_conv
   593                 (HOLogic.conj_conv (Conv.rewr_conv (List.last prems RS @{thm Eq_FalseI})) Conv.all_conv
   604                  then_conv rewr_conv' @{lemma "(False & P) = False" by simp})) context) 1) ctxt 1
   594                  then_conv rewr_conv' @{lemma "(False & P) = False" by simp})) context) 1) ctxt 1
   605           THEN rtac set_Nil_I 1
   595           THEN rtac set_Nil_I 1
   606       | tac ctxt (Case (T, i) :: cont) =
   596       | tac ctxt (Case (T, i) :: cont) =
   607           let
   597           let
   608             val info = Datatype.the_info thy (fst (dest_Type T))
   598             val info = Datatype.the_info thy (fst (dest_Type T))
   615               THEN rtac @{thm impI} 1
   605               THEN rtac @{thm impI} 1
   616               THEN (if i' = i then
   606               THEN (if i' = i then
   617                 (* continue recursively *)
   607                 (* continue recursively *)
   618                 Subgoal.FOCUS (fn {prems, context, ...} =>
   608                 Subgoal.FOCUS (fn {prems, context, ...} =>
   619                   CONVERSION (Thm.eta_conversion then_conv right_hand_set_comprehension_conv (K
   609                   CONVERSION (Thm.eta_conversion then_conv right_hand_set_comprehension_conv (K
   620                       ((conj_conv
   610                       ((HOLogic.conj_conv
   621                         (eq_conv Conv.all_conv (rewr_conv' (List.last prems)) then_conv
   611                         (HOLogic.eq_conv Conv.all_conv (rewr_conv' (List.last prems)) then_conv
   622                           (Conv.try_conv (Conv.rewrs_conv (map mk_meta_eq (#inject info)))))
   612                           (Conv.try_conv (Conv.rewrs_conv (map mk_meta_eq (#inject info)))))
   623                         Conv.all_conv)
   613                         Conv.all_conv)
   624                         then_conv (Conv.try_conv (Conv.rewr_conv del_refl_eq))
   614                         then_conv (Conv.try_conv (Conv.rewr_conv del_refl_eq))
   625                         then_conv conjunct_assoc_conv)) context
   615                         then_conv conjunct_assoc_conv)) context
   626                     then_conv (HOLogic.Trueprop_conv (eq_conv Conv.all_conv (Collect_conv (fn (_, ctxt) =>
   616                     then_conv (HOLogic.Trueprop_conv (HOLogic.eq_conv Conv.all_conv (Collect_conv (fn (_, ctxt) =>
   627                       Conv.repeat_conv
   617                       Conv.repeat_conv
   628                         (all_but_last_exists_conv
   618                         (all_but_last_exists_conv
   629                           (K (rewr_conv'
   619                           (K (rewr_conv'
   630                             @{lemma "(EX x. x = t & P x) = P t" by simp})) ctxt)) context)))) 1) ctxt 1
   620                             @{lemma "(EX x. x = t & P x) = P t" by simp})) ctxt)) context)))) 1) ctxt 1
   631                 THEN tac ctxt cont
   621                 THEN tac ctxt cont
   632               else
   622               else
   633                 Subgoal.FOCUS (fn {prems, context, ...} =>
   623                 Subgoal.FOCUS (fn {prems, context, ...} =>
   634                   CONVERSION
   624                   CONVERSION
   635                     (right_hand_set_comprehension_conv (K
   625                     (right_hand_set_comprehension_conv (K
   636                       (conj_conv
   626                       (HOLogic.conj_conv
   637                         ((eq_conv Conv.all_conv
   627                         ((HOLogic.eq_conv Conv.all_conv
   638                           (rewr_conv' (List.last prems))) then_conv
   628                           (rewr_conv' (List.last prems))) then_conv
   639                           (Conv.rewrs_conv (map (fn th => th RS @{thm Eq_FalseI}) (#distinct info))))
   629                           (Conv.rewrs_conv (map (fn th => th RS @{thm Eq_FalseI}) (#distinct info))))
   640                         Conv.all_conv then_conv
   630                         Conv.all_conv then_conv
   641                         (rewr_conv' @{lemma "(False & P) = False" by simp}))) context then_conv
   631                         (rewr_conv' @{lemma "(False & P) = False" by simp}))) context then_conv
   642                       HOLogic.Trueprop_conv
   632                       HOLogic.Trueprop_conv
   643                         (eq_conv Conv.all_conv
   633                         (HOLogic.eq_conv Conv.all_conv
   644                           (Collect_conv (fn (_, ctxt) =>
   634                           (Collect_conv (fn (_, ctxt) =>
   645                             Conv.repeat_conv
   635                             Conv.repeat_conv
   646                               (Conv.bottom_conv
   636                               (Conv.bottom_conv
   647                                 (K (rewr_conv'
   637                                 (K (rewr_conv'
   648                                   @{lemma "(EX x. P) = P" by simp})) ctxt)) context))) 1) ctxt 1
   638                                   @{lemma "(EX x. P) = P" by simp})) ctxt)) context))) 1) ctxt 1