src/HOL/Tools/Transfer/transfer_bnf.ML
changeset 60220 530112e8c6ba
parent 60216 ef4f0b5b925e
child 60728 26ffdb966759
equal deleted inserted replaced
60219:2bce9a690b1e 60220:530112e8c6ba
   281     val Domainp_rel = prove_Domainp_rel lthy bnf pred_def
   281     val Domainp_rel = prove_Domainp_rel lthy bnf pred_def
   282     val rel_eq_onp = prove_rel_eq_onp lthy bnf pred_def
   282     val rel_eq_onp = prove_rel_eq_onp lthy bnf pred_def
   283     fun qualify defname suffix = Binding.qualified true suffix defname
   283     fun qualify defname suffix = Binding.qualified true suffix defname
   284     val Domainp_rel_thm_name = qualify (base_name_of_bnf bnf) "Domainp_rel"
   284     val Domainp_rel_thm_name = qualify (base_name_of_bnf bnf) "Domainp_rel"
   285     val rel_eq_onp_thm_name = qualify (base_name_of_bnf bnf) "rel_eq_onp"
   285     val rel_eq_onp_thm_name = qualify (base_name_of_bnf bnf) "rel_eq_onp"
   286     val pred_data = {pred_def = pred_def, rel_eq_onp = rel_eq_onp}
   286     val pred_data = Transfer.mk_pred_data pred_def rel_eq_onp []
   287     val type_name = type_name_of_bnf bnf
   287     val type_name = type_name_of_bnf bnf
   288     val relator_domain_attr = @{attributes [relator_domain]}
   288     val relator_domain_attr = @{attributes [relator_domain]}
   289     val notes = [((Domainp_rel_thm_name, []), [([Domainp_rel], relator_domain_attr)]),
   289     val notes = [((Domainp_rel_thm_name, []), [([Domainp_rel], relator_domain_attr)]),
   290       ((rel_eq_onp_thm_name, []), [([rel_eq_onp], [])])]
   290       ((rel_eq_onp_thm_name, []), [([rel_eq_onp], [])])]
   291   in
   291   in
   396   let
   396   let
   397     val pred_injects = prove_pred_inject lthy fp_sugar
   397     val pred_injects = prove_pred_inject lthy fp_sugar
   398     fun qualify defname suffix = Binding.qualified true suffix defname
   398     fun qualify defname suffix = Binding.qualified true suffix defname
   399     val pred_inject_thm_name = qualify (base_name_of_bnf (bnf_of_fp_sugar fp_sugar)) "pred_inject"
   399     val pred_inject_thm_name = qualify (base_name_of_bnf (bnf_of_fp_sugar fp_sugar)) "pred_inject"
   400     val simp_attrs = @{attributes [simp]}
   400     val simp_attrs = @{attributes [simp]}
   401   in
   401     val type_name = type_name_of_bnf (#fp_bnf fp_sugar)
   402     [((pred_inject_thm_name, []), [(pred_injects, simp_attrs)])]
   402     val pred_data = lookup_defined_pred_data lthy type_name 
       
   403       |> Transfer.update_pred_simps pred_injects
       
   404   in
       
   405     lthy 
       
   406     |> Local_Theory.note ((pred_inject_thm_name, simp_attrs), pred_injects) 
       
   407     |> snd
       
   408     |> Local_Theory.declaration {syntax = false, pervasive = true}
       
   409       (fn phi => Transfer.update_pred_data type_name  (Transfer.morph_pred_data phi pred_data))
       
   410     |> Local_Theory.restore
   403   end
   411   end
   404 
   412 
   405 
   413 
   406 fun transfer_fp_sugars_interpretation fp_sugar lthy =
   414 fun transfer_fp_sugars_interpretation fp_sugar lthy =
   407   let
   415   let
   408     val pred_injects_notes = pred_injects fp_sugar lthy
   416     val lthy = pred_injects fp_sugar lthy
   409     val transfer_rules_notes = fp_sugar_transfer_rules fp_sugar
   417     val transfer_rules_notes = fp_sugar_transfer_rules fp_sugar
   410   in
   418   in
   411     lthy
   419     lthy
   412     |> Local_Theory.notes (pred_injects_notes @ transfer_rules_notes)
   420     |> Local_Theory.notes transfer_rules_notes
   413     |> snd
   421     |> snd
   414   end
   422   end
   415 
   423 
   416 val _ =
   424 val _ =
   417   Theory.setup (fp_sugars_interpretation transfer_plugin
   425   Theory.setup (fp_sugars_interpretation transfer_plugin