src/HOL/Tools/BNF/bnf_lfp_tactics.ML
changeset 55541 fd9ea8ae28f6
parent 55414 eab03e9cee8a
child 55756 565a20b22f09
equal deleted inserted replaced
55540:892a425c5eaa 55541:fd9ea8ae28f6
    87 val trans_fun_cong_image_id_id_apply = @{thm trans[OF fun_cong[OF image_id] id_apply]};
    87 val trans_fun_cong_image_id_id_apply = @{thm trans[OF fun_cong[OF image_id] id_apply]};
    88 val rev_bspec = Drule.rotate_prems 1 bspec;
    88 val rev_bspec = Drule.rotate_prems 1 bspec;
    89 val Un_cong = @{thm arg_cong2[of _ _ _ _ "op \<union>"]}
    89 val Un_cong = @{thm arg_cong2[of _ _ _ _ "op \<union>"]}
    90 
    90 
    91 fun mk_alg_set_tac alg_def =
    91 fun mk_alg_set_tac alg_def =
    92   dtac (alg_def RS iffD1) 1 THEN
    92   EVERY' [dtac (alg_def RS iffD1), REPEAT_DETERM o etac conjE, etac bspec, rtac CollectI,
    93   REPEAT_DETERM (etac conjE 1) THEN
    93    REPEAT_DETERM o (rtac (subset_UNIV RS conjI) ORELSE' etac conjI), atac] 1;
    94   EVERY' [etac bspec, rtac CollectI] 1 THEN
       
    95   REPEAT_DETERM (etac conjI 1) THEN atac 1;
       
    96 
    94 
    97 fun mk_alg_not_empty_tac ctxt alg_set alg_sets wits =
    95 fun mk_alg_not_empty_tac ctxt alg_set alg_sets wits =
    98   (EVERY' [rtac notI, hyp_subst_tac ctxt, ftac alg_set] THEN'
    96   (EVERY' [rtac notI, hyp_subst_tac ctxt, ftac alg_set] THEN'
    99   REPEAT_DETERM o FIRST'
    97   REPEAT_DETERM o FIRST'
   100     [rtac subset_UNIV,
    98     [EVERY' [rtac @{thm subset_emptyI}, eresolve_tac wits],
   101     EVERY' [rtac @{thm subset_emptyI}, eresolve_tac wits],
       
   102     EVERY' [rtac subsetI, rtac FalseE, eresolve_tac wits],
    99     EVERY' [rtac subsetI, rtac FalseE, eresolve_tac wits],
   103     EVERY' [rtac subsetI, dresolve_tac wits, hyp_subst_tac ctxt,
   100     EVERY' [rtac subsetI, dresolve_tac wits, hyp_subst_tac ctxt,
   104       FIRST' (map (fn thm => rtac thm THEN' atac) alg_sets)]] THEN'
   101       FIRST' (map (fn thm => rtac thm THEN' atac) alg_sets)]] THEN'
   105   etac @{thm emptyE}) 1;
   102   etac @{thm emptyE}) 1;
   106 
   103 
   218           etac @{thm image_mono}, rtac equalityD1, etac @{thm bij_betw_imageE}];
   215           etac @{thm image_mono}, rtac equalityD1, etac @{thm bij_betw_imageE}];
   219     val copy_str_tac =
   216     val copy_str_tac =
   220       CONJ_WRAP' (fn (thms, thm) =>
   217       CONJ_WRAP' (fn (thms, thm) =>
   221         EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac set_mp,
   218         EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac set_mp,
   222           rtac equalityD1, etac @{thm bij_betw_imageE}, rtac imageI, etac thm,
   219           rtac equalityD1, etac @{thm bij_betw_imageE}, rtac imageI, etac thm,
   223           REPEAT_DETERM o rtac subset_UNIV, REPEAT_DETERM_N n o (set_tac thms)])
   220           REPEAT_DETERM_N n o set_tac thms])
   224       (set_maps ~~ alg_sets);
   221       (set_maps ~~ alg_sets);
   225   in
   222   in
   226     (rtac rev_mp THEN' DETERM o bij_betw_inv_tac THEN' rtac impI THEN'
   223     (rtac rev_mp THEN' DETERM o bij_betw_inv_tac THEN' rtac impI THEN'
   227     stac alg_def THEN' copy_str_tac) 1
   224     stac alg_def THEN' copy_str_tac) 1
   228   end;
   225   end;
   236         REPEAT_DETERM o etac conjE, etac @{thm image_mono},
   233         REPEAT_DETERM o etac conjE, etac @{thm image_mono},
   237         rtac equalityD1, etac @{thm bij_betw_imageE}];
   234         rtac equalityD1, etac @{thm bij_betw_imageE}];
   238     val mor_tac =
   235     val mor_tac =
   239       CONJ_WRAP' (fn (thms, thm) =>
   236       CONJ_WRAP' (fn (thms, thm) =>
   240         EVERY' [rtac ballI, etac CollectE, etac @{thm inverE}, etac thm,
   237         EVERY' [rtac ballI, etac CollectE, etac @{thm inverE}, etac thm,
   241           REPEAT_DETERM o rtac subset_UNIV, REPEAT_DETERM_N n o (set_tac thms)])
   238           REPEAT_DETERM_N n o set_tac thms])
   242       (set_maps ~~ alg_sets);
   239       (set_maps ~~ alg_sets);
   243   in
   240   in
   244     (rtac (iso_alt RS iffD2) THEN'
   241     (rtac (iso_alt RS iffD2) THEN'
   245     etac copy_str THEN' REPEAT_DETERM o atac THEN'
   242     etac copy_str THEN' REPEAT_DETERM o atac THEN'
   246     rtac conjI THEN' stac mor_def THEN' rtac conjI THEN' fbetw_tac THEN' mor_tac THEN'
   243     rtac conjI THEN' stac mor_def THEN' rtac conjI THEN' fbetw_tac THEN' mor_tac THEN'
   338       dtac mp, etac @{thm underS_Field}, REPEAT_DETERM o etac conjE, atac];
   335       dtac mp, etac @{thm underS_Field}, REPEAT_DETERM o etac conjE, atac];
   339 
   336 
   340     fun mk_minH_tac (min_alg, alg_set) = EVERY' [rtac ord_eq_le_trans, etac min_alg,
   337     fun mk_minH_tac (min_alg, alg_set) = EVERY' [rtac ord_eq_le_trans, etac min_alg,
   341       rtac @{thm Un_least}, minG_tac, rtac @{thm image_subsetI},
   338       rtac @{thm Un_least}, minG_tac, rtac @{thm image_subsetI},
   342       REPEAT_DETERM o eresolve_tac [CollectE, conjE], etac alg_set,
   339       REPEAT_DETERM o eresolve_tac [CollectE, conjE], etac alg_set,
   343       REPEAT_DETERM o FIRST' [atac, etac subset_trans THEN' minG_tac]];
   340       REPEAT_DETERM o (etac subset_trans THEN' minG_tac)];
   344   in
   341   in
   345     (rtac induct THEN'
   342     (rtac induct THEN'
   346     rtac impI THEN'
   343     rtac impI THEN'
   347     CONJ_WRAP' mk_minH_tac (min_algs ~~ alg_sets)) 1
   344     CONJ_WRAP' mk_minH_tac (min_algs ~~ alg_sets)) 1
   348   end;
   345   end;
   395     val mor_tac =
   392     val mor_tac =
   396       CONJ_WRAP' (fn thm => EVERY' [rtac ballI, rtac thm]) str_init_defs;
   393       CONJ_WRAP' (fn thm => EVERY' [rtac ballI, rtac thm]) str_init_defs;
   397     fun alg_epi_tac ((alg_set, str_init_def), set_map) =
   394     fun alg_epi_tac ((alg_set, str_init_def), set_map) =
   398       EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac CollectI,
   395       EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac CollectI,
   399         rtac ballI, ftac (alg_select RS bspec), stac str_init_def, etac alg_set,
   396         rtac ballI, ftac (alg_select RS bspec), stac str_init_def, etac alg_set,
   400         REPEAT_DETERM o FIRST' [rtac subset_UNIV,
   397         REPEAT_DETERM o EVERY' [rtac ord_eq_le_trans, resolve_tac set_map, rtac subset_trans,
   401           EVERY' [rtac ord_eq_le_trans, resolve_tac set_map, rtac subset_trans,
   398             etac @{thm image_mono}, rtac @{thm image_Collect_subsetI}, etac bspec, atac]];
   402             etac @{thm image_mono}, rtac @{thm image_Collect_subsetI}, etac bspec, atac]]];
       
   403   in
   399   in
   404     (rtac mor_cong THEN' REPEAT_DETERM_N n o (rtac sym THEN' rtac @{thm comp_id}) THEN'
   400     (rtac mor_cong THEN' REPEAT_DETERM_N n o (rtac sym THEN' rtac @{thm comp_id}) THEN'
   405     rtac (Thm.permute_prems 0 1 mor_comp) THEN' etac (Thm.permute_prems 0 1 mor_comp) THEN'
   401     rtac (Thm.permute_prems 0 1 mor_comp) THEN' etac (Thm.permute_prems 0 1 mor_comp) THEN'
   406     stac mor_def THEN' rtac conjI THEN' fbetw_tac THEN' mor_tac THEN' rtac mor_incl_min_alg THEN'
   402     stac mor_def THEN' rtac conjI THEN' fbetw_tac THEN' mor_tac THEN' rtac mor_incl_min_alg THEN'
   407     stac alg_def THEN' CONJ_WRAP' alg_epi_tac ((alg_sets ~~ str_init_defs) ~~ set_maps)) 1
   403     stac alg_def THEN' CONJ_WRAP' alg_epi_tac ((alg_sets ~~ str_init_defs) ~~ set_maps)) 1
   446       REPEAT_DETERM_N m o rtac refl,
   442       REPEAT_DETERM_N m o rtac refl,
   447       REPEAT_DETERM_N n o (etac @{thm prop_restrict} THEN' atac)];
   443       REPEAT_DETERM_N n o (etac @{thm prop_restrict} THEN' atac)];
   448 
   444 
   449     fun mk_alg_tac (alg_set, (in_mono, (morE, map_cong0))) = EVERY' [rtac ballI, rtac CollectI,
   445     fun mk_alg_tac (alg_set, (in_mono, (morE, map_cong0))) = EVERY' [rtac ballI, rtac CollectI,
   450       REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac conjI, rtac (alg_min_alg RS alg_set),
   446       REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac conjI, rtac (alg_min_alg RS alg_set),
   451       REPEAT_DETERM_N m o rtac subset_UNIV,
       
   452       REPEAT_DETERM_N n o (etac subset_trans THEN' rtac @{thm Collect_restrict}),
   447       REPEAT_DETERM_N n o (etac subset_trans THEN' rtac @{thm Collect_restrict}),
   453       rtac trans, mor_tac morE in_mono,
   448       rtac trans, mor_tac morE in_mono,
   454       rtac trans, cong_tac map_cong0,
   449       rtac trans, cong_tac map_cong0,
   455       rtac sym, mor_tac morE in_mono];
   450       rtac sym, mor_tac morE in_mono];
   456 
   451 
   466   let
   461   let
   467     val n = length least_min_algs;
   462     val n = length least_min_algs;
   468 
   463 
   469     fun mk_alg_tac alg_set = EVERY' [rtac ballI, rtac CollectI,
   464     fun mk_alg_tac alg_set = EVERY' [rtac ballI, rtac CollectI,
   470       REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac conjI, rtac (alg_min_alg RS alg_set),
   465       REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac conjI, rtac (alg_min_alg RS alg_set),
   471       REPEAT_DETERM_N m o rtac subset_UNIV,
       
   472       REPEAT_DETERM_N n o (etac subset_trans THEN' rtac @{thm Collect_restrict}),
   466       REPEAT_DETERM_N n o (etac subset_trans THEN' rtac @{thm Collect_restrict}),
   473       rtac mp, etac bspec, rtac CollectI,
   467       rtac mp, etac bspec, rtac CollectI,
   474       REPEAT_DETERM_N m o (rtac conjI THEN' atac),
   468       REPEAT_DETERM_N m o (rtac conjI THEN' atac),
   475       CONJ_WRAP' (K (etac subset_trans THEN' rtac @{thm Collect_restrict})) alg_sets,
   469       CONJ_WRAP' (K (etac subset_trans THEN' rtac @{thm Collect_restrict})) alg_sets,
   476       CONJ_WRAP' (K (rtac ballI THEN' etac @{thm prop_restrict} THEN' atac)) alg_sets];
   470       CONJ_WRAP' (K (rtac ballI THEN' etac @{thm prop_restrict} THEN' atac)) alg_sets];