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 |