src/HOL/Nat_Transfer.thy
changeset 35644 d20cf282342e
parent 35551 85aada96578b
child 35683 70ace653fe77
equal deleted inserted replaced
35643:965c24dd6856 35644:d20cf282342e
     8 uses ("Tools/transfer.ML")
     8 uses ("Tools/transfer.ML")
     9 begin
     9 begin
    10 
    10 
    11 subsection {* Generic transfer machinery *}
    11 subsection {* Generic transfer machinery *}
    12 
    12 
    13 definition TransferMorphism:: "('b \<Rightarrow> 'a) \<Rightarrow> 'b set \<Rightarrow> bool"
    13 definition transfer_morphism:: "('b \<Rightarrow> 'a) \<Rightarrow> 'b set \<Rightarrow> bool"
    14   where "TransferMorphism a B \<longleftrightarrow> True"
    14   where "transfer_morphism f A \<longleftrightarrow> True"
       
    15 
       
    16 lemma transfer_morphismI:
       
    17   "transfer_morphism f A"
       
    18   by (simp add: transfer_morphism_def)
    15 
    19 
    16 use "Tools/transfer.ML"
    20 use "Tools/transfer.ML"
    17 
    21 
    18 setup Transfer.setup
    22 setup Transfer.setup
    19 
    23 
    20 
    24 
    21 subsection {* Set up transfer from nat to int *}
    25 subsection {* Set up transfer from nat to int *}
    22 
    26 
    23 text {* set up transfer direction *}
    27 text {* set up transfer direction *}
    24 
    28 
    25 lemma TransferMorphism_nat_int: "TransferMorphism nat (op <= (0::int))"
    29 lemma transfer_morphism_nat_int: "transfer_morphism nat (op <= (0::int))"
    26   by (simp add: TransferMorphism_def)
    30   by (simp add: transfer_morphism_def)
    27 
    31 
    28 declare TransferMorphism_nat_int [transfer
    32 declare transfer_morphism_nat_int [transfer
    29   add mode: manual
    33   add mode: manual
    30   return: nat_0_le
    34   return: nat_0_le
    31   labels: natint
    35   labels: natint
    32 ]
    36 ]
    33 
    37 
    78       (nat (x::int) <= nat y) = (x <= y)"
    82       (nat (x::int) <= nat y) = (x <= y)"
    79     "x >= 0 \<Longrightarrow> y >= 0 \<Longrightarrow>
    83     "x >= 0 \<Longrightarrow> y >= 0 \<Longrightarrow>
    80       (nat (x::int) dvd nat y) = (x dvd y)"
    84       (nat (x::int) dvd nat y) = (x dvd y)"
    81   by (auto simp add: zdvd_int)
    85   by (auto simp add: zdvd_int)
    82 
    86 
    83 declare TransferMorphism_nat_int [transfer add return:
    87 declare transfer_morphism_nat_int [transfer add return:
    84   transfer_nat_int_numerals
    88   transfer_nat_int_numerals
    85   transfer_nat_int_functions
    89   transfer_nat_int_functions
    86   transfer_nat_int_function_closures
    90   transfer_nat_int_function_closures
    87   transfer_nat_int_relations
    91   transfer_nat_int_relations
    88 ]
    92 ]
   116 
   120 
   117 lemma ex_cong: "(\<And>x. Q x \<Longrightarrow> P x = P' x) \<Longrightarrow>
   121 lemma ex_cong: "(\<And>x. Q x \<Longrightarrow> P x = P' x) \<Longrightarrow>
   118     (EX x. Q x \<and> P x) = (EX x. Q x \<and> P' x)"
   122     (EX x. Q x \<and> P x) = (EX x. Q x \<and> P' x)"
   119   by auto
   123   by auto
   120 
   124 
   121 declare TransferMorphism_nat_int [transfer add
   125 declare transfer_morphism_nat_int [transfer add
   122   return: transfer_nat_int_quantifiers
   126   return: transfer_nat_int_quantifiers
   123   cong: all_cong ex_cong]
   127   cong: all_cong ex_cong]
   124 
   128 
   125 
   129 
   126 text {* if *}
   130 text {* if *}
   127 
   131 
   128 lemma nat_if_cong: "(if P then (nat x) else (nat y)) =
   132 lemma nat_if_cong: "(if P then (nat x) else (nat y)) =
   129     nat (if P then x else y)"
   133     nat (if P then x else y)"
   130   by auto
   134   by auto
   131 
   135 
   132 declare TransferMorphism_nat_int [transfer add return: nat_if_cong]
   136 declare transfer_morphism_nat_int [transfer add return: nat_if_cong]
   133 
   137 
   134 
   138 
   135 text {* operations with sets *}
   139 text {* operations with sets *}
   136 
   140 
   137 definition
   141 definition
   188 
   192 
   189 lemma transfer_nat_int_set_cong: "(!!x. x >= 0 \<Longrightarrow> P x = P' x) \<Longrightarrow>
   193 lemma transfer_nat_int_set_cong: "(!!x. x >= 0 \<Longrightarrow> P x = P' x) \<Longrightarrow>
   190     {(x::int). x >= 0 & P x} = {x. x >= 0 & P' x}"
   194     {(x::int). x >= 0 & P x} = {x. x >= 0 & P' x}"
   191   by auto
   195   by auto
   192 
   196 
   193 declare TransferMorphism_nat_int [transfer add
   197 declare transfer_morphism_nat_int [transfer add
   194   return: transfer_nat_int_set_functions
   198   return: transfer_nat_int_set_functions
   195     transfer_nat_int_set_function_closures
   199     transfer_nat_int_set_function_closures
   196     transfer_nat_int_set_relations
   200     transfer_nat_int_set_relations
   197     transfer_nat_int_set_return_embed
   201     transfer_nat_int_set_return_embed
   198   cong: transfer_nat_int_set_cong
   202   cong: transfer_nat_int_set_cong
   260   apply (subst setsum_cong, assumption)
   264   apply (subst setsum_cong, assumption)
   261   apply auto [2]
   265   apply auto [2]
   262   apply (subst setprod_cong, assumption, auto)
   266   apply (subst setprod_cong, assumption, auto)
   263 done
   267 done
   264 
   268 
   265 declare TransferMorphism_nat_int [transfer add
   269 declare transfer_morphism_nat_int [transfer add
   266   return: transfer_nat_int_sum_prod transfer_nat_int_sum_prod2
   270   return: transfer_nat_int_sum_prod transfer_nat_int_sum_prod2
   267     transfer_nat_int_sum_prod_closure
   271     transfer_nat_int_sum_prod_closure
   268   cong: transfer_nat_int_sum_prod_cong]
   272   cong: transfer_nat_int_sum_prod_cong]
   269 
   273 
   270 
   274 
   271 subsection {* Set up transfer from int to nat *}
   275 subsection {* Set up transfer from int to nat *}
   272 
   276 
   273 text {* set up transfer direction *}
   277 text {* set up transfer direction *}
   274 
   278 
   275 lemma TransferMorphism_int_nat: "TransferMorphism int (UNIV :: nat set)"
   279 lemma transfer_morphism_int_nat: "transfer_morphism int (UNIV :: nat set)"
   276   by (simp add: TransferMorphism_def)
   280   by (simp add: transfer_morphism_def)
   277 
   281 
   278 declare TransferMorphism_int_nat [transfer add
   282 declare transfer_morphism_int_nat [transfer add
   279   mode: manual
   283   mode: manual
   280 (*  labels: int-nat *)
   284 (*  labels: int-nat *)
   281   return: nat_int
   285   return: nat_int
   282 ]
   286 ]
   283 
   287 
   324     "(int x < int y) = (x < y)"
   328     "(int x < int y) = (x < y)"
   325     "(int x <= int y) = (x <= y)"
   329     "(int x <= int y) = (x <= y)"
   326     "(int x dvd int y) = (x dvd y)"
   330     "(int x dvd int y) = (x dvd y)"
   327   by (auto simp add: zdvd_int)
   331   by (auto simp add: zdvd_int)
   328 
   332 
   329 declare TransferMorphism_int_nat [transfer add return:
   333 declare transfer_morphism_int_nat [transfer add return:
   330   transfer_int_nat_numerals
   334   transfer_int_nat_numerals
   331   transfer_int_nat_functions
   335   transfer_int_nat_functions
   332   transfer_int_nat_function_closures
   336   transfer_int_nat_function_closures
   333   transfer_int_nat_relations
   337   transfer_int_nat_relations
   334   UNIV_apply
   338   UNIV_apply
   344   apply auto [1]
   348   apply auto [1]
   345   apply (subst ex_nat)
   349   apply (subst ex_nat)
   346   apply auto
   350   apply auto
   347 done
   351 done
   348 
   352 
   349 declare TransferMorphism_int_nat [transfer add
   353 declare transfer_morphism_int_nat [transfer add
   350   return: transfer_int_nat_quantifiers]
   354   return: transfer_int_nat_quantifiers]
   351 
   355 
   352 
   356 
   353 text {* if *}
   357 text {* if *}
   354 
   358 
   355 lemma int_if_cong: "(if P then (int x) else (int y)) =
   359 lemma int_if_cong: "(if P then (int x) else (int y)) =
   356     int (if P then x else y)"
   360     int (if P then x else y)"
   357   by auto
   361   by auto
   358 
   362 
   359 declare TransferMorphism_int_nat [transfer add return: int_if_cong]
   363 declare transfer_morphism_int_nat [transfer add return: int_if_cong]
   360 
   364 
   361 
   365 
   362 
   366 
   363 text {* operations with sets *}
   367 text {* operations with sets *}
   364 
   368 
   399 
   403 
   400 lemma transfer_int_nat_set_cong: "(!!x. P x = P' x) \<Longrightarrow>
   404 lemma transfer_int_nat_set_cong: "(!!x. P x = P' x) \<Longrightarrow>
   401     {(x::nat). P x} = {x. P' x}"
   405     {(x::nat). P x} = {x. P' x}"
   402   by auto
   406   by auto
   403 
   407 
   404 declare TransferMorphism_int_nat [transfer add
   408 declare transfer_morphism_int_nat [transfer add
   405   return: transfer_int_nat_set_functions
   409   return: transfer_int_nat_set_functions
   406     transfer_int_nat_set_function_closures
   410     transfer_int_nat_set_function_closures
   407     transfer_int_nat_set_relations
   411     transfer_int_nat_set_relations
   408     transfer_int_nat_set_return_embed
   412     transfer_int_nat_set_return_embed
   409   cong: transfer_int_nat_set_cong
   413   cong: transfer_int_nat_set_cong
   431   unfolding is_nat_def
   435   unfolding is_nat_def
   432   apply (subst int_setsum, auto)
   436   apply (subst int_setsum, auto)
   433   apply (subst int_setprod, auto simp add: cong: setprod_cong)
   437   apply (subst int_setprod, auto simp add: cong: setprod_cong)
   434 done
   438 done
   435 
   439 
   436 declare TransferMorphism_int_nat [transfer add
   440 declare transfer_morphism_int_nat [transfer add
   437   return: transfer_int_nat_sum_prod transfer_int_nat_sum_prod2
   441   return: transfer_int_nat_sum_prod transfer_int_nat_sum_prod2
   438   cong: setsum_cong setprod_cong]
   442   cong: setsum_cong setprod_cong]
   439 
   443 
   440 end
   444 end