src/HOL/Transfer.thy
changeset 53952 b2781a3ce958
parent 53944 50c8f7f21327
child 55084 8ee9aabb2bca
equal deleted inserted replaced
53951:03b74ef6d7c6 53952:b2781a3ce958
   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