FSet.thy
changeset 285 8ebdef196fd5
parent 276 783d6c940e45
child 289 7e8617f20b59
child 290 a0be84b0c707
equal deleted inserted replaced
284:78bc4d9d7975 285:8ebdef196fd5
   315   @ @{thms ho_all_prs ho_ex_prs} *}
   315   @ @{thms ho_all_prs ho_ex_prs} *}
   316 
   316 
   317 ML {* fun lift_thm_fset lthy t = lift_thm lthy qty "fset" rsp_thms defs t *}
   317 ML {* fun lift_thm_fset lthy t = lift_thm lthy qty "fset" rsp_thms defs t *}
   318 
   318 
   319 (* ML {* lift_thm_fset @{context} @{thm neq_Nil_conv} *} *)
   319 (* ML {* lift_thm_fset @{context} @{thm neq_Nil_conv} *} *)
   320 
       
   321 
       
   322 
       
   323 ML {* lift_thm_fset @{context} @{thm m1} *}
   320 ML {* lift_thm_fset @{context} @{thm m1} *}
   324 ML {* lift_thm_fset @{context} @{thm m2} *}
   321 ML {* lift_thm_fset @{context} @{thm m2} *}
   325 ML {* lift_thm_fset @{context} @{thm list_eq.intros(4)} *}
   322 ML {* lift_thm_fset @{context} @{thm list_eq.intros(4)} *}
   326 ML {* lift_thm_fset @{context} @{thm list_eq.intros(5)} *}
   323 ML {* lift_thm_fset @{context} @{thm list_eq.intros(5)} *}
   327 ML {* lift_thm_fset @{context} @{thm card1_suc} *}
   324 ML {* lift_thm_fset @{context} @{thm card1_suc} *}
   349 ML {* val defs_sym = add_lower_defs @{context} defs *}
   346 ML {* val defs_sym = add_lower_defs @{context} defs *}
   350 ML {* val (rty, rel, rel_refl, rel_eqv) = lookup_quot_data @{context} qty *}
   347 ML {* val (rty, rel, rel_refl, rel_eqv) = lookup_quot_data @{context} qty *}
   351 ML {* val (trans2, reps_same, absrep, quot) = lookup_quot_thms @{context} "fset" *}
   348 ML {* val (trans2, reps_same, absrep, quot) = lookup_quot_thms @{context} "fset" *}
   352 
   349 
   353 
   350 
   354 ML {* val ind_r_a = atomize_thm @{thm map_append} *}
   351 ML {* val t_a = atomize_thm @{thm map_append} *}
   355  prove {* build_regularize_goal ind_r_a rty rel @{context}  *}
   352 (* prove {* build_regularize_goal t_a rty rel @{context}  *}
   356  ML_prf {*  fun tac ctxt =
   353  ML_prf {*  fun tac ctxt = FIRST' [
   357      (FIRST' [
       
   358       rtac rel_refl,
   354       rtac rel_refl,
   359       atac,
   355       atac,
   360       rtac @{thm get_rid},
   356       rtac @{thm universal_twice},
   361       rtac @{thm get_rid2},
   357       (rtac @{thm impI} THEN' atac),
   362       (fn i => CHANGED (asm_full_simp_tac ((Simplifier.context ctxt HOL_ss) addsimps
   358       rtac @{thm implication_twice},
       
   359       (*rtac @{thm equality_twice},*)
       
   360       EqSubst.eqsubst_tac ctxt [0]
   363         [(@{thm equiv_res_forall} OF [rel_eqv]),
   361         [(@{thm equiv_res_forall} OF [rel_eqv]),
   364          (@{thm equiv_res_exists} OF [rel_eqv])]) i)),
   362          (@{thm equiv_res_exists} OF [rel_eqv])],
   365       (rtac @{thm impI} THEN' (asm_full_simp_tac (Simplifier.context ctxt HOL_ss)) THEN' rtac rel_refl),
   363       (rtac @{thm impI} THEN' (asm_full_simp_tac (Simplifier.context ctxt HOL_ss)) THEN' rtac rel_refl),
   366       (rtac @{thm RIGHT_RES_FORALL_REGULAR})
   364       (rtac @{thm RIGHT_RES_FORALL_REGULAR})
   367     ]);
   365      ]; *}
   368  *}
       
   369   apply (atomize(full))
   366   apply (atomize(full))
   370   apply (tactic {* tac @{context} 1 *}) *)
   367   apply (tactic {* REPEAT_ALL_NEW (tac @{context}) 1 *})
   371 ML {* val ind_r_r = regularize ind_r_a rty rel rel_eqv rel_refl @{context} *}
   368   done*)
       
   369 
       
   370 ML {* val t_r = regularize t_a rty rel rel_eqv rel_refl @{context} *}
   372 ML {*
   371 ML {*
   373   val rt = build_repabs_term @{context} ind_r_r consts rty qty
   372   val rt = build_repabs_term @{context} t_r consts rty qty
   374   val rg = Logic.mk_equals ((Thm.prop_of ind_r_r), rt);
   373   val rg = Logic.mk_equals ((Thm.prop_of t_r), rt);
   375 *}
   374 *}
       
   375 
       
   376 ML {* val ttt = snd (dest_Free (term_of @{cpat "f :: ?'a list \<Rightarrow> ?'a list"})) *}
       
   377 ML {* old_get_fun repF @{typ "'a list"} @{typ "'a fset"} @{context} @{typ "'a list \<Rightarrow> 'a list"} *}
       
   378 
   376 prove rg
   379 prove rg
   377 apply(atomize(full))
   380 apply(atomize(full))
   378 ML_prf {* fun r_mk_comb_tac_fset lthy = r_mk_comb_tac lthy rty quot rel_refl trans2 rsp_thms *}
   381 ML_prf {* fun r_mk_comb_tac_fset lthy = r_mk_comb_tac lthy rty quot rel_refl trans2 rsp_thms *}
   379 apply (tactic {* REPEAT_ALL_NEW (r_mk_comb_tac_fset @{context}) 1 *})
   382 apply (tactic {* REPEAT_ALL_NEW (r_mk_comb_tac_fset @{context}) 1 *})
   380 done
   383 done
   381 ML {* val ind_r_t =
   384 ML {* val t_t =
   382   Toplevel.program (fn () =>
   385   Toplevel.program (fn () =>
   383   repabs @{context} ind_r_r consts rty qty quot rel_refl trans2 rsp_thms
   386   repabs @{context} t_r consts rty qty quot rel_refl trans2 rsp_thms
   384   )
   387   )
   385 *}
   388 *}
   386 
   389 
   387 ML {* val abs = findabs rty (prop_of (atomize_thm @{thm list.induct})) *}
   390 ML {* val abs = findabs rty (prop_of (atomize_thm @{thm list.induct})) *}
   388 ML {* val aps = findaps rty (prop_of (atomize_thm @{thm list.induct})) *}
   391 ML {* val aps = findaps rty (prop_of (atomize_thm @{thm list.induct})) *}
   389 ML {* val simp_lam_prs_thms = map (make_simp_prs_thm @{context} quot @{thm LAMBDA_PRS}) abs *}
   392 ML {* val lam_prs_thms = map (make_simp_prs_thm @{context} quot @{thm LAMBDA_PRS}) abs *}
   390 ML {* val ind_r_l = repeat_eqsubst_thm @{context} (simp_app_prs_thms @ simp_lam_prs_thms) ind_r_t *}
   393 ML {* val app_prs_thms = map (applic_prs @{context} rty qty absrep) aps *}
   391 ML {* val thm = @{thm FORALL_PRS[OF FUN_QUOTIENT[OF QUOTIENT_fset IDENTITY_QUOTIENT]]} *}
   394 ML {* val app_prs_thms = map Thm.freezeT app_prs_thms *}
   392 ML {* val ind_r_a = simp_allex_prs quot [thm] ind_r_l *}
   395 ML {* val t_l = repeat_eqsubst_thm @{context} (app_prs_thms @ lam_prs_thms) t_t *}
       
   396 ML {* val (alls, exs) = findallex rty qty (prop_of t_a); *}
       
   397 ML {* val allthms = map (make_allex_prs_thm @{context} quot @{thm FORALL_PRS}) alls *}
       
   398 ML {* val allthmsv = map Thm.varifyT allthms *}
       
   399 ML {* val t_a = MetaSimplifier.rewrite_rule (allthmsv) t_l *}
   393 ML {* val defs_sym = add_lower_defs @{context} defs *}
   400 ML {* val defs_sym = add_lower_defs @{context} defs *}
   394 ML {* val ind_r_d = repeat_eqsubst_thm @{context} defs_sym ind_r_a *}
   401 ML {* val t_d = repeat_eqsubst_thm @{context} defs_sym t_a *}
   395 ML {* val ind_r_s = MetaSimplifier.rewrite_rule @{thms QUOT_TYPE_I_fset.REPS_same} ind_r_d *}
   402 ML {* val t_s = MetaSimplifier.rewrite_rule @{thms QUOT_TYPE_I_fset.REPS_same} t_d *}
   396 ML {* ObjectLogic.rulify ind_r_s *}
   403 ML {* ObjectLogic.rulify t_s *}
   397 
   404 
   398 ML {*
   405 ML {*
   399   fun lift_thm_fset_note name thm lthy =
   406   fun lift_thm_fset_note name thm lthy =
   400     let
   407     let
   401       val lifted_thm = lift_thm_fset lthy thm;
   408       val lifted_thm = lift_thm_fset lthy thm;