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 |