src/HOL/Tools/BNF/bnf_fp_def_sugar.ML
changeset 60801 7664e0916eec
parent 60784 4f590c08fd5d
child 61101 7b915ca69af1
equal deleted inserted replaced
60799:57dd0b45fc21 60801:7664e0916eec
  1836             if n = 1 then @{const True}
  1836             if n = 1 then @{const True}
  1837             else Library.foldr1 HOLogic.mk_conj (seq_conds mk_maybe_not n k cps));
  1837             else Library.foldr1 HOLogic.mk_conj (seq_conds mk_maybe_not n k cps));
  1838 
  1838 
  1839         val goalss = @{map 6} (map2 oooo mk_goal) cs cpss gcorecs ns kss discss;
  1839         val goalss = @{map 6} (map2 oooo mk_goal) cs cpss gcorecs ns kss discss;
  1840 
  1840 
  1841         fun mk_case_split' cp = Drule.instantiate' [] [SOME (Thm.cterm_of lthy cp)] @{thm case_split};
  1841         fun mk_case_split' cp = Thm.instantiate' [] [SOME (Thm.cterm_of lthy cp)] @{thm case_split};
  1842 
  1842 
  1843         val case_splitss' = map (map mk_case_split') cpss;
  1843         val case_splitss' = map (map mk_case_split') cpss;
  1844 
  1844 
  1845         val tacss = @{map 3} (map oo mk_corec_disc_iff_tac) case_splitss' corec_thmss disc_thmsss;
  1845         val tacss = @{map 3} (map oo mk_corec_disc_iff_tac) case_splitss' corec_thmss disc_thmsss;
  1846 
  1846 
  1862 
  1862 
  1863     fun mk_corec_sel_thm corec_thm sel sel_thm =
  1863     fun mk_corec_sel_thm corec_thm sel sel_thm =
  1864       let
  1864       let
  1865         val (domT, ranT) = dest_funT (fastype_of sel);
  1865         val (domT, ranT) = dest_funT (fastype_of sel);
  1866         val arg_cong' =
  1866         val arg_cong' =
  1867           Drule.instantiate' (map (SOME o Thm.ctyp_of lthy) [domT, ranT])
  1867           Thm.instantiate' (map (SOME o Thm.ctyp_of lthy) [domT, ranT])
  1868             [NONE, NONE, SOME (Thm.cterm_of lthy sel)] arg_cong
  1868             [NONE, NONE, SOME (Thm.cterm_of lthy sel)] arg_cong
  1869           |> Thm.varifyT_global;
  1869           |> Thm.varifyT_global;
  1870         val sel_thm' = sel_thm RSN (2, trans);
  1870         val sel_thm' = sel_thm RSN (2, trans);
  1871       in
  1871       in
  1872         corec_thm RS arg_cong' RS sel_thm'
  1872         corec_thm RS arg_cong' RS sel_thm'