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" |