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 |