src/HOL/Lifting.thy
changeset 47534 06cc372a80ed
parent 47521 69f95ac85c3d
child 47535 0f94b02fda1c
equal deleted inserted replaced
47533:5afe54e05406 47534:06cc372a80ed
   326   shows "(op = ===> T) (\<lambda>x. x) Abs"
   326   shows "(op = ===> T) (\<lambda>x. x) Abs"
   327   using assms unfolding Quotient_alt_def reflp_def fun_rel_def by simp
   327   using assms unfolding Quotient_alt_def reflp_def fun_rel_def by simp
   328 
   328 
   329 text {* Generating transfer rules for a type defined with @{text "typedef"}. *}
   329 text {* Generating transfer rules for a type defined with @{text "typedef"}. *}
   330 
   330 
   331 lemma typedef_bi_unique:
   331 context
       
   332   fixes Rep Abs A T
   332   assumes type: "type_definition Rep Abs A"
   333   assumes type: "type_definition Rep Abs A"
   333   assumes T_def: "T \<equiv> (\<lambda>x y. x = Rep y)"
   334   assumes T_def: "T \<equiv> (\<lambda>(x::'a) (y::'b). x = Rep y)"
   334   shows "bi_unique T"
   335 begin
       
   336 
       
   337 lemma typedef_bi_unique: "bi_unique T"
   335   unfolding bi_unique_def T_def
   338   unfolding bi_unique_def T_def
   336   by (simp add: type_definition.Rep_inject [OF type])
   339   by (simp add: type_definition.Rep_inject [OF type])
   337 
   340 
   338 lemma typedef_right_total:
   341 lemma typedef_right_total: "right_total T"
   339   assumes T_def: "T \<equiv> (\<lambda>x y. x = Rep y)"
       
   340   shows "right_total T"
       
   341   unfolding right_total_def T_def by simp
   342   unfolding right_total_def T_def by simp
       
   343 
       
   344 lemma typedef_transfer_All: "((T ===> op =) ===> op =) (Ball A) All"
       
   345   unfolding T_def fun_rel_def
       
   346   by (metis type_definition.Rep [OF type]
       
   347     type_definition.Abs_inverse [OF type])
       
   348 
       
   349 lemma typedef_transfer_Ex: "((T ===> op =) ===> op =) (Bex A) Ex"
       
   350   unfolding T_def fun_rel_def
       
   351   by (metis type_definition.Rep [OF type]
       
   352     type_definition.Abs_inverse [OF type])
       
   353 
       
   354 lemma typedef_transfer_bforall:
       
   355   "((T ===> op =) ===> op =)
       
   356     (transfer_bforall (\<lambda>x. x \<in> A)) transfer_forall"
       
   357   unfolding transfer_bforall_def transfer_forall_def Ball_def [symmetric]
       
   358   by (rule typedef_transfer_All [OF assms])
       
   359 
       
   360 end
   342 
   361 
   343 lemma copy_type_bi_total:
   362 lemma copy_type_bi_total:
   344   assumes type: "type_definition Rep Abs UNIV"
   363   assumes type: "type_definition Rep Abs UNIV"
   345   assumes T_def: "T \<equiv> (\<lambda>x y. x = Rep y)"
   364   assumes T_def: "T \<equiv> (\<lambda>x y. x = Rep y)"
   346   shows "bi_total T"
   365   shows "bi_total T"
   347   unfolding bi_total_def T_def
   366   unfolding bi_total_def T_def
   348   by (metis type_definition.Abs_inverse [OF type] UNIV_I)
   367   by (metis type_definition.Abs_inverse [OF type] UNIV_I)
   349 
   368 
   350 lemma typedef_transfer_All:
       
   351   assumes type: "type_definition Rep Abs A"
       
   352   assumes T_def: "T \<equiv> (\<lambda>x y. x = Rep y)"
       
   353   shows "((T ===> op =) ===> op =) (Ball A) All"
       
   354   unfolding T_def fun_rel_def
       
   355   by (metis type_definition.Rep [OF type]
       
   356     type_definition.Abs_inverse [OF type])
       
   357 
       
   358 lemma typedef_transfer_Ex:
       
   359   assumes type: "type_definition Rep Abs A"
       
   360   assumes T_def: "T \<equiv> (\<lambda>x y. x = Rep y)"
       
   361   shows "((T ===> op =) ===> op =) (Bex A) Ex"
       
   362   unfolding T_def fun_rel_def
       
   363   by (metis type_definition.Rep [OF type]
       
   364     type_definition.Abs_inverse [OF type])
       
   365 
       
   366 lemma typedef_transfer_bforall:
       
   367   assumes type: "type_definition Rep Abs A"
       
   368   assumes T_def: "T \<equiv> (\<lambda>x y. x = Rep y)"
       
   369   shows "((T ===> op =) ===> op =)
       
   370     (transfer_bforall (\<lambda>x. x \<in> A)) transfer_forall"
       
   371   unfolding transfer_bforall_def transfer_forall_def Ball_def [symmetric]
       
   372   by (rule typedef_transfer_All [OF assms])
       
   373 
       
   374 text {* Generating the correspondence rule for a constant defined with
   369 text {* Generating the correspondence rule for a constant defined with
   375   @{text "lift_definition"}. *}
   370   @{text "lift_definition"}. *}
   376 
   371 
   377 lemma Quotient_to_transfer:
   372 lemma Quotient_to_transfer:
   378   assumes "Quotient R Abs Rep T" and "R c c" and "c' \<equiv> Abs c"
   373   assumes "Quotient R Abs Rep T" and "R c c" and "c' \<equiv> Abs c"