src/HOL/BNF/Tools/bnf_def.ML
changeset 53561 92bcac4f9ac9
parent 53290 b6c3be868217
child 54045 369a4a14583a
equal deleted inserted replaced
53560:4b5f42cfa244 53561:92bcac4f9ac9
   768     val bnf_sets_Bs = map (mk_bnf_t Bs') bnf_sets;
   768     val bnf_sets_Bs = map (mk_bnf_t Bs') bnf_sets;
   769     val bnf_bd_As = mk_bnf_t As' bnf_bd;
   769     val bnf_bd_As = mk_bnf_t As' bnf_bd;
   770     val bnf_wit_As = map (apsnd (mk_bnf_t As')) bnf_wits;
   770     val bnf_wit_As = map (apsnd (mk_bnf_t As')) bnf_wits;
   771 
   771 
   772     val pre_names_lthy = lthy;
   772     val pre_names_lthy = lthy;
   773     val (((((((((((((((((((((((((fs, gs), hs), x), y), (z, z')), zs), ys), As),
   773     val ((((((((((((((((((((((((fs, gs), hs), x), y), zs), ys), As),
   774       As_copy), Xs), B1s), B2s), f1s), f2s), e1s), e2s), p1s), p2s), bs), (Rs, Rs')), Rs_copy), Ss),
   774       As_copy), Xs), B1s), B2s), f1s), f2s), e1s), e2s), p1s), p2s), bs), (Rs, Rs')), Rs_copy), Ss),
   775       transfer_domRs), transfer_ranRs), names_lthy) = pre_names_lthy
   775       transfer_domRs), transfer_ranRs), names_lthy) = pre_names_lthy
   776       |> mk_Frees "f" (map2 (curry op -->) As' Bs')
   776       |> mk_Frees "f" (map2 (curry op -->) As' Bs')
   777       ||>> mk_Frees "g" (map2 (curry op -->) Bs' Cs)
   777       ||>> mk_Frees "g" (map2 (curry op -->) Bs' Cs)
   778       ||>> mk_Frees "h" (map2 (curry op -->) As' Ts)
   778       ||>> mk_Frees "h" (map2 (curry op -->) As' Ts)
   779       ||>> yield_singleton (mk_Frees "x") CA'
   779       ||>> yield_singleton (mk_Frees "x") CA'
   780       ||>> yield_singleton (mk_Frees "y") CB'
   780       ||>> yield_singleton (mk_Frees "y") CB'
   781       ||>> yield_singleton (apfst (op ~~) oo mk_Frees' "z") CRs'
       
   782       ||>> mk_Frees "z" As'
   781       ||>> mk_Frees "z" As'
   783       ||>> mk_Frees "y" Bs'
   782       ||>> mk_Frees "y" Bs'
   784       ||>> mk_Frees "A" (map HOLogic.mk_setT As')
   783       ||>> mk_Frees "A" (map HOLogic.mk_setT As')
   785       ||>> mk_Frees "A" (map HOLogic.mk_setT As')
   784       ||>> mk_Frees "A" (map HOLogic.mk_setT As')
   786       ||>> mk_Frees "A" (map HOLogic.mk_setT domTs)
   785       ||>> mk_Frees "A" (map HOLogic.mk_setT domTs)
  1091             |> Thm.close_derivation
  1090             |> Thm.close_derivation
  1092           end;
  1091           end;
  1093 
  1092 
  1094         val map_wppull = Lazy.lazy mk_map_wppull;
  1093         val map_wppull = Lazy.lazy mk_map_wppull;
  1095 
  1094 
  1096         val rel_OO_Grps = no_refl [#rel_OO_Grp axioms];
  1095         val rel_OO_Grp = #rel_OO_Grp axioms;
       
  1096         val rel_OO_Grps = no_refl [rel_OO_Grp];
  1097 
  1097 
  1098         fun mk_rel_Grp () =
  1098         fun mk_rel_Grp () =
  1099           let
  1099           let
  1100             val lhs = Term.list_comb (rel, map2 mk_Grp As fs);
  1100             val lhs = Term.list_comb (rel, map2 mk_Grp As fs);
  1101             val rhs = mk_Grp (mk_in As bnf_sets_As CA') (Term.list_comb (bnf_map_AsBs, fs));
  1101             val rhs = mk_Grp (mk_in As bnf_sets_As CA') (Term.list_comb (bnf_map_AsBs, fs));
  1180             |> Thm.close_derivation
  1180             |> Thm.close_derivation
  1181           end;
  1181           end;
  1182 
  1182 
  1183         val rel_OO = Lazy.lazy mk_rel_OO;
  1183         val rel_OO = Lazy.lazy mk_rel_OO;
  1184 
  1184 
  1185         fun mk_in_rel () =
  1185         fun mk_in_rel () = trans OF [rel_OO_Grp, @{thm OO_Grp_alt}] RS @{thm predicate2_eqD};
  1186           let
       
  1187             val bnf_in = mk_in setRs (map (mk_bnf_t RTs) bnf_sets) CRs';
       
  1188             val map1 = Term.list_comb (mk_bnf_map RTs As', map fst_const RTs);
       
  1189             val map2 = Term.list_comb (mk_bnf_map RTs Bs', map snd_const RTs);
       
  1190             val map_fst_eq = HOLogic.mk_eq (map1 $ z, x);
       
  1191             val map_snd_eq = HOLogic.mk_eq (map2 $ z, y);
       
  1192             val lhs = Term.list_comb (rel, Rs) $ x $ y;
       
  1193             val rhs =
       
  1194               HOLogic.mk_exists (fst z', snd z', HOLogic.mk_conj (HOLogic.mk_mem (z, bnf_in),
       
  1195                 HOLogic.mk_conj (map_fst_eq, map_snd_eq)));
       
  1196             val goal =
       
  1197               fold_rev Logic.all (x :: y :: Rs) (mk_Trueprop_eq (lhs, rhs));
       
  1198           in
       
  1199             Goal.prove_sorry lthy [] [] goal (mk_in_rel_tac (the_single rel_OO_Grps))
       
  1200             |> Thm.close_derivation
       
  1201           end;
       
  1202 
  1186 
  1203         val in_rel = Lazy.lazy mk_in_rel;
  1187         val in_rel = Lazy.lazy mk_in_rel;
  1204 
  1188 
  1205         fun mk_rel_flip () =
  1189         fun mk_rel_flip () =
  1206           let
  1190           let