Nominal/Nominal2.thy
changeset 2600 ca6b4bc7a871
parent 2598 b136721eedb2
child 2601 89c55d36980f
equal deleted inserted replaced
2599:d6fe94028a5d 2600:ca6b4bc7a871
   198     end
   198     end
   199 
   199 
   200 *}
   200 *}
   201 
   201 
   202 ML {*
   202 ML {*
   203 fun define_raw_dts dts bn_funs bn_eqs binds lthy =
   203 fun define_raw_dts dts bn_funs bn_eqs bclauses lthy =
   204 let
   204 let
   205   val thy = Local_Theory.exit_global lthy
   205   val thy = Local_Theory.exit_global lthy
   206   val thy_name = Context.theory_name thy
   206   val thy_name = Context.theory_name thy
   207 
   207 
   208   val dt_names = map (fn (_, s, _, _) => Binding.name_of s) dts
   208   val dt_names = map (fn (_, s, _, _) => Binding.name_of s) dts
   223   val bn_fun_full_env = map (pairself (Long_Name.qualify thy_name)) 
   223   val bn_fun_full_env = map (pairself (Long_Name.qualify thy_name)) 
   224     (bn_fun_strs ~~ bn_fun_strs')
   224     (bn_fun_strs ~~ bn_fun_strs')
   225   
   225   
   226   val (raw_dt_names, raw_dts) = rawify_dts dt_names dts dts_env
   226   val (raw_dt_names, raw_dts) = rawify_dts dt_names dts dts_env
   227   val (raw_bn_funs, raw_bn_eqs) = rawify_bn_funs dts_env cnstrs_env bn_fun_env bn_funs bn_eqs 
   227   val (raw_bn_funs, raw_bn_eqs) = rawify_bn_funs dts_env cnstrs_env bn_fun_env bn_funs bn_eqs 
   228   val raw_bclauses = rawify_bclauses dts_env cnstrs_env bn_fun_full_env binds 
   228   val raw_bclauses = rawify_bclauses dts_env cnstrs_env bn_fun_full_env bclauses 
   229 
   229 
   230   val (raw_dt_full_names, thy1) = 
   230   val (raw_dt_full_names, thy1) = 
   231     Datatype.add_datatype Datatype.default_config raw_dt_names raw_dts thy
   231     Datatype.add_datatype Datatype.default_config raw_dt_names raw_dts thy
   232 
   232 
   233   val lthy1 = Named_Target.theory_init thy1
   233   val lthy1 = Named_Target.theory_init thy1
   256   val (raw_dt_names, raw_dts, raw_bclauses, raw_bn_funs, raw_bn_eqs, lthy0) =
   256   val (raw_dt_names, raw_dts, raw_bclauses, raw_bn_funs, raw_bn_eqs, lthy0) =
   257     if get_STEPS lthy > 0 
   257     if get_STEPS lthy > 0 
   258     then define_raw_dts dts bn_funs bn_eqs bclauses lthy
   258     then define_raw_dts dts bn_funs bn_eqs bclauses lthy
   259     else raise TEST lthy
   259     else raise TEST lthy
   260 
   260 
       
   261   val _ = tracing ("raw_bclauses\n" ^ cat_lines (map @{make_string} raw_bclauses))
       
   262 
   261   val dtinfo = Datatype.the_info (ProofContext.theory_of lthy0) (hd raw_dt_names)
   263   val dtinfo = Datatype.the_info (ProofContext.theory_of lthy0) (hd raw_dt_names)
   262   val {descr, sorts, ...} = dtinfo
   264   val {descr, sorts, ...} = dtinfo
   263 
   265 
   264   val raw_tys = all_dtyps descr sorts
   266   val raw_tys = all_dtyps descr sorts
   265   val raw_full_ty_names = map (fst o dest_Type) raw_tys
   267   val raw_full_ty_names = map (fst o dest_Type) raw_tys
   268     |> map dest_TFree  
   270     |> map dest_TFree  
   269 
   271 
   270   val dtinfos = map (Datatype.the_info (ProofContext.theory_of lthy0)) raw_full_ty_names  
   272   val dtinfos = map (Datatype.the_info (ProofContext.theory_of lthy0)) raw_full_ty_names  
   271  
   273  
   272   val raw_cns_info = all_dtyp_constrs_types descr sorts
   274   val raw_cns_info = all_dtyp_constrs_types descr sorts
   273   val raw_constrs = flat (map (map (fn (c, _, _, _) => c)) raw_cns_info)
   275   val raw_constrs = map (map (fn (c, _, _, _) => c)) raw_cns_info
   274 
   276 
   275   val raw_inject_thms = flat (map #inject dtinfos)
   277   val raw_inject_thms = flat (map #inject dtinfos)
   276   val raw_distinct_thms = flat (map #distinct dtinfos)
   278   val raw_distinct_thms = flat (map #distinct dtinfos)
   277   val raw_induct_thm = #induct dtinfo
   279   val raw_induct_thm = #induct dtinfo
   278   val raw_induct_thms = #inducts dtinfo
   280   val raw_induct_thms = #inducts dtinfo
   284   
   286   
   285   (* definitions of raw permutations by primitive recursion *)
   287   (* definitions of raw permutations by primitive recursion *)
   286   val _ = warning "Definition of raw permutations";
   288   val _ = warning "Definition of raw permutations";
   287   val ((raw_perm_funs, raw_perm_simps, raw_perm_laws), lthy2a) =
   289   val ((raw_perm_funs, raw_perm_simps, raw_perm_laws), lthy2a) =
   288     if get_STEPS lthy0 > 0 
   290     if get_STEPS lthy0 > 0 
   289     then define_raw_perms raw_full_ty_names raw_tys tvs raw_constrs raw_induct_thm lthy0
   291     then define_raw_perms raw_full_ty_names raw_tys tvs (flat raw_constrs) raw_induct_thm lthy0
   290     else raise TEST lthy0
   292     else raise TEST lthy0
   291  
   293  
   292   (* noting the raw permutations as eqvt theorems *)
   294   (* noting the raw permutations as eqvt theorems *)
   293   val (_, lthy3) = Local_Theory.note ((Binding.empty, [eqvt_attr]), raw_perm_simps) lthy2a
   295   val (_, lthy3) = Local_Theory.note ((Binding.empty, [eqvt_attr]), raw_perm_simps) lthy2a
   294 
   296 
   417       |> map mk_funs_rsp
   419       |> map mk_funs_rsp
   418     else raise TEST lthy6 
   420     else raise TEST lthy6 
   419 
   421 
   420   val raw_constrs_rsp = 
   422   val raw_constrs_rsp = 
   421     if get_STEPS lthy > 18
   423     if get_STEPS lthy > 18
   422     then raw_constrs_rsp raw_constrs alpha_trms alpha_intros
   424     then raw_constrs_rsp (flat raw_constrs) alpha_trms alpha_intros
   423       (alpha_bn_imp_thms @ raw_funs_rsp_aux) lthy6 
   425       (alpha_bn_imp_thms @ raw_funs_rsp_aux) lthy6 
   424     else raise TEST lthy6 
   426     else raise TEST lthy6 
   425 
   427 
   426   val alpha_permute_rsp = 
   428   val alpha_permute_rsp = 
   427     if get_STEPS lthy > 19
   429     if get_STEPS lthy > 19
   460   val qty_full_names = map (fst o dest_Type) qtys
   462   val qty_full_names = map (fst o dest_Type) qtys
   461   val qty_names = map Long_Name.base_name qty_full_names             
   463   val qty_names = map Long_Name.base_name qty_full_names             
   462 
   464 
   463   (* defining of quotient term-constructors, binding functions, free vars functions *)
   465   (* defining of quotient term-constructors, binding functions, free vars functions *)
   464   val _ = warning "Defining the quotient constants"
   466   val _ = warning "Defining the quotient constants"
   465   val qconstrs_descr = 
   467   val qconstrs_descrs =
   466     flat (map (fn (_, _, _, cs) => map (fn (b, _, mx) => (Name.of_binding b, mx)) cs) dts)
   468     map2 (map2 (fn (b, _, mx) => fn t => (Name.of_binding b, t, mx))) (get_cnstrs dts) raw_constrs
   467     |> map2 (fn t => fn (b, mx) => (b, t, mx)) raw_constrs
       
   468 
   469 
   469   val qbns_descr =
   470   val qbns_descr =
   470     map2 (fn (b, _, mx) => fn t => (Name.of_binding b, t, mx)) bn_funs raw_bns
   471     map2 (fn (b, _, mx) => fn t => (Name.of_binding b, t, mx)) bn_funs raw_bns
   471 
   472 
   472   val qfvs_descr = 
   473   val qfvs_descr = 
   485     map2 (fn n => fn t => ("size_" ^ n, t, NoSyn)) qty_names raw_size_trms
   486     map2 (fn n => fn t => ("size_" ^ n, t, NoSyn)) qty_names raw_size_trms
   486 
   487 
   487   val qperm_bn_descr = 
   488   val qperm_bn_descr = 
   488     map2 (fn (b, _, _) => fn t => ("permute_" ^ Name.of_binding b, t, NoSyn)) bn_funs raw_perm_bns
   489     map2 (fn (b, _, _) => fn t => ("permute_" ^ Name.of_binding b, t, NoSyn)) bn_funs raw_perm_bns
   489      
   490      
   490 
   491   val ((((((qconstrs_infos, qbns_info), qfvs_info), qfv_bns_info), qalpha_bns_info), qperm_bns_info), 
   491   val ((((((qconstrs_info, qbns_info), qfvs_info), qfv_bns_info), qalpha_bns_info), qperm_bns_info), lthy8)= 
   492     lthy8) = 
   492     if get_STEPS lthy > 24
   493     if get_STEPS lthy > 24
   493     then 
   494     then 
   494       lthy7
   495       lthy7
   495       |> define_qconsts qtys qconstrs_descr 
   496       |> fold_map (define_qconsts qtys) qconstrs_descrs 
   496       ||>> define_qconsts qtys qbns_descr 
   497       ||>> define_qconsts qtys qbns_descr 
   497       ||>> define_qconsts qtys qfvs_descr
   498       ||>> define_qconsts qtys qfvs_descr
   498       ||>> define_qconsts qtys qfv_bns_descr
   499       ||>> define_qconsts qtys qfv_bns_descr
   499       ||>> define_qconsts qtys qalpha_bns_descr
   500       ||>> define_qconsts qtys qalpha_bns_descr
   500       ||>> define_qconsts qtys qperm_bn_descr
   501       ||>> define_qconsts qtys qperm_bn_descr
   509   val lthy9a = 
   510   val lthy9a = 
   510     if get_STEPS lthy > 26
   511     if get_STEPS lthy > 26
   511     then define_qsizes qtys qty_full_names tvs qsize_descr lthy9
   512     then define_qsizes qtys qty_full_names tvs qsize_descr lthy9
   512     else raise TEST lthy9
   513     else raise TEST lthy9
   513 
   514 
   514   val qtrms = map #qconst qconstrs_info
   515   val qtrms = map (map #qconst) qconstrs_infos
   515   val qbns = map #qconst qbns_info
   516   val qbns = map #qconst qbns_info
   516   val qfvs = map #qconst qfvs_info
   517   val qfvs = map #qconst qfvs_info
   517   val qfv_bns = map #qconst qfv_bns_info
   518   val qfv_bns = map #qconst qfv_bns_info
   518   val qalpha_bns = map #qconst qalpha_bns_info
   519   val qalpha_bns = map #qconst qalpha_bns_info
   519   val qperm_bns = map #qconst qperm_bns_info
   520   val qperm_bns = map #qconst qperm_bns_info
   552 
   553 
   553   (* supports lemmas *) 
   554   (* supports lemmas *) 
   554   val _ = warning "Proving Supports Lemmas and fs-Instances"
   555   val _ = warning "Proving Supports Lemmas and fs-Instances"
   555   val qsupports_thms =
   556   val qsupports_thms =
   556     if get_STEPS lthy > 29
   557     if get_STEPS lthy > 29
   557     then prove_supports lthyB qperm_simps qtrms
   558     then prove_supports lthyB qperm_simps (flat qtrms)
   558     else raise TEST lthyB
   559     else raise TEST lthyB
   559 
   560 
   560   (* finite supp lemmas *)
   561   (* finite supp lemmas *)
   561   val qfsupp_thms =
   562   val qfsupp_thms =
   562     if get_STEPS lthy > 30
   563     if get_STEPS lthy > 30
   571 
   572 
   572   (* fv - supp equality *)
   573   (* fv - supp equality *)
   573   val _ = warning "Proving Equality between fv and supp"
   574   val _ = warning "Proving Equality between fv and supp"
   574   val qfv_supp_thms = 
   575   val qfv_supp_thms = 
   575     if get_STEPS lthy > 32
   576     if get_STEPS lthy > 32
   576     then prove_fv_supp qtys qtrms qfvs qfv_bns qalpha_bns qfv_defs qeq_iffs 
   577     then prove_fv_supp qtys (flat qtrms) qfvs qfv_bns qalpha_bns qfv_defs qeq_iffs 
   577       qperm_simps qfv_qbn_eqvts qinduct (flat raw_bclauses) lthyC
   578       qperm_simps qfv_qbn_eqvts qinduct (flat raw_bclauses) lthyC
   578     else []
   579     else []
   579 
   580 
   580   (* postprocessing of eq and fv theorems *)
   581   (* postprocessing of eq and fv theorems *)
   581 
   582