src/HOL/Tools/BNF/bnf_lfp.ML
changeset 67399 eab6ce8368fa
parent 67091 1393c2340eec
child 67405 e9ab4ad7bd15
equal deleted inserted replaced
67398:5eb932e604a2 67399:eab6ce8368fa
   535       lthy
   535       lthy
   536       |> mk_Frees "B" BTs
   536       |> mk_Frees "B" BTs
   537       ||>> mk_Frees "s" sTs
   537       ||>> mk_Frees "s" sTs
   538       ||>> mk_Frees "i" (replicate n suc_bdT)
   538       ||>> mk_Frees "i" (replicate n suc_bdT)
   539       ||>> (fn ctxt => apfst the_single (mk_fresh_names ctxt 1 "Asi"))
   539       ||>> (fn ctxt => apfst the_single (mk_fresh_names ctxt 1 "Asi"))
   540       ||>> yield_singleton (apfst (op ~~) oo mk_Frees' "i") suc_bdT
   540       ||>> yield_singleton (apfst (~~) oo mk_Frees' "i") suc_bdT
   541       ||>> yield_singleton (apfst (op ~~) oo mk_Frees' "j") suc_bdT;
   541       ||>> yield_singleton (apfst (~~) oo mk_Frees' "j") suc_bdT;
   542 
   542 
   543     val suc_bd_limit_thm =
   543     val suc_bd_limit_thm =
   544       let
   544       let
   545         val prem = HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj
   545         val prem = HOLogic.mk_Trueprop (Library.foldr1 HOLogic.mk_conj
   546           (map (fn idx => HOLogic.mk_mem (idx, field_suc_bd)) idxs));
   546           (map (fn idx => HOLogic.mk_mem (idx, field_suc_bd)) idxs));
   762 
   762 
   763     val ((((II_Bs, II_ss), (iidx, iidx')), init_xFs), _) =
   763     val ((((II_Bs, II_ss), (iidx, iidx')), init_xFs), _) =
   764       lthy
   764       lthy
   765       |> mk_Frees "IIB" II_BTs
   765       |> mk_Frees "IIB" II_BTs
   766       ||>> mk_Frees "IIs" II_sTs
   766       ||>> mk_Frees "IIs" II_sTs
   767       ||>> yield_singleton (apfst (op ~~) oo mk_Frees' "i") IIT
   767       ||>> yield_singleton (apfst (~~) oo mk_Frees' "i") IIT
   768       ||>> mk_Frees "x" init_FTs;
   768       ||>> mk_Frees "x" init_FTs;
   769 
   769 
   770     val II = HOLogic.mk_Collect (fst iidx', IIT, list_exists_free (II_Bs @ II_ss)
   770     val II = HOLogic.mk_Collect (fst iidx', IIT, list_exists_free (II_Bs @ II_ss)
   771       (HOLogic.mk_conj (HOLogic.mk_eq (iidx,
   771       (HOLogic.mk_conj (HOLogic.mk_eq (iidx,
   772         Abs_IIT $ (HOLogic.mk_prod (HOLogic.mk_tuple II_Bs, HOLogic.mk_tuple II_ss))),
   772         Abs_IIT $ (HOLogic.mk_prod (HOLogic.mk_tuple II_Bs, HOLogic.mk_tuple II_ss))),
   814         init_fs_copy), init_phis), _) =
   814         init_fs_copy), init_phis), _) =
   815       lthy
   815       lthy
   816       |> mk_Frees "B" BTs
   816       |> mk_Frees "B" BTs
   817       ||>> mk_Frees "s" sTs
   817       ||>> mk_Frees "s" sTs
   818       ||>> mk_Frees "f" (map (fn T => Asuc_bdT --> T) activeAs)
   818       ||>> mk_Frees "f" (map (fn T => Asuc_bdT --> T) activeAs)
   819       ||>> yield_singleton (apfst (op ~~) oo mk_Frees' "i") IIT
   819       ||>> yield_singleton (apfst (~~) oo mk_Frees' "i") IIT
   820       ||>> mk_Frees "ix" active_initTs
   820       ||>> mk_Frees "ix" active_initTs
   821       ||>> mk_Frees' "x" init_FTs
   821       ||>> mk_Frees' "x" init_FTs
   822       ||>> mk_Frees "f" init_fTs
   822       ||>> mk_Frees "f" init_fTs
   823       ||>> mk_Frees "f" init_fTs
   823       ||>> mk_Frees "f" init_fTs
   824       ||>> mk_Frees "P" (replicate n (mk_pred1T initT));
   824       ||>> mk_Frees "P" (replicate n (mk_pred1T initT));
   939     val foldT = Library.foldr1 HOLogic.mk_prodT (map2 (curry op -->) Ts activeAs);
   939     val foldT = Library.foldr1 HOLogic.mk_prodT (map2 (curry op -->) Ts activeAs);
   940 
   940 
   941     val ((ss, (fold_f, fold_f')), _) =
   941     val ((ss, (fold_f, fold_f')), _) =
   942       lthy
   942       lthy
   943       |> mk_Frees "s" sTs
   943       |> mk_Frees "s" sTs
   944       ||>> yield_singleton (apfst (op ~~) oo mk_Frees' "f") foldT;
   944       ||>> yield_singleton (apfst (~~) oo mk_Frees' "f") foldT;
   945 
   945 
   946     fun ctor_bind i = nth external_bs (i - 1) |> Binding.prefix_name (ctorN ^ "_");
   946     fun ctor_bind i = nth external_bs (i - 1) |> Binding.prefix_name (ctorN ^ "_");
   947     val ctor_def_bind = rpair [] o Binding.concealed o Thm.def_binding o ctor_bind;
   947     val ctor_def_bind = rpair [] o Binding.concealed o Thm.def_binding o ctor_bind;
   948 
   948 
   949     fun ctor_spec abs str map_FT_init =
   949     fun ctor_spec abs str map_FT_init =
  1277         fun mk_fun_insts T ix = Thm.cterm_of lthy (Var (ix, T --> T));
  1277         fun mk_fun_insts T ix = Thm.cterm_of lthy (Var (ix, T --> T));
  1278         val theta =
  1278         val theta =
  1279           (funs ~~ @{map 2} mk_fun_insts Ts funs) @ (algs ~~ map (Thm.cterm_of lthy) ctors);
  1279           (funs ~~ @{map 2} mk_fun_insts Ts funs) @ (algs ~~ map (Thm.cterm_of lthy) ctors);
  1280         val ctor_fold_ctors = (ctor_fold_unique_thm OF
  1280         val ctor_fold_ctors = (ctor_fold_unique_thm OF
  1281           map (fn thm => mk_trans @{thm id_o} (mk_sym (thm RS
  1281           map (fn thm => mk_trans @{thm id_o} (mk_sym (thm RS
  1282             @{thm trans[OF arg_cong2[of _ _ _ _ "op \<circ>", OF refl] o_id]}))) map_id0s)
  1282             @{thm trans[OF arg_cong2[of _ _ _ _ "(\<circ>)", OF refl] o_id]}))) map_id0s)
  1283           |> split_conj_thm |> map mk_sym;
  1283           |> split_conj_thm |> map mk_sym;
  1284       in
  1284       in
  1285         infer_instantiate lthy theta ctor_fold_unique_thm
  1285         infer_instantiate lthy theta ctor_fold_unique_thm
  1286         |> unfold_thms lthy ctor_fold_ctors
  1286         |> unfold_thms lthy ctor_fold_ctors
  1287         |> Morphism.thm (Local_Theory.target_morphism lthy)
  1287         |> Morphism.thm (Local_Theory.target_morphism lthy)