src/HOL/Tools/BNF/bnf_def.ML
changeset 62329 9f7fa08d2307
parent 62326 3cf7a067599c
child 62427 6dce7bf7960b
equal deleted inserted replaced
62328:532ad8de5d61 62329:9f7fa08d2307
    83   val pred_map_of_bnf: bnf -> thm
    83   val pred_map_of_bnf: bnf -> thm
    84   val pred_mono_strong0_of_bnf: bnf -> thm
    84   val pred_mono_strong0_of_bnf: bnf -> thm
    85   val pred_mono_strong_of_bnf: bnf -> thm
    85   val pred_mono_strong_of_bnf: bnf -> thm
    86   val pred_set_of_bnf: bnf -> thm
    86   val pred_set_of_bnf: bnf -> thm
    87   val pred_rel_of_bnf: bnf -> thm
    87   val pred_rel_of_bnf: bnf -> thm
       
    88   val pred_transfer_of_bnf: bnf -> thm
       
    89   val pred_True_of_bnf: bnf -> thm
    88   val rel_Grp_of_bnf: bnf -> thm
    90   val rel_Grp_of_bnf: bnf -> thm
    89   val rel_OO_Grp_of_bnf: bnf -> thm
    91   val rel_OO_Grp_of_bnf: bnf -> thm
    90   val rel_OO_of_bnf: bnf -> thm
    92   val rel_OO_of_bnf: bnf -> thm
    91   val rel_cong0_of_bnf: bnf -> thm
    93   val rel_cong0_of_bnf: bnf -> thm
    92   val rel_cong_of_bnf: bnf -> thm
    94   val rel_cong_of_bnf: bnf -> thm
   288   rel_reflp: thm lazy,
   290   rel_reflp: thm lazy,
   289   rel_symp: thm lazy,
   291   rel_symp: thm lazy,
   290   rel_transp: thm lazy,
   292   rel_transp: thm lazy,
   291   rel_transfer: thm lazy,
   293   rel_transfer: thm lazy,
   292   rel_eq_onp: thm lazy,
   294   rel_eq_onp: thm lazy,
       
   295   pred_transfer: thm lazy,
   293   pred_True: thm lazy,
   296   pred_True: thm lazy,
   294   pred_map: thm lazy,
   297   pred_map: thm lazy,
   295   pred_rel: thm lazy,
   298   pred_rel: thm lazy,
   296   pred_mono_strong0: thm lazy,
   299   pred_mono_strong0: thm lazy,
   297   pred_mono_strong: thm lazy,
   300   pred_mono_strong: thm lazy,
   302 
   305 
   303 fun mk_facts bd_Card_order bd_Cinfinite bd_Cnotzero collect_set_map in_bd in_cong in_mono in_rel
   306 fun mk_facts bd_Card_order bd_Cinfinite bd_Cnotzero collect_set_map in_bd in_cong in_mono in_rel
   304     inj_map inj_map_strong map_comp map_cong map_cong_simp map_cong_pred map_id map_ident0 map_ident
   307     inj_map inj_map_strong map_comp map_cong map_cong_simp map_cong_pred map_id map_ident0 map_ident
   305     map_transfer rel_eq rel_flip set_map rel_cong0 rel_cong rel_cong_simp rel_map rel_mono
   308     map_transfer rel_eq rel_flip set_map rel_cong0 rel_cong rel_cong_simp rel_map rel_mono
   306     rel_mono_strong0 rel_mono_strong set_transfer rel_Grp rel_conversep rel_OO rel_refl
   309     rel_mono_strong0 rel_mono_strong set_transfer rel_Grp rel_conversep rel_OO rel_refl
   307     rel_refl_strong rel_reflp rel_symp rel_transp rel_transfer rel_eq_onp pred_True pred_map pred_rel
   310     rel_refl_strong rel_reflp rel_symp rel_transp rel_transfer rel_eq_onp pred_transfer pred_True
   308     pred_mono_strong0 pred_mono_strong pred_cong0 pred_cong pred_cong_simp = {
   311     pred_map pred_rel pred_mono_strong0 pred_mono_strong pred_cong0 pred_cong pred_cong_simp = {
   309   bd_Card_order = bd_Card_order,
   312   bd_Card_order = bd_Card_order,
   310   bd_Cinfinite = bd_Cinfinite,
   313   bd_Cinfinite = bd_Cinfinite,
   311   bd_Cnotzero = bd_Cnotzero,
   314   bd_Cnotzero = bd_Cnotzero,
   312   collect_set_map = collect_set_map,
   315   collect_set_map = collect_set_map,
   313   in_bd = in_bd,
   316   in_bd = in_bd,
   343   rel_reflp = rel_reflp,
   346   rel_reflp = rel_reflp,
   344   rel_symp = rel_symp,
   347   rel_symp = rel_symp,
   345   rel_transp = rel_transp,
   348   rel_transp = rel_transp,
   346   set_transfer = set_transfer,
   349   set_transfer = set_transfer,
   347   rel_eq_onp = rel_eq_onp,
   350   rel_eq_onp = rel_eq_onp,
       
   351   pred_transfer = pred_transfer,
   348   pred_True = pred_True,
   352   pred_True = pred_True,
   349   pred_map = pred_map,
   353   pred_map = pred_map,
   350   pred_rel = pred_rel,
   354   pred_rel = pred_rel,
   351   pred_mono_strong0 = pred_mono_strong0,
   355   pred_mono_strong0 = pred_mono_strong0,
   352   pred_mono_strong = pred_mono_strong,
   356   pred_mono_strong = pred_mono_strong,
   392   rel_reflp,
   396   rel_reflp,
   393   rel_symp,
   397   rel_symp,
   394   rel_transp,
   398   rel_transp,
   395   set_transfer,
   399   set_transfer,
   396   rel_eq_onp,
   400   rel_eq_onp,
       
   401   pred_transfer,
   397   pred_True,
   402   pred_True,
   398   pred_map,
   403   pred_map,
   399   pred_rel,
   404   pred_rel,
   400   pred_mono_strong0,
   405   pred_mono_strong0,
   401   pred_mono_strong,
   406   pred_mono_strong,
   439     rel_reflp = Lazy.map f rel_reflp,
   444     rel_reflp = Lazy.map f rel_reflp,
   440     rel_symp = Lazy.map f rel_symp,
   445     rel_symp = Lazy.map f rel_symp,
   441     rel_transp = Lazy.map f rel_transp,
   446     rel_transp = Lazy.map f rel_transp,
   442     set_transfer = Lazy.map (map f) set_transfer,
   447     set_transfer = Lazy.map (map f) set_transfer,
   443     rel_eq_onp = Lazy.map f rel_eq_onp,
   448     rel_eq_onp = Lazy.map f rel_eq_onp,
       
   449     pred_transfer = Lazy.map f pred_transfer,
   444     pred_True = Lazy.map f pred_True,
   450     pred_True = Lazy.map f pred_True,
   445     pred_map = Lazy.map f pred_map,
   451     pred_map = Lazy.map f pred_map,
   446     pred_rel = Lazy.map f pred_rel,
   452     pred_rel = Lazy.map f pred_rel,
   447     pred_mono_strong0 = Lazy.map f pred_mono_strong0,
   453     pred_mono_strong0 = Lazy.map f pred_mono_strong0,
   448     pred_mono_strong = Lazy.map f pred_mono_strong,
   454     pred_mono_strong = Lazy.map f pred_mono_strong,
   575 val map_id_of_bnf = Lazy.force o #map_id o #facts o rep_bnf;
   581 val map_id_of_bnf = Lazy.force o #map_id o #facts o rep_bnf;
   576 val map_ident0_of_bnf = Lazy.force o #map_ident0 o #facts o rep_bnf;
   582 val map_ident0_of_bnf = Lazy.force o #map_ident0 o #facts o rep_bnf;
   577 val map_ident_of_bnf = Lazy.force o #map_ident o #facts o rep_bnf;
   583 val map_ident_of_bnf = Lazy.force o #map_ident o #facts o rep_bnf;
   578 val map_transfer_of_bnf = Lazy.force o #map_transfer o #facts o rep_bnf;
   584 val map_transfer_of_bnf = Lazy.force o #map_transfer o #facts o rep_bnf;
   579 val rel_eq_onp_of_bnf = Lazy.force o #rel_eq_onp o #facts o rep_bnf;
   585 val rel_eq_onp_of_bnf = Lazy.force o #rel_eq_onp o #facts o rep_bnf;
   580 val pred_rel_of_bnf = Lazy.force o #pred_rel o #facts o rep_bnf;
   586 val pred_def_of_bnf = #pred_def o #defs o rep_bnf;
   581 val pred_map_of_bnf = Lazy.force o #pred_map o #facts o rep_bnf;
   587 val pred_map_of_bnf = Lazy.force o #pred_map o #facts o rep_bnf;
   582 val pred_mono_strong0_of_bnf = Lazy.force o #pred_mono_strong0 o #facts o rep_bnf;
   588 val pred_mono_strong0_of_bnf = Lazy.force o #pred_mono_strong0 o #facts o rep_bnf;
   583 val pred_mono_strong_of_bnf = Lazy.force o #pred_mono_strong o #facts o rep_bnf;
   589 val pred_mono_strong_of_bnf = Lazy.force o #pred_mono_strong o #facts o rep_bnf;
   584 val pred_cong0_of_bnf = Lazy.force o #pred_cong0 o #facts o rep_bnf;
   590 val pred_cong0_of_bnf = Lazy.force o #pred_cong0 o #facts o rep_bnf;
   585 val pred_cong_of_bnf = Lazy.force o #pred_cong o #facts o rep_bnf;
   591 val pred_cong_of_bnf = Lazy.force o #pred_cong o #facts o rep_bnf;
   586 val pred_cong_simp_of_bnf = Lazy.force o #pred_cong_simp o #facts o rep_bnf;
   592 val pred_cong_simp_of_bnf = Lazy.force o #pred_cong_simp o #facts o rep_bnf;
   587 val pred_def_of_bnf = #pred_def o #defs o rep_bnf;
   593 val pred_rel_of_bnf = Lazy.force o #pred_rel o #facts o rep_bnf;
   588 val pred_set_of_bnf = #pred_set o #axioms o rep_bnf;
   594 val pred_set_of_bnf = #pred_set o #axioms o rep_bnf;
       
   595 val pred_transfer_of_bnf = Lazy.force o #pred_transfer o #facts o rep_bnf;
       
   596 val pred_True_of_bnf = Lazy.force o #pred_True o #facts o rep_bnf;
   589 val rel_Grp_of_bnf = Lazy.force o #rel_Grp o #facts o rep_bnf;
   597 val rel_Grp_of_bnf = Lazy.force o #rel_Grp o #facts o rep_bnf;
   590 val rel_OO_Grp_of_bnf = #rel_OO_Grp o #axioms o rep_bnf;
   598 val rel_OO_Grp_of_bnf = #rel_OO_Grp o #axioms o rep_bnf;
   591 val rel_OO_of_bnf = Lazy.force o #rel_OO o #facts o rep_bnf;
   599 val rel_OO_of_bnf = Lazy.force o #rel_OO o #facts o rep_bnf;
   592 val rel_cong0_of_bnf = Lazy.force o #rel_cong0 o #facts o rep_bnf;
   600 val rel_cong0_of_bnf = Lazy.force o #rel_cong0 o #facts o rep_bnf;
   593 val rel_cong_of_bnf = Lazy.force o #rel_cong o #facts o rep_bnf;
   601 val rel_cong_of_bnf = Lazy.force o #rel_cong o #facts o rep_bnf;
   792 val map_idN = "map_id";
   800 val map_idN = "map_id";
   793 val map_identN = "map_ident";
   801 val map_identN = "map_ident";
   794 val map_transferN = "map_transfer";
   802 val map_transferN = "map_transfer";
   795 val pred_mono_strong0N = "pred_mono_strong0";
   803 val pred_mono_strong0N = "pred_mono_strong0";
   796 val pred_mono_strongN = "pred_mono_strong";
   804 val pred_mono_strongN = "pred_mono_strong";
       
   805 val pred_transferN = "pred_transfer";
   797 val pred_TrueN = "pred_True";
   806 val pred_TrueN = "pred_True";
   798 val pred_mapN = "pred_map";
   807 val pred_mapN = "pred_map";
   799 val pred_relN = "pred_rel";
   808 val pred_relN = "pred_rel";
   800 val pred_setN = "pred_set";
   809 val pred_setN = "pred_set";
   801 val pred_congN = "pred_cong";
   810 val pred_congN = "pred_cong";
   887            (pred_mono_strongN, [Lazy.force (#pred_mono_strong facts)], []),
   896            (pred_mono_strongN, [Lazy.force (#pred_mono_strong facts)], []),
   888            (pred_congN, [Lazy.force (#pred_cong facts)], fundefcong_attrs),
   897            (pred_congN, [Lazy.force (#pred_cong facts)], fundefcong_attrs),
   889            (pred_cong_simpN, [Lazy.force (#pred_cong_simp facts)], []),
   898            (pred_cong_simpN, [Lazy.force (#pred_cong_simp facts)], []),
   890            (pred_mapN, [Lazy.force (#pred_map facts)], []),
   899            (pred_mapN, [Lazy.force (#pred_map facts)], []),
   891            (pred_relN, [Lazy.force (#pred_rel facts)], []),
   900            (pred_relN, [Lazy.force (#pred_rel facts)], []),
       
   901            (pred_transferN, [Lazy.force (#pred_transfer facts)], []),
   892            (pred_TrueN, [Lazy.force (#pred_True facts)], []),
   902            (pred_TrueN, [Lazy.force (#pred_True facts)], []),
   893            (pred_setN, [#pred_set axioms], []),
   903            (pred_setN, [#pred_set axioms], []),
   894            (rel_comppN, [Lazy.force (#rel_OO facts)], []),
   904            (rel_comppN, [Lazy.force (#rel_OO facts)], []),
   895            (rel_compp_GrpN, no_refl [#rel_OO_Grp axioms], []),
   905            (rel_compp_GrpN, no_refl [#rel_OO_Grp axioms], []),
   896            (rel_conversepN, [Lazy.force (#rel_conversep facts)], []),
   906            (rel_conversepN, [Lazy.force (#rel_conversep facts)], []),
  1835             |> Thm.close_derivation
  1845             |> Thm.close_derivation
  1836           end;
  1846           end;
  1837 
  1847 
  1838         val map_transfer = Lazy.lazy mk_map_transfer;
  1848         val map_transfer = Lazy.lazy mk_map_transfer;
  1839 
  1849 
       
  1850         fun mk_pred_transfer () =
       
  1851           let
       
  1852             val iff = HOLogic.eq_const HOLogic.boolT;
       
  1853             val prem_rels = map (fn T => mk_rel_fun T iff) Rs;
       
  1854             val prem_elems = mk_rel_fun (Term.list_comb (rel, Rs)) iff;
       
  1855             val goal = HOLogic.mk_Trueprop
       
  1856               (fold_rev mk_rel_fun prem_rels prem_elems $ pred $ pred');
       
  1857             val vars = Variable.add_free_names lthy goal [];
       
  1858           in
       
  1859             Goal.prove_sorry lthy vars [] goal (fn {context = ctxt, prems = _} =>
       
  1860               mk_pred_transfer_tac ctxt live (Lazy.force in_rel) (Lazy.force pred_map)
       
  1861                 (Lazy.force pred_cong))
       
  1862             |> Thm.close_derivation
       
  1863           end;
       
  1864 
       
  1865         val pred_transfer = Lazy.lazy mk_pred_transfer;
       
  1866 
  1840         fun mk_rel_transfer () =
  1867         fun mk_rel_transfer () =
  1841           let
  1868           let
  1842             val iff = HOLogic.eq_const HOLogic.boolT;
  1869             val iff = HOLogic.eq_const HOLogic.boolT;
  1843             val prem_rels =
  1870             val prem_rels =
  1844               map2 (fn T1 => fn T2 => mk_rel_fun T1 (mk_rel_fun T2 iff)) S_AsCs S_BsEs;
  1871               map2 (fn T1 => fn T2 => mk_rel_fun T1 (mk_rel_fun T2 iff)) S_AsCs S_BsEs;
  1910         val facts = mk_facts bd_Card_order bd_Cinfinite bd_Cnotzero collect_set_map in_bd in_cong
  1937         val facts = mk_facts bd_Card_order bd_Cinfinite bd_Cnotzero collect_set_map in_bd in_cong
  1911           in_mono in_rel inj_map inj_map_strong map_comp map_cong map_cong_simp map_cong_pred map_id
  1938           in_mono in_rel inj_map inj_map_strong map_comp map_cong map_cong_simp map_cong_pred map_id
  1912           map_ident0 map_ident map_transfer rel_eq rel_flip set_map rel_cong0 rel_cong rel_cong_simp
  1939           map_ident0 map_ident map_transfer rel_eq rel_flip set_map rel_cong0 rel_cong rel_cong_simp
  1913           rel_map rel_mono rel_mono_strong0 rel_mono_strong set_transfer rel_Grp rel_conversep
  1940           rel_map rel_mono rel_mono_strong0 rel_mono_strong set_transfer rel_Grp rel_conversep
  1914           rel_OO rel_refl rel_refl_strong rel_reflp rel_symp rel_transp rel_transfer rel_eq_onp
  1941           rel_OO rel_refl rel_refl_strong rel_reflp rel_symp rel_transp rel_transfer rel_eq_onp
  1915           pred_True pred_map pred_rel pred_mono_strong0 pred_mono_strong pred_cong0 pred_cong
  1942           pred_transfer pred_True pred_map pred_rel pred_mono_strong0 pred_mono_strong pred_cong0
  1916           pred_cong_simp;
  1943           pred_cong pred_cong_simp;
  1917 
  1944 
  1918         val wits = map2 mk_witness bnf_wits wit_thms;
  1945         val wits = map2 mk_witness bnf_wits wit_thms;
  1919 
  1946 
  1920         val bnf_rel =
  1947         val bnf_rel =
  1921           Term.subst_atomic_types ((Ds ~~ deads) @ (As' ~~ alphas) @ (Bs' ~~ betas)) rel;
  1948           Term.subst_atomic_types ((Ds ~~ deads) @ (As' ~~ alphas) @ (Bs' ~~ betas)) rel;