equal
deleted
inserted
replaced
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' |