290 by (safe, metis, fast) |
290 by (safe, metis, fast) |
291 |
291 |
292 |
292 |
293 subsection {* Transfer rules *} |
293 subsection {* Transfer rules *} |
294 |
294 |
|
295 lemma Domainp_iff: "Domainp T x \<longleftrightarrow> (\<exists>y. T x y)" |
|
296 by auto |
|
297 |
|
298 lemma Domainp_forall_transfer [transfer_rule]: |
|
299 assumes "right_total A" |
|
300 shows "((A ===> op =) ===> op =) |
|
301 (transfer_bforall (Domainp A)) transfer_forall" |
|
302 using assms unfolding right_total_def |
|
303 unfolding transfer_forall_def transfer_bforall_def fun_rel_def Domainp_iff |
|
304 by metis |
|
305 |
295 text {* Transfer rules using implication instead of equality on booleans. *} |
306 text {* Transfer rules using implication instead of equality on booleans. *} |
296 |
307 |
297 lemma transfer_forall_transfer [transfer_rule]: |
308 lemma transfer_forall_transfer [transfer_rule]: |
298 "bi_total A \<Longrightarrow> ((A ===> op =) ===> op =) transfer_forall transfer_forall" |
309 "bi_total A \<Longrightarrow> ((A ===> op =) ===> op =) transfer_forall transfer_forall" |
299 "right_total A \<Longrightarrow> ((A ===> op =) ===> implies) transfer_forall transfer_forall" |
310 "right_total A \<Longrightarrow> ((A ===> op =) ===> implies) transfer_forall transfer_forall" |
322 lemma eq_transfer [transfer_rule]: |
333 lemma eq_transfer [transfer_rule]: |
323 assumes "bi_unique A" |
334 assumes "bi_unique A" |
324 shows "(A ===> A ===> op =) (op =) (op =)" |
335 shows "(A ===> A ===> op =) (op =) (op =)" |
325 using assms unfolding bi_unique_def fun_rel_def by auto |
336 using assms unfolding bi_unique_def fun_rel_def by auto |
326 |
337 |
327 lemma Domainp_iff: "Domainp T x \<longleftrightarrow> (\<exists>y. T x y)" |
|
328 by auto |
|
329 |
|
330 lemma right_total_Ex_transfer[transfer_rule]: |
338 lemma right_total_Ex_transfer[transfer_rule]: |
331 assumes "right_total A" |
339 assumes "right_total A" |
332 shows "((A ===> op=) ===> op=) (Bex (Collect (Domainp A))) Ex" |
340 shows "((A ===> op=) ===> op=) (Bex (Collect (Domainp A))) Ex" |
333 using assms unfolding right_total_def Bex_def fun_rel_def Domainp_iff[abs_def] |
341 using assms unfolding right_total_def Bex_def fun_rel_def Domainp_iff[abs_def] |
334 by blast |
342 by blast |
377 |
385 |
378 lemma funpow_transfer [transfer_rule]: |
386 lemma funpow_transfer [transfer_rule]: |
379 "(op = ===> (A ===> A) ===> (A ===> A)) compow compow" |
387 "(op = ===> (A ===> A) ===> (A ===> A)) compow compow" |
380 unfolding funpow_def by transfer_prover |
388 unfolding funpow_def by transfer_prover |
381 |
389 |
382 lemma Domainp_forall_transfer [transfer_rule]: |
390 lemma mono_transfer[transfer_rule]: |
383 assumes "right_total A" |
391 assumes [transfer_rule]: "bi_total A" |
384 shows "((A ===> op =) ===> op =) |
392 assumes [transfer_rule]: "(A ===> A ===> op=) op\<le> op\<le>" |
385 (transfer_bforall (Domainp A)) transfer_forall" |
393 assumes [transfer_rule]: "(B ===> B ===> op=) op\<le> op\<le>" |
386 using assms unfolding right_total_def |
394 shows "((A ===> B) ===> op=) mono mono" |
387 unfolding transfer_forall_def transfer_bforall_def fun_rel_def Domainp_iff |
395 unfolding mono_def[abs_def] by transfer_prover |
388 by metis |
396 |
389 |
397 lemma right_total_relcompp_transfer[transfer_rule]: |
390 lemma forall_transfer [transfer_rule]: |
398 assumes [transfer_rule]: "right_total B" |
391 "bi_total A \<Longrightarrow> ((A ===> op =) ===> op =) transfer_forall transfer_forall" |
399 shows "((A ===> B ===> op=) ===> (B ===> C ===> op=) ===> A ===> C ===> op=) |
392 unfolding transfer_forall_def by (rule All_transfer) |
400 (\<lambda>R S x z. \<exists>y\<in>Collect (Domainp B). R x y \<and> S y z) op OO" |
|
401 unfolding OO_def[abs_def] by transfer_prover |
|
402 |
|
403 lemma relcompp_transfer[transfer_rule]: |
|
404 assumes [transfer_rule]: "bi_total B" |
|
405 shows "((A ===> B ===> op=) ===> (B ===> C ===> op=) ===> A ===> C ===> op=) op OO op OO" |
|
406 unfolding OO_def[abs_def] by transfer_prover |
|
407 |
|
408 lemma right_total_Domainp_transfer[transfer_rule]: |
|
409 assumes [transfer_rule]: "right_total B" |
|
410 shows "((A ===> B ===> op=) ===> A ===> op=) (\<lambda>T x. \<exists>y\<in>Collect(Domainp B). T x y) Domainp" |
|
411 apply(subst(2) Domainp_iff[abs_def]) by transfer_prover |
|
412 |
|
413 lemma Domainp_transfer[transfer_rule]: |
|
414 assumes [transfer_rule]: "bi_total B" |
|
415 shows "((A ===> B ===> op=) ===> A ===> op=) Domainp Domainp" |
|
416 unfolding Domainp_iff[abs_def] by transfer_prover |
|
417 |
|
418 lemma reflp_transfer[transfer_rule]: |
|
419 "bi_total A \<Longrightarrow> ((A ===> A ===> op=) ===> op=) reflp reflp" |
|
420 "right_total A \<Longrightarrow> ((A ===> A ===> implies) ===> implies) reflp reflp" |
|
421 "right_total A \<Longrightarrow> ((A ===> A ===> op=) ===> implies) reflp reflp" |
|
422 "bi_total A \<Longrightarrow> ((A ===> A ===> rev_implies) ===> rev_implies) reflp reflp" |
|
423 "bi_total A \<Longrightarrow> ((A ===> A ===> op=) ===> rev_implies) reflp reflp" |
|
424 using assms unfolding reflp_def[abs_def] rev_implies_def bi_total_def right_total_def fun_rel_def |
|
425 by fast+ |
|
426 |
|
427 lemma right_unique_transfer [transfer_rule]: |
|
428 assumes [transfer_rule]: "right_total A" |
|
429 assumes [transfer_rule]: "right_total B" |
|
430 assumes [transfer_rule]: "bi_unique B" |
|
431 shows "((A ===> B ===> op=) ===> implies) right_unique right_unique" |
|
432 using assms unfolding right_unique_def[abs_def] right_total_def bi_unique_def fun_rel_def |
|
433 by metis |
393 |
434 |
394 end |
435 end |
395 |
436 |
396 end |
437 end |