src/HOL/Tools/BNF/bnf_def.ML
changeset 57968 00e9c6d367e7
parent 57967 e6d2e998c30f
child 57969 1e7b9579b14f
equal deleted inserted replaced
57967:e6d2e998c30f 57968:00e9c6d367e7
    72   val rel_OO_Grp_of_bnf: bnf -> thm
    72   val rel_OO_Grp_of_bnf: bnf -> thm
    73   val rel_cong_of_bnf: bnf -> thm
    73   val rel_cong_of_bnf: bnf -> thm
    74   val rel_conversep_of_bnf: bnf -> thm
    74   val rel_conversep_of_bnf: bnf -> thm
    75   val rel_mono_of_bnf: bnf -> thm
    75   val rel_mono_of_bnf: bnf -> thm
    76   val rel_mono_strong0_of_bnf: bnf -> thm
    76   val rel_mono_strong0_of_bnf: bnf -> thm
       
    77   val rel_mono_strong_of_bnf: bnf -> thm
    77   val rel_eq_of_bnf: bnf -> thm
    78   val rel_eq_of_bnf: bnf -> thm
    78   val rel_flip_of_bnf: bnf -> thm
    79   val rel_flip_of_bnf: bnf -> thm
    79   val set_bd_of_bnf: bnf -> thm list
    80   val set_bd_of_bnf: bnf -> thm list
    80   val set_defs_of_bnf: bnf -> thm list
    81   val set_defs_of_bnf: bnf -> thm list
    81   val set_map0_of_bnf: bnf -> thm list
    82   val set_map0_of_bnf: bnf -> thm list
   233   set_map: thm lazy list,
   234   set_map: thm lazy list,
   234   rel_cong: thm lazy,
   235   rel_cong: thm lazy,
   235   rel_map: thm list lazy,
   236   rel_map: thm list lazy,
   236   rel_mono: thm lazy,
   237   rel_mono: thm lazy,
   237   rel_mono_strong0: thm lazy,
   238   rel_mono_strong0: thm lazy,
       
   239   rel_mono_strong: thm lazy,
   238   rel_Grp: thm lazy,
   240   rel_Grp: thm lazy,
   239   rel_conversep: thm lazy,
   241   rel_conversep: thm lazy,
   240   rel_OO: thm lazy
   242   rel_OO: thm lazy
   241 };
   243 };
   242 
   244 
   243 fun mk_facts bd_Card_order bd_Cinfinite bd_Cnotzero collect_set_map in_bd in_cong in_mono in_rel
   245 fun mk_facts bd_Card_order bd_Cinfinite bd_Cnotzero collect_set_map in_bd in_cong in_mono in_rel
   244     inj_map map_comp map_cong map_id map_ident0 map_ident map_transfer rel_eq rel_flip set_map
   246     inj_map map_comp map_cong map_id map_ident0 map_ident map_transfer rel_eq rel_flip set_map
   245     rel_cong rel_map rel_mono rel_mono_strong0 rel_Grp rel_conversep rel_OO = {
   247     rel_cong rel_map rel_mono rel_mono_strong0 rel_mono_strong rel_Grp rel_conversep rel_OO = {
   246   bd_Card_order = bd_Card_order,
   248   bd_Card_order = bd_Card_order,
   247   bd_Cinfinite = bd_Cinfinite,
   249   bd_Cinfinite = bd_Cinfinite,
   248   bd_Cnotzero = bd_Cnotzero,
   250   bd_Cnotzero = bd_Cnotzero,
   249   collect_set_map = collect_set_map,
   251   collect_set_map = collect_set_map,
   250   in_bd = in_bd,
   252   in_bd = in_bd,
   263   set_map = set_map,
   265   set_map = set_map,
   264   rel_cong = rel_cong,
   266   rel_cong = rel_cong,
   265   rel_map = rel_map,
   267   rel_map = rel_map,
   266   rel_mono = rel_mono,
   268   rel_mono = rel_mono,
   267   rel_mono_strong0 = rel_mono_strong0,
   269   rel_mono_strong0 = rel_mono_strong0,
       
   270   rel_mono_strong = rel_mono_strong,
   268   rel_Grp = rel_Grp,
   271   rel_Grp = rel_Grp,
   269   rel_conversep = rel_conversep,
   272   rel_conversep = rel_conversep,
   270   rel_OO = rel_OO};
   273   rel_OO = rel_OO};
   271 
   274 
   272 fun map_facts f {
   275 fun map_facts f {
   290   set_map,
   293   set_map,
   291   rel_cong,
   294   rel_cong,
   292   rel_map,
   295   rel_map,
   293   rel_mono,
   296   rel_mono,
   294   rel_mono_strong0,
   297   rel_mono_strong0,
       
   298   rel_mono_strong,
   295   rel_Grp,
   299   rel_Grp,
   296   rel_conversep,
   300   rel_conversep,
   297   rel_OO} =
   301   rel_OO} =
   298   {bd_Card_order = f bd_Card_order,
   302   {bd_Card_order = f bd_Card_order,
   299     bd_Cinfinite = f bd_Cinfinite,
   303     bd_Cinfinite = f bd_Cinfinite,
   315     set_map = map (Lazy.map f) set_map,
   319     set_map = map (Lazy.map f) set_map,
   316     rel_cong = Lazy.map f rel_cong,
   320     rel_cong = Lazy.map f rel_cong,
   317     rel_map = Lazy.map (map f) rel_map,
   321     rel_map = Lazy.map (map f) rel_map,
   318     rel_mono = Lazy.map f rel_mono,
   322     rel_mono = Lazy.map f rel_mono,
   319     rel_mono_strong0 = Lazy.map f rel_mono_strong0,
   323     rel_mono_strong0 = Lazy.map f rel_mono_strong0,
       
   324     rel_mono_strong = Lazy.map f rel_mono_strong,
   320     rel_Grp = Lazy.map f rel_Grp,
   325     rel_Grp = Lazy.map f rel_Grp,
   321     rel_conversep = Lazy.map f rel_conversep,
   326     rel_conversep = Lazy.map f rel_conversep,
   322     rel_OO = Lazy.map f rel_OO};
   327     rel_OO = Lazy.map f rel_OO};
   323 
   328 
   324 val morph_facts = map_facts o Morphism.thm;
   329 val morph_facts = map_facts o Morphism.thm;
   444 val set_map0_of_bnf = #set_map0 o #axioms o rep_bnf;
   449 val set_map0_of_bnf = #set_map0 o #axioms o rep_bnf;
   445 val set_map_of_bnf = map Lazy.force o #set_map o #facts o rep_bnf;
   450 val set_map_of_bnf = map Lazy.force o #set_map o #facts o rep_bnf;
   446 val rel_cong_of_bnf = Lazy.force o #rel_cong o #facts o rep_bnf;
   451 val rel_cong_of_bnf = Lazy.force o #rel_cong o #facts o rep_bnf;
   447 val rel_mono_of_bnf = Lazy.force o #rel_mono o #facts o rep_bnf;
   452 val rel_mono_of_bnf = Lazy.force o #rel_mono o #facts o rep_bnf;
   448 val rel_mono_strong0_of_bnf = Lazy.force o #rel_mono_strong0 o #facts o rep_bnf;
   453 val rel_mono_strong0_of_bnf = Lazy.force o #rel_mono_strong0 o #facts o rep_bnf;
       
   454 val rel_mono_strong_of_bnf = Lazy.force o #rel_mono_strong o #facts o rep_bnf;
   449 val rel_Grp_of_bnf = Lazy.force o #rel_Grp o #facts o rep_bnf;
   455 val rel_Grp_of_bnf = Lazy.force o #rel_Grp o #facts o rep_bnf;
   450 val rel_conversep_of_bnf = Lazy.force o #rel_conversep o #facts o rep_bnf;
   456 val rel_conversep_of_bnf = Lazy.force o #rel_conversep o #facts o rep_bnf;
   451 val rel_OO_of_bnf = Lazy.force o #rel_OO o #facts o rep_bnf;
   457 val rel_OO_of_bnf = Lazy.force o #rel_OO o #facts o rep_bnf;
   452 val rel_OO_Grp_of_bnf = #rel_OO_Grp o #axioms o rep_bnf;
   458 val rel_OO_Grp_of_bnf = #rel_OO_Grp o #axioms o rep_bnf;
   453 val wit_thms_of_bnf = maps #prop o wits_of_bnf;
   459 val wit_thms_of_bnf = maps #prop o wits_of_bnf;
   614 val rel_GrpN = "rel_Grp";
   620 val rel_GrpN = "rel_Grp";
   615 val rel_conversepN = "rel_conversep";
   621 val rel_conversepN = "rel_conversep";
   616 val rel_mapN = "rel_map"
   622 val rel_mapN = "rel_map"
   617 val rel_monoN = "rel_mono"
   623 val rel_monoN = "rel_mono"
   618 val rel_mono_strong0N = "rel_mono_strong0"
   624 val rel_mono_strong0N = "rel_mono_strong0"
       
   625 val rel_mono_strongN = "rel_mono_strong"
   619 val rel_comppN = "rel_compp";
   626 val rel_comppN = "rel_compp";
   620 val rel_compp_GrpN = "rel_compp_Grp";
   627 val rel_compp_GrpN = "rel_compp_Grp";
   621 
   628 
   622 datatype inline_policy = Dont_Inline | Hardly_Inline | Smart_Inline | Do_Inline;
   629 datatype inline_policy = Dont_Inline | Hardly_Inline | Smart_Inline | Do_Inline;
   623 
   630 
   654            (in_relN, [Lazy.force (#in_rel facts)]),
   661            (in_relN, [Lazy.force (#in_rel facts)]),
   655            (inj_mapN, [Lazy.force (#inj_map facts)]),
   662            (inj_mapN, [Lazy.force (#inj_map facts)]),
   656            (map_comp0N, [#map_comp0 axioms]),
   663            (map_comp0N, [#map_comp0 axioms]),
   657            (map_transferN, [Lazy.force (#map_transfer facts)]),
   664            (map_transferN, [Lazy.force (#map_transfer facts)]),
   658            (rel_mono_strong0N, [Lazy.force (#rel_mono_strong0 facts)]),
   665            (rel_mono_strong0N, [Lazy.force (#rel_mono_strong0 facts)]),
       
   666            (rel_mono_strongN, [Lazy.force (#rel_mono_strong facts)]),
   659            (set_map0N, #set_map0 axioms),
   667            (set_map0N, #set_map0 axioms),
   660            (set_bdN, #set_bd axioms)] @
   668            (set_bdN, #set_bd axioms)] @
   661           (witNs ~~ wit_thmss_of_bnf bnf)
   669           (witNs ~~ wit_thmss_of_bnf bnf)
   662           |> map (fn (thmN, thms) =>
   670           |> map (fn (thmN, thms) =>
   663             ((qualify (Binding.qualify true (Binding.name_of bnf_b) (Binding.name thmN)), []),
   671             ((qualify (Binding.qualify true (Binding.name_of bnf_b) (Binding.name thmN)), []),
  1317             |> Thm.close_derivation
  1325             |> Thm.close_derivation
  1318           end;
  1326           end;
  1319 
  1327 
  1320         val rel_mono_strong0 = Lazy.lazy mk_rel_mono_strong0;
  1328         val rel_mono_strong0 = Lazy.lazy mk_rel_mono_strong0;
  1321 
  1329 
       
  1330         fun mk_rel_mono_strong () = Object_Logic.rulify lthy (Lazy.force rel_mono_strong0)
       
  1331 
       
  1332         val rel_mono_strong = Lazy.lazy mk_rel_mono_strong;
       
  1333 
  1322         fun mk_rel_map () =
  1334         fun mk_rel_map () =
  1323           let
  1335           let
  1324             fun mk_goal lhs rhs =
  1336             fun mk_goal lhs rhs =
  1325               fold_rev Logic.all ([x, y] @ S_CsBs @ S_AsCs @ is @ gs) (mk_Trueprop_eq (lhs, rhs));
  1337               fold_rev Logic.all ([x, y] @ S_CsBs @ S_AsCs @ is @ gs) (mk_Trueprop_eq (lhs, rhs));
  1326 
  1338 
  1366 
  1378 
  1367         val defs = mk_defs bnf_map_def bnf_set_defs bnf_rel_def;
  1379         val defs = mk_defs bnf_map_def bnf_set_defs bnf_rel_def;
  1368 
  1380 
  1369         val facts = mk_facts bd_Card_order bd_Cinfinite bd_Cnotzero collect_set_map in_bd in_cong
  1381         val facts = mk_facts bd_Card_order bd_Cinfinite bd_Cnotzero collect_set_map in_bd in_cong
  1370           in_mono in_rel inj_map map_comp map_cong map_id map_ident0 map_ident map_transfer rel_eq
  1382           in_mono in_rel inj_map map_comp map_cong map_id map_ident0 map_ident map_transfer rel_eq
  1371           rel_flip set_map rel_cong rel_map rel_mono rel_mono_strong0 rel_Grp rel_conversep rel_OO;
  1383           rel_flip set_map rel_cong rel_map rel_mono rel_mono_strong0 rel_mono_strong rel_Grp
       
  1384           rel_conversep rel_OO;
  1372 
  1385 
  1373         val wits = map2 mk_witness bnf_wits wit_thms;
  1386         val wits = map2 mk_witness bnf_wits wit_thms;
  1374 
  1387 
  1375         val bnf_rel =
  1388         val bnf_rel =
  1376           Term.subst_atomic_types ((Ds ~~ deads) @ (As' ~~ alphas) @ (Bs' ~~ betas)) rel;
  1389           Term.subst_atomic_types ((Ds ~~ deads) @ (As' ~~ alphas) @ (Bs' ~~ betas)) rel;