diff -r db041670d6bb -r f40bc75b2a3f src/HOL/Library/FSet.thy --- a/src/HOL/Library/FSet.thy Wed May 10 08:59:44 2023 +0200 +++ b/src/HOL/Library/FSet.thy Tue May 16 14:16:20 2023 +0200 @@ -208,258 +208,768 @@ lift_definition sorted_list_of_fset :: "'a::linorder fset \ 'a list" is sorted_list_of_set . + subsection \Transferred lemmas from Set.thy\ -lemmas fset_eqI = set_eqI[Transfer.transferred] -lemmas fset_eq_iff[no_atp] = set_eq_iff[Transfer.transferred] -lemmas fBallI[intro!] = ballI[Transfer.transferred] -lemmas fbspec[dest?] = bspec[Transfer.transferred] -lemmas fBallE[elim] = ballE[Transfer.transferred] -lemmas fBexI[intro] = bexI[Transfer.transferred] -lemmas rev_fBexI[intro?] = rev_bexI[Transfer.transferred] -lemmas fBexCI = bexCI[Transfer.transferred] -lemmas fBexE[elim!] = bexE[Transfer.transferred] -lemmas fBall_triv[simp] = ball_triv[Transfer.transferred] -lemmas fBex_triv[simp] = bex_triv[Transfer.transferred] -lemmas fBex_triv_one_point1[simp] = bex_triv_one_point1[Transfer.transferred] -lemmas fBex_triv_one_point2[simp] = bex_triv_one_point2[Transfer.transferred] -lemmas fBex_one_point1[simp] = bex_one_point1[Transfer.transferred] -lemmas fBex_one_point2[simp] = bex_one_point2[Transfer.transferred] -lemmas fBall_one_point1[simp] = ball_one_point1[Transfer.transferred] -lemmas fBall_one_point2[simp] = ball_one_point2[Transfer.transferred] -lemmas fBall_conj_distrib = ball_conj_distrib[Transfer.transferred] -lemmas fBex_disj_distrib = bex_disj_distrib[Transfer.transferred] -lemmas fBall_cong[fundef_cong] = ball_cong[Transfer.transferred] -lemmas fBex_cong[fundef_cong] = bex_cong[Transfer.transferred] -lemmas fsubsetI[intro!] = subsetI[Transfer.transferred] -lemmas fsubsetD[elim, intro?] = subsetD[Transfer.transferred] -lemmas rev_fsubsetD[no_atp,intro?] = rev_subsetD[Transfer.transferred] -lemmas fsubsetCE[no_atp,elim] = subsetCE[Transfer.transferred] -lemmas fsubset_eq[no_atp] = subset_eq[Transfer.transferred] -lemmas contra_fsubsetD[no_atp] = contra_subsetD[Transfer.transferred] -lemmas fsubset_refl = subset_refl[Transfer.transferred] -lemmas fsubset_trans = subset_trans[Transfer.transferred] -lemmas fset_rev_mp = rev_subsetD[Transfer.transferred] -lemmas fset_mp = subsetD[Transfer.transferred] -lemmas fsubset_not_fsubset_eq[code] = subset_not_subset_eq[Transfer.transferred] -lemmas eq_fmem_trans = eq_mem_trans[Transfer.transferred] -lemmas fsubset_antisym[intro!] = subset_antisym[Transfer.transferred] -lemmas fequalityD1 = equalityD1[Transfer.transferred] -lemmas fequalityD2 = equalityD2[Transfer.transferred] -lemmas fequalityE = equalityE[Transfer.transferred] -lemmas fequalityCE[elim] = equalityCE[Transfer.transferred] -lemmas eqfset_imp_iff = eqset_imp_iff[Transfer.transferred] -lemmas eqfelem_imp_iff = eqelem_imp_iff[Transfer.transferred] -lemmas fempty_iff[simp] = empty_iff[Transfer.transferred] -lemmas fempty_fsubsetI[iff] = empty_subsetI[Transfer.transferred] -lemmas equalsffemptyI = equals0I[Transfer.transferred] -lemmas equalsffemptyD = equals0D[Transfer.transferred] -lemmas fBall_fempty[simp] = ball_empty[Transfer.transferred] -lemmas fBex_fempty[simp] = bex_empty[Transfer.transferred] -lemmas fPow_iff[iff] = Pow_iff[Transfer.transferred] -lemmas fPowI = PowI[Transfer.transferred] -lemmas fPowD = PowD[Transfer.transferred] -lemmas fPow_bottom = Pow_bottom[Transfer.transferred] -lemmas fPow_top = Pow_top[Transfer.transferred] -lemmas fPow_not_fempty = Pow_not_empty[Transfer.transferred] -lemmas finter_iff[simp] = Int_iff[Transfer.transferred] -lemmas finterI[intro!] = IntI[Transfer.transferred] -lemmas finterD1 = IntD1[Transfer.transferred] -lemmas finterD2 = IntD2[Transfer.transferred] -lemmas finterE[elim!] = IntE[Transfer.transferred] -lemmas funion_iff[simp] = Un_iff[Transfer.transferred] -lemmas funionI1[elim?] = UnI1[Transfer.transferred] -lemmas funionI2[elim?] = UnI2[Transfer.transferred] -lemmas funionCI[intro!] = UnCI[Transfer.transferred] -lemmas funionE[elim!] = UnE[Transfer.transferred] -lemmas fminus_iff[simp] = Diff_iff[Transfer.transferred] -lemmas fminusI[intro!] = DiffI[Transfer.transferred] -lemmas fminusD1 = DiffD1[Transfer.transferred] -lemmas fminusD2 = DiffD2[Transfer.transferred] -lemmas fminusE[elim!] = DiffE[Transfer.transferred] -lemmas finsert_iff[simp] = insert_iff[Transfer.transferred] -lemmas finsertI1 = insertI1[Transfer.transferred] -lemmas finsertI2 = insertI2[Transfer.transferred] -lemmas finsertE[elim!] = insertE[Transfer.transferred] -lemmas finsertCI[intro!] = insertCI[Transfer.transferred] -lemmas fsubset_finsert_iff = subset_insert_iff[Transfer.transferred] -lemmas finsert_ident = insert_ident[Transfer.transferred] -lemmas fsingletonI[intro!,no_atp] = singletonI[Transfer.transferred] -lemmas fsingletonD[dest!,no_atp] = singletonD[Transfer.transferred] -lemmas fsingleton_iff = singleton_iff[Transfer.transferred] -lemmas fsingleton_inject[dest!] = singleton_inject[Transfer.transferred] -lemmas fsingleton_finsert_inj_eq[iff,no_atp] = singleton_insert_inj_eq[Transfer.transferred] -lemmas fsingleton_finsert_inj_eq'[iff,no_atp] = singleton_insert_inj_eq'[Transfer.transferred] -lemmas fsubset_fsingletonD = subset_singletonD[Transfer.transferred] -lemmas fminus_single_finsert = Diff_single_insert[Transfer.transferred] -lemmas fdoubleton_eq_iff = doubleton_eq_iff[Transfer.transferred] -lemmas funion_fsingleton_iff = Un_singleton_iff[Transfer.transferred] -lemmas fsingleton_funion_iff = singleton_Un_iff[Transfer.transferred] -lemmas fimage_eqI[simp, intro] = image_eqI[Transfer.transferred] -lemmas fimageI = imageI[Transfer.transferred] -lemmas rev_fimage_eqI = rev_image_eqI[Transfer.transferred] -lemmas fimageE[elim!] = imageE[Transfer.transferred] -lemmas Compr_fimage_eq = Compr_image_eq[Transfer.transferred] -lemmas fimage_funion = image_Un[Transfer.transferred] -lemmas fimage_iff = image_iff[Transfer.transferred] -lemmas fimage_fsubset_iff[no_atp] = image_subset_iff[Transfer.transferred] -lemmas fimage_fsubsetI = image_subsetI[Transfer.transferred] -lemmas fimage_ident[simp] = image_ident[Transfer.transferred] -lemmas if_split_fmem1 = if_split_mem1[Transfer.transferred] -lemmas if_split_fmem2 = if_split_mem2[Transfer.transferred] -lemmas pfsubsetI[intro!,no_atp] = psubsetI[Transfer.transferred] -lemmas pfsubsetE[elim!,no_atp] = psubsetE[Transfer.transferred] -lemmas pfsubset_finsert_iff = psubset_insert_iff[Transfer.transferred] -lemmas pfsubset_eq = psubset_eq[Transfer.transferred] -lemmas pfsubset_imp_fsubset = psubset_imp_subset[Transfer.transferred] -lemmas pfsubset_trans = psubset_trans[Transfer.transferred] -lemmas pfsubsetD = psubsetD[Transfer.transferred] -lemmas pfsubset_fsubset_trans = psubset_subset_trans[Transfer.transferred] -lemmas fsubset_pfsubset_trans = subset_psubset_trans[Transfer.transferred] -lemmas pfsubset_imp_ex_fmem = psubset_imp_ex_mem[Transfer.transferred] -lemmas fimage_fPow_mono = image_Pow_mono[Transfer.transferred] -lemmas fimage_fPow_surj = image_Pow_surj[Transfer.transferred] -lemmas fsubset_finsertI = subset_insertI[Transfer.transferred] -lemmas fsubset_finsertI2 = subset_insertI2[Transfer.transferred] -lemmas fsubset_finsert = subset_insert[Transfer.transferred] -lemmas funion_upper1 = Un_upper1[Transfer.transferred] -lemmas funion_upper2 = Un_upper2[Transfer.transferred] -lemmas funion_least = Un_least[Transfer.transferred] -lemmas finter_lower1 = Int_lower1[Transfer.transferred] -lemmas finter_lower2 = Int_lower2[Transfer.transferred] -lemmas finter_greatest = Int_greatest[Transfer.transferred] -lemmas fminus_fsubset = Diff_subset[Transfer.transferred] -lemmas fminus_fsubset_conv = Diff_subset_conv[Transfer.transferred] -lemmas fsubset_fempty[simp] = subset_empty[Transfer.transferred] -lemmas not_pfsubset_fempty[iff] = not_psubset_empty[Transfer.transferred] -lemmas finsert_is_funion = insert_is_Un[Transfer.transferred] -lemmas finsert_not_fempty[simp] = insert_not_empty[Transfer.transferred] -lemmas fempty_not_finsert = empty_not_insert[Transfer.transferred] -lemmas finsert_absorb = insert_absorb[Transfer.transferred] -lemmas finsert_absorb2[simp] = insert_absorb2[Transfer.transferred] -lemmas finsert_commute = insert_commute[Transfer.transferred] -lemmas finsert_fsubset[simp] = insert_subset[Transfer.transferred] -lemmas finsert_inter_finsert[simp] = insert_inter_insert[Transfer.transferred] -lemmas finsert_disjoint[simp,no_atp] = insert_disjoint[Transfer.transferred] -lemmas disjoint_finsert[simp,no_atp] = disjoint_insert[Transfer.transferred] -lemmas fimage_fempty[simp] = image_empty[Transfer.transferred] -lemmas fimage_finsert[simp] = image_insert[Transfer.transferred] -lemmas fimage_constant = image_constant[Transfer.transferred] -lemmas fimage_constant_conv = image_constant_conv[Transfer.transferred] -lemmas fimage_fimage = image_image[Transfer.transferred] -lemmas finsert_fimage[simp] = insert_image[Transfer.transferred] -lemmas fimage_is_fempty[iff] = image_is_empty[Transfer.transferred] -lemmas fempty_is_fimage[iff] = empty_is_image[Transfer.transferred] -lemmas fimage_cong = image_cong[Transfer.transferred] -lemmas fimage_finter_fsubset = image_Int_subset[Transfer.transferred] -lemmas fimage_fminus_fsubset = image_diff_subset[Transfer.transferred] -lemmas finter_absorb = Int_absorb[Transfer.transferred] -lemmas finter_left_absorb = Int_left_absorb[Transfer.transferred] -lemmas finter_commute = Int_commute[Transfer.transferred] -lemmas finter_left_commute = Int_left_commute[Transfer.transferred] -lemmas finter_assoc = Int_assoc[Transfer.transferred] -lemmas finter_ac = Int_ac[Transfer.transferred] -lemmas finter_absorb1 = Int_absorb1[Transfer.transferred] -lemmas finter_absorb2 = Int_absorb2[Transfer.transferred] -lemmas finter_fempty_left = Int_empty_left[Transfer.transferred] -lemmas finter_fempty_right = Int_empty_right[Transfer.transferred] -lemmas disjoint_iff_fnot_equal = disjoint_iff_not_equal[Transfer.transferred] -lemmas finter_funion_distrib = Int_Un_distrib[Transfer.transferred] -lemmas finter_funion_distrib2 = Int_Un_distrib2[Transfer.transferred] -lemmas finter_fsubset_iff[no_atp, simp] = Int_subset_iff[Transfer.transferred] -lemmas funion_absorb = Un_absorb[Transfer.transferred] -lemmas funion_left_absorb = Un_left_absorb[Transfer.transferred] -lemmas funion_commute = Un_commute[Transfer.transferred] -lemmas funion_left_commute = Un_left_commute[Transfer.transferred] -lemmas funion_assoc = Un_assoc[Transfer.transferred] -lemmas funion_ac = Un_ac[Transfer.transferred] -lemmas funion_absorb1 = Un_absorb1[Transfer.transferred] -lemmas funion_absorb2 = Un_absorb2[Transfer.transferred] -lemmas funion_fempty_left = Un_empty_left[Transfer.transferred] -lemmas funion_fempty_right = Un_empty_right[Transfer.transferred] -lemmas funion_finsert_left[simp] = Un_insert_left[Transfer.transferred] -lemmas funion_finsert_right[simp] = Un_insert_right[Transfer.transferred] -lemmas finter_finsert_left = Int_insert_left[Transfer.transferred] -lemmas finter_finsert_left_ifffempty[simp] = Int_insert_left_if0[Transfer.transferred] -lemmas finter_finsert_left_if1[simp] = Int_insert_left_if1[Transfer.transferred] -lemmas finter_finsert_right = Int_insert_right[Transfer.transferred] -lemmas finter_finsert_right_ifffempty[simp] = Int_insert_right_if0[Transfer.transferred] -lemmas finter_finsert_right_if1[simp] = Int_insert_right_if1[Transfer.transferred] -lemmas funion_finter_distrib = Un_Int_distrib[Transfer.transferred] -lemmas funion_finter_distrib2 = Un_Int_distrib2[Transfer.transferred] -lemmas funion_finter_crazy = Un_Int_crazy[Transfer.transferred] -lemmas fsubset_funion_eq = subset_Un_eq[Transfer.transferred] -lemmas funion_fempty[iff] = Un_empty[Transfer.transferred] -lemmas funion_fsubset_iff[no_atp, simp] = Un_subset_iff[Transfer.transferred] -lemmas funion_fminus_finter = Un_Diff_Int[Transfer.transferred] -lemmas ffunion_empty[simp] = Union_empty[Transfer.transferred] -lemmas ffunion_mono = Union_mono[Transfer.transferred] -lemmas ffunion_insert[simp] = Union_insert[Transfer.transferred] -lemmas fminus_finter2 = Diff_Int2[Transfer.transferred] -lemmas funion_finter_assoc_eq = Un_Int_assoc_eq[Transfer.transferred] -lemmas fBall_funion = ball_Un[Transfer.transferred] -lemmas fBex_funion = bex_Un[Transfer.transferred] -lemmas fminus_eq_fempty_iff[simp,no_atp] = Diff_eq_empty_iff[Transfer.transferred] -lemmas fminus_cancel[simp] = Diff_cancel[Transfer.transferred] -lemmas fminus_idemp[simp] = Diff_idemp[Transfer.transferred] -lemmas fminus_triv = Diff_triv[Transfer.transferred] -lemmas fempty_fminus[simp] = empty_Diff[Transfer.transferred] -lemmas fminus_fempty[simp] = Diff_empty[Transfer.transferred] -lemmas fminus_finsertffempty[simp,no_atp] = Diff_insert0[Transfer.transferred] -lemmas fminus_finsert = Diff_insert[Transfer.transferred] -lemmas fminus_finsert2 = Diff_insert2[Transfer.transferred] -lemmas finsert_fminus_if = insert_Diff_if[Transfer.transferred] -lemmas finsert_fminus1[simp] = insert_Diff1[Transfer.transferred] -lemmas finsert_fminus_single[simp] = insert_Diff_single[Transfer.transferred] -lemmas finsert_fminus = insert_Diff[Transfer.transferred] -lemmas fminus_finsert_absorb = Diff_insert_absorb[Transfer.transferred] -lemmas fminus_disjoint[simp] = Diff_disjoint[Transfer.transferred] -lemmas fminus_partition = Diff_partition[Transfer.transferred] -lemmas double_fminus = double_diff[Transfer.transferred] -lemmas funion_fminus_cancel[simp] = Un_Diff_cancel[Transfer.transferred] -lemmas funion_fminus_cancel2[simp] = Un_Diff_cancel2[Transfer.transferred] -lemmas fminus_funion = Diff_Un[Transfer.transferred] -lemmas fminus_finter = Diff_Int[Transfer.transferred] -lemmas funion_fminus = Un_Diff[Transfer.transferred] -lemmas finter_fminus = Int_Diff[Transfer.transferred] -lemmas fminus_finter_distrib = Diff_Int_distrib[Transfer.transferred] -lemmas fminus_finter_distrib2 = Diff_Int_distrib2[Transfer.transferred] -lemmas fUNIV_bool[no_atp] = UNIV_bool[Transfer.transferred] -lemmas fPow_fempty[simp] = Pow_empty[Transfer.transferred] -lemmas fPow_finsert = Pow_insert[Transfer.transferred] -lemmas funion_fPow_fsubset = Un_Pow_subset[Transfer.transferred] -lemmas fPow_finter_eq[simp] = Pow_Int_eq[Transfer.transferred] -lemmas fset_eq_fsubset = set_eq_subset[Transfer.transferred] -lemmas fsubset_iff[no_atp] = subset_iff[Transfer.transferred] -lemmas fsubset_iff_pfsubset_eq = subset_iff_psubset_eq[Transfer.transferred] -lemmas all_not_fin_conv[simp] = all_not_in_conv[Transfer.transferred] -lemmas ex_fin_conv = ex_in_conv[Transfer.transferred] -lemmas fimage_mono = image_mono[Transfer.transferred] -lemmas fPow_mono = Pow_mono[Transfer.transferred] -lemmas finsert_mono = insert_mono[Transfer.transferred] -lemmas funion_mono = Un_mono[Transfer.transferred] -lemmas finter_mono = Int_mono[Transfer.transferred] -lemmas fminus_mono = Diff_mono[Transfer.transferred] -lemmas fin_mono = in_mono[Transfer.transferred] -lemmas fthe_felem_eq[simp] = the_elem_eq[Transfer.transferred] -lemmas fLeast_mono = Least_mono[Transfer.transferred] -lemmas fbind_fbind = bind_bind[Transfer.transferred] -lemmas fempty_fbind[simp] = empty_bind[Transfer.transferred] -lemmas nonfempty_fbind_const = nonempty_bind_const[Transfer.transferred] -lemmas fbind_const = bind_const[Transfer.transferred] -lemmas ffmember_filter[simp] = member_filter[Transfer.transferred] -lemmas fequalityI = equalityI[Transfer.transferred] -lemmas fset_of_list_simps[simp] = set_simps[Transfer.transferred] -lemmas fset_of_list_append[simp] = set_append[Transfer.transferred] -lemmas fset_of_list_rev[simp] = set_rev[Transfer.transferred] -lemmas fset_of_list_map[simp] = set_map[Transfer.transferred] +lemma fset_eqI: "(\x. (x |\| A) = (x |\| B)) \ A = B" + by (rule set_eqI[Transfer.transferred]) + +lemma fset_eq_iff[no_atp]: "(A = B) = (\x. (x |\| A) = (x |\| B))" + by (rule set_eq_iff[Transfer.transferred]) + +lemma fBallI[intro!]: "(\x. x |\| A \ P x) \ fBall A P" + by (rule ballI[Transfer.transferred]) + +lemma fbspec[dest?]: "fBall A P \ x |\| A \ P x" + by (rule bspec[Transfer.transferred]) + +lemma fBallE[elim]: "fBall A P \ (P x \ Q) \ (x |\| A \ Q) \ Q" + by (rule ballE[Transfer.transferred]) + +lemma fBexI[intro]: "P x \ x |\| A \ fBex A P" + by (rule bexI[Transfer.transferred]) + +lemma rev_fBexI[intro?]: "x |\| A \ P x \ fBex A P" + by (rule rev_bexI[Transfer.transferred]) + +lemma fBexCI: "(fBall A (\x. \ P x) \ P a) \ a |\| A \ fBex A P" + by (rule bexCI[Transfer.transferred]) + +lemma fBexE[elim!]: "fBex A P \ (\x. x |\| A \ P x \ Q) \ Q" + by (rule bexE[Transfer.transferred]) + +lemma fBall_triv[simp]: "fBall A (\x. P) = ((\x. x |\| A) \ P)" + by (rule ball_triv[Transfer.transferred]) + +lemma fBex_triv[simp]: "fBex A (\x. P) = ((\x. x |\| A) \ P)" + by (rule bex_triv[Transfer.transferred]) + +lemma fBex_triv_one_point1[simp]: "fBex A (\x. x = a) = (a |\| A)" + by (rule bex_triv_one_point1[Transfer.transferred]) + +lemma fBex_triv_one_point2[simp]: "fBex A ((=) a) = (a |\| A)" + by (rule bex_triv_one_point2[Transfer.transferred]) + +lemma fBex_one_point1[simp]: "fBex A (\x. x = a \ P x) = (a |\| A \ P a)" + by (rule bex_one_point1[Transfer.transferred]) + +lemma fBex_one_point2[simp]: "fBex A (\x. a = x \ P x) = (a |\| A \ P a)" + by (rule bex_one_point2[Transfer.transferred]) + +lemma fBall_one_point1[simp]: "fBall A (\x. x = a \ P x) = (a |\| A \ P a)" + by (rule ball_one_point1[Transfer.transferred]) + +lemma fBall_one_point2[simp]: "fBall A (\x. a = x \ P x) = (a |\| A \ P a)" + by (rule ball_one_point2[Transfer.transferred]) + +lemma fBall_conj_distrib: "fBall A (\x. P x \ Q x) = (fBall A P \ fBall A Q)" + by (rule ball_conj_distrib[Transfer.transferred]) + +lemma fBex_disj_distrib: "fBex A (\x. P x \ Q x) = (fBex A P \ fBex A Q)" + by (rule bex_disj_distrib[Transfer.transferred]) + +lemma fBall_cong[fundef_cong]: "A = B \ (\x. x |\| B \ P x = Q x) \ fBall A P = fBall B Q" + by (rule ball_cong[Transfer.transferred]) + +lemma fBex_cong[fundef_cong]: "A = B \ (\x. x |\| B \ P x = Q x) \ fBex A P = fBex B Q" + by (rule bex_cong[Transfer.transferred]) + +lemma fsubsetI[intro!]: "(\x. x |\| A \ x |\| B) \ A |\| B" + by (rule subsetI[Transfer.transferred]) + +lemma fsubsetD[elim, intro?]: "A |\| B \ c |\| A \ c |\| B" + by (rule subsetD[Transfer.transferred]) + +lemma rev_fsubsetD[no_atp,intro?]: "c |\| A \ A |\| B \ c |\| B" + by (rule rev_subsetD[Transfer.transferred]) + +lemma fsubsetCE[no_atp,elim]: "A |\| B \ (c |\| A \ P) \ (c |\| B \ P) \ P" + by (rule subsetCE[Transfer.transferred]) + +lemma fsubset_eq[no_atp]: "(A |\| B) = fBall A (\x. x |\| B)" + by (rule subset_eq[Transfer.transferred]) + +lemma contra_fsubsetD[no_atp]: "A |\| B \ c |\| B \ c |\| A" + by (rule contra_subsetD[Transfer.transferred]) + +lemma fsubset_refl: "A |\| A" + by (rule subset_refl[Transfer.transferred]) + +lemma fsubset_trans: "A |\| B \ B |\| C \ A |\| C" + by (rule subset_trans[Transfer.transferred]) + +lemma fset_rev_mp: "c |\| A \ A |\| B \ c |\| B" + by (rule rev_subsetD[Transfer.transferred]) + +lemma fset_mp: "A |\| B \ c |\| A \ c |\| B" + by (rule subsetD[Transfer.transferred]) + +lemma fsubset_not_fsubset_eq[code]: "(A |\| B) = (A |\| B \ \ B |\| A)" + by (rule subset_not_subset_eq[Transfer.transferred]) + +lemma eq_fmem_trans: "a = b \ b |\| A \ a |\| A" + by (rule eq_mem_trans[Transfer.transferred]) + +lemma fsubset_antisym[intro!]: "A |\| B \ B |\| A \ A = B" + by (rule subset_antisym[Transfer.transferred]) + +lemma fequalityD1: "A = B \ A |\| B" + by (rule equalityD1[Transfer.transferred]) + +lemma fequalityD2: "A = B \ B |\| A" + by (rule equalityD2[Transfer.transferred]) + +lemma fequalityE: "A = B \ (A |\| B \ B |\| A \ P) \ P" + by (rule equalityE[Transfer.transferred]) + +lemma fequalityCE[elim]: + "A = B \ (c |\| A \ c |\| B \ P) \ (c |\| A \ c |\| B \ P) \ P" + by (rule equalityCE[Transfer.transferred]) + +lemma eqfset_imp_iff: "A = B \ (x |\| A) = (x |\| B)" + by (rule eqset_imp_iff[Transfer.transferred]) + +lemma eqfelem_imp_iff: "x = y \ (x |\| A) = (y |\| A)" + by (rule eqelem_imp_iff[Transfer.transferred]) + +lemma fempty_iff[simp]: "(c |\| {||}) = False" + by (rule empty_iff[Transfer.transferred]) + +lemma fempty_fsubsetI[iff]: "{||} |\| x" + by (rule empty_subsetI[Transfer.transferred]) + +lemma equalsffemptyI: "(\y. y |\| A \ False) \ A = {||}" + by (rule equals0I[Transfer.transferred]) + +lemma equalsffemptyD: "A = {||} \ a |\| A" + by (rule equals0D[Transfer.transferred]) + +lemma fBall_fempty[simp]: "fBall {||} P = True" + by (rule ball_empty[Transfer.transferred]) + +lemma fBex_fempty[simp]: "fBex {||} P = False" + by (rule bex_empty[Transfer.transferred]) + +lemma fPow_iff[iff]: "(A |\| fPow B) = (A |\| B)" + by (rule Pow_iff[Transfer.transferred]) + +lemma fPowI: "A |\| B \ A |\| fPow B" + by (rule PowI[Transfer.transferred]) + +lemma fPowD: "A |\| fPow B \ A |\| B" + by (rule PowD[Transfer.transferred]) + +lemma fPow_bottom: "{||} |\| fPow B" + by (rule Pow_bottom[Transfer.transferred]) + +lemma fPow_top: "A |\| fPow A" + by (rule Pow_top[Transfer.transferred]) + +lemma fPow_not_fempty: "fPow A \ {||}" + by (rule Pow_not_empty[Transfer.transferred]) + +lemma finter_iff[simp]: "(c |\| A |\| B) = (c |\| A \ c |\| B)" + by (rule Int_iff[Transfer.transferred]) + +lemma finterI[intro!]: "c |\| A \ c |\| B \ c |\| A |\| B" + by (rule IntI[Transfer.transferred]) + +lemma finterD1: "c |\| A |\| B \ c |\| A" + by (rule IntD1[Transfer.transferred]) + +lemma finterD2: "c |\| A |\| B \ c |\| B" + by (rule IntD2[Transfer.transferred]) + +lemma finterE[elim!]: "c |\| A |\| B \ (c |\| A \ c |\| B \ P) \ P" + by (rule IntE[Transfer.transferred]) + +lemma funion_iff[simp]: "(c |\| A |\| B) = (c |\| A \ c |\| B)" + by (rule Un_iff[Transfer.transferred]) + +lemma funionI1[elim?]: "c |\| A \ c |\| A |\| B" + by (rule UnI1[Transfer.transferred]) + +lemma funionI2[elim?]: "c |\| B \ c |\| A |\| B" + by (rule UnI2[Transfer.transferred]) + +lemma funionCI[intro!]: "(c |\| B \ c |\| A) \ c |\| A |\| B" + by (rule UnCI[Transfer.transferred]) + +lemma funionE[elim!]: "c |\| A |\| B \ (c |\| A \ P) \ (c |\| B \ P) \ P" + by (rule UnE[Transfer.transferred]) + +lemma fminus_iff[simp]: "(c |\| A |-| B) = (c |\| A \ c |\| B)" + by (rule Diff_iff[Transfer.transferred]) + +lemma fminusI[intro!]: "c |\| A \ c |\| B \ c |\| A |-| B" + by (rule DiffI[Transfer.transferred]) + +lemma fminusD1: "c |\| A |-| B \ c |\| A" + by (rule DiffD1[Transfer.transferred]) + +lemma fminusD2: "c |\| A |-| B \ c |\| B \ P" + by (rule DiffD2[Transfer.transferred]) + +lemma fminusE[elim!]: "c |\| A |-| B \ (c |\| A \ c |\| B \ P) \ P" + by (rule DiffE[Transfer.transferred]) + +lemma finsert_iff[simp]: "(a |\| finsert b A) = (a = b \ a |\| A)" + by (rule insert_iff[Transfer.transferred]) + +lemma finsertI1: "a |\| finsert a B" + by (rule insertI1[Transfer.transferred]) + +lemma finsertI2: "a |\| B \ a |\| finsert b B" + by (rule insertI2[Transfer.transferred]) + +lemma finsertE[elim!]: "a |\| finsert b A \ (a = b \ P) \ (a |\| A \ P) \ P" + by (rule insertE[Transfer.transferred]) + +lemma finsertCI[intro!]: "(a |\| B \ a = b) \ a |\| finsert b B" + by (rule insertCI[Transfer.transferred]) + +lemma fsubset_finsert_iff: + "(A |\| finsert x B) = (if x |\| A then A |-| {|x|} |\| B else A |\| B)" + by (rule subset_insert_iff[Transfer.transferred]) + +lemma finsert_ident: "x |\| A \ x |\| B \ (finsert x A = finsert x B) = (A = B)" + by (rule insert_ident[Transfer.transferred]) + +lemma fsingletonI[intro!,no_atp]: "a |\| {|a|}" + by (rule singletonI[Transfer.transferred]) + +lemma fsingletonD[dest!,no_atp]: "b |\| {|a|} \ b = a" + by (rule singletonD[Transfer.transferred]) + +lemma fsingleton_iff: "(b |\| {|a|}) = (b = a)" + by (rule singleton_iff[Transfer.transferred]) + +lemma fsingleton_inject[dest!]: "{|a|} = {|b|} \ a = b" + by (rule singleton_inject[Transfer.transferred]) + +lemma fsingleton_finsert_inj_eq[iff,no_atp]: "({|b|} = finsert a A) = (a = b \ A |\| {|b|})" + by (rule singleton_insert_inj_eq[Transfer.transferred]) + +lemma fsingleton_finsert_inj_eq'[iff,no_atp]: "(finsert a A = {|b|}) = (a = b \ A |\| {|b|})" + by (rule singleton_insert_inj_eq'[Transfer.transferred]) + +lemma fsubset_fsingletonD: "A |\| {|x|} \ A = {||} \ A = {|x|}" + by (rule subset_singletonD[Transfer.transferred]) + +lemma fminus_single_finsert: "A |-| {|x|} |\| B \ A |\| finsert x B" + by (rule Diff_single_insert[Transfer.transferred]) + +lemma fdoubleton_eq_iff: "({|a, b|} = {|c, d|}) = (a = c \ b = d \ a = d \ b = c)" + by (rule doubleton_eq_iff[Transfer.transferred]) + +lemma funion_fsingleton_iff: + "(A |\| B = {|x|}) = (A = {||} \ B = {|x|} \ A = {|x|} \ B = {||} \ A = {|x|} \ B = {|x|})" + by (rule Un_singleton_iff[Transfer.transferred]) + +lemma fsingleton_funion_iff: + "({|x|} = A |\| B) = (A = {||} \ B = {|x|} \ A = {|x|} \ B = {||} \ A = {|x|} \ B = {|x|})" + by (rule singleton_Un_iff[Transfer.transferred]) + +lemma fimage_eqI[simp, intro]: "b = f x \ x |\| A \ b |\| f |`| A" + by (rule image_eqI[Transfer.transferred]) + +lemma fimageI: "x |\| A \ f x |\| f |`| A" + by (rule imageI[Transfer.transferred]) + +lemma rev_fimage_eqI: "x |\| A \ b = f x \ b |\| f |`| A" + by (rule rev_image_eqI[Transfer.transferred]) + +lemma fimageE[elim!]: "b |\| f |`| A \ (\x. b = f x \ x |\| A \ thesis) \ thesis" + by (rule imageE[Transfer.transferred]) + +lemma Compr_fimage_eq: "{x. x |\| f |`| A \ P x} = f ` {x. x |\| A \ P (f x)}" + by (rule Compr_image_eq[Transfer.transferred]) + +lemma fimage_funion: "f |`| (A |\| B) = f |`| A |\| f |`| B" + by (rule image_Un[Transfer.transferred]) + +lemma fimage_iff: "(z |\| f |`| A) = fBex A (\x. z = f x)" + by (rule image_iff[Transfer.transferred]) + +lemma fimage_fsubset_iff[no_atp]: "(f |`| A |\| B) = fBall A (\x. f x |\| B)" + by (rule image_subset_iff[Transfer.transferred]) + +lemma fimage_fsubsetI: "(\x. x |\| A \ f x |\| B) \ f |`| A |\| B" + by (rule image_subsetI[Transfer.transferred]) + +lemma fimage_ident[simp]: "(\x. x) |`| Y = Y" + by (rule image_ident[Transfer.transferred]) + +lemma if_split_fmem1: "((if Q then x else y) |\| b) = ((Q \ x |\| b) \ (\ Q \ y |\| b))" + by (rule if_split_mem1[Transfer.transferred]) + +lemma if_split_fmem2: "(a |\| (if Q then x else y)) = ((Q \ a |\| x) \ (\ Q \ a |\| y))" + by (rule if_split_mem2[Transfer.transferred]) + +lemma pfsubsetI[intro!,no_atp]: "A |\| B \ A \ B \ A |\| B" + by (rule psubsetI[Transfer.transferred]) + +lemma pfsubsetE[elim!,no_atp]: "A |\| B \ (A |\| B \ \ B |\| A \ R) \ R" + by (rule psubsetE[Transfer.transferred]) + +lemma pfsubset_finsert_iff: + "(A |\| finsert x B) = + (if x |\| B then A |\| B else if x |\| A then A |-| {|x|} |\| B else A |\| B)" + by (rule psubset_insert_iff[Transfer.transferred]) + +lemma pfsubset_eq: "(A |\| B) = (A |\| B \ A \ B)" + by (rule psubset_eq[Transfer.transferred]) + +lemma pfsubset_imp_fsubset: "A |\| B \ A |\| B" + by (rule psubset_imp_subset[Transfer.transferred]) + +lemma pfsubset_trans: "A |\| B \ B |\| C \ A |\| C" + by (rule psubset_trans[Transfer.transferred]) + +lemma pfsubsetD: "A |\| B \ c |\| A \ c |\| B" + by (rule psubsetD[Transfer.transferred]) + +lemma pfsubset_fsubset_trans: "A |\| B \ B |\| C \ A |\| C" + by (rule psubset_subset_trans[Transfer.transferred]) + +lemma fsubset_pfsubset_trans: "A |\| B \ B |\| C \ A |\| C" + by (rule subset_psubset_trans[Transfer.transferred]) + +lemma pfsubset_imp_ex_fmem: "A |\| B \ \b. b |\| B |-| A" + by (rule psubset_imp_ex_mem[Transfer.transferred]) + +lemma fimage_fPow_mono: "f |`| A |\| B \ (|`|) f |`| fPow A |\| fPow B" + by (rule image_Pow_mono[Transfer.transferred]) + +lemma fimage_fPow_surj: "f |`| A = B \ (|`|) f |`| fPow A = fPow B" + by (rule image_Pow_surj[Transfer.transferred]) + +lemma fsubset_finsertI: "B |\| finsert a B" + by (rule subset_insertI[Transfer.transferred]) + +lemma fsubset_finsertI2: "A |\| B \ A |\| finsert b B" + by (rule subset_insertI2[Transfer.transferred]) + +lemma fsubset_finsert: "x |\| A \ (A |\| finsert x B) = (A |\| B)" + by (rule subset_insert[Transfer.transferred]) + +lemma funion_upper1: "A |\| A |\| B" + by (rule Un_upper1[Transfer.transferred]) + +lemma funion_upper2P: "B |\| A |\| B" + by (rule Un_upper2[Transfer.transferred]) + +lemma funion_least: "A |\| C \ B |\| C \ A |\| B |\| C" + by (rule Un_least[Transfer.transferred]) + +lemma finter_lower1: "A |\| B |\| A" + by (rule Int_lower1[Transfer.transferred]) + +lemma finter_lower2: "A |\| B |\| B" + by (rule Int_lower2[Transfer.transferred]) + +lemma finter_greatest: "C |\| A \ C |\| B \ C |\| A |\| B" + by (rule Int_greatest[Transfer.transferred]) + +lemma fminus_fsubset: "A |-| B |\| A" + by (rule Diff_subset[Transfer.transferred]) + +lemma fminus_fsubset_conv: "(A |-| B |\| C) = (A |\| B |\| C)" + by (rule Diff_subset_conv[Transfer.transferred]) + +lemma fsubset_fempty[simp]: "(A |\| {||}) = (A = {||})" + by (rule subset_empty[Transfer.transferred]) + +lemma not_pfsubset_fempty[iff]: "\ A |\| {||}" + by (rule not_psubset_empty[Transfer.transferred]) + +lemma finsert_is_funion: "finsert a A = {|a|} |\| A" + by (rule insert_is_Un[Transfer.transferred]) + +lemma finsert_not_fempty[simp]: "finsert a A \ {||}" + by (rule insert_not_empty[Transfer.transferred]) + +lemma fempty_not_finsert: "{||} \ finsert a A" + by (rule empty_not_insert[Transfer.transferred]) + +lemma finsert_absorb: "a |\| A \ finsert a A = A" + by (rule insert_absorb[Transfer.transferred]) + +lemma finsert_absorb2[simp]: "finsert x (finsert x A) = finsert x A" + by (rule insert_absorb2[Transfer.transferred]) + +lemma finsert_commute: "finsert x (finsert y A) = finsert y (finsert x A)" + by (rule insert_commute[Transfer.transferred]) + +lemma finsert_fsubset[simp]: "(finsert x A |\| B) = (x |\| B \ A |\| B)" + by (rule insert_subset[Transfer.transferred]) + +lemma finsert_inter_finsert[simp]: "finsert a A |\| finsert a B = finsert a (A |\| B)" + by (rule insert_inter_insert[Transfer.transferred]) + +lemma finsert_disjoint[simp,no_atp]: + "(finsert a A |\| B = {||}) = (a |\| B \ A |\| B = {||})" + "({||} = finsert a A |\| B) = (a |\| B \ {||} = A |\| B)" + by (rule insert_disjoint[Transfer.transferred])+ + +lemma disjoint_finsert[simp,no_atp]: + "(B |\| finsert a A = {||}) = (a |\| B \ B |\| A = {||})" + "({||} = A |\| finsert b B) = (b |\| A \ {||} = A |\| B)" + by (rule disjoint_insert[Transfer.transferred])+ + +lemma fimage_fempty[simp]: "f |`| {||} = {||}" + by (rule image_empty[Transfer.transferred]) + +lemma fimage_finsert[simp]: "f |`| finsert a B = finsert (f a) (f |`| B)" + by (rule image_insert[Transfer.transferred]) + +lemma fimage_constant: "x |\| A \ (\x. c) |`| A = {|c|}" + by (rule image_constant[Transfer.transferred]) + +lemma fimage_constant_conv: "(\x. c) |`| A = (if A = {||} then {||} else {|c|})" + by (rule image_constant_conv[Transfer.transferred]) + +lemma fimage_fimage: "f |`| g |`| A = (\x. f (g x)) |`| A" + by (rule image_image[Transfer.transferred]) + +lemma finsert_fimage[simp]: "x |\| A \ finsert (f x) (f |`| A) = f |`| A" + by (rule insert_image[Transfer.transferred]) + +lemma fimage_is_fempty[iff]: "(f |`| A = {||}) = (A = {||})" + by (rule image_is_empty[Transfer.transferred]) + +lemma fempty_is_fimage[iff]: "({||} = f |`| A) = (A = {||})" + by (rule empty_is_image[Transfer.transferred]) + +lemma fimage_cong: "M = N \ (\x. x |\| N \ f x = g x) \ f |`| M = g |`| N" + by (rule image_cong[Transfer.transferred]) + +lemma fimage_finter_fsubset: "f |`| (A |\| B) |\| f |`| A |\| f |`| B" + by (rule image_Int_subset[Transfer.transferred]) + +lemma fimage_fminus_fsubset: "f |`| A |-| f |`| B |\| f |`| (A |-| B)" + by (rule image_diff_subset[Transfer.transferred]) + +lemma finter_absorb: "A |\| A = A" + by (rule Int_absorb[Transfer.transferred]) + +lemma finter_left_absorb: "A |\| (A |\| B) = A |\| B" + by (rule Int_left_absorb[Transfer.transferred]) + +lemma finter_commute: "A |\| B = B |\| A" + by (rule Int_commute[Transfer.transferred]) + +lemma finter_left_commute: "A |\| (B |\| C) = B |\| (A |\| C)" + by (rule Int_left_commute[Transfer.transferred]) + +lemma finter_assoc: "A |\| B |\| C = A |\| (B |\| C)" + by (rule Int_assoc[Transfer.transferred]) + +lemma finter_ac: + "A |\| B |\| C = A |\| (B |\| C)" + "A |\| (A |\| B) = A |\| B" + "A |\| B = B |\| A" + "A |\| (B |\| C) = B |\| (A |\| C)" + by (rule Int_ac[Transfer.transferred])+ + +lemma finter_absorb1: "B |\| A \ A |\| B = B" + by (rule Int_absorb1[Transfer.transferred]) + +lemma finter_absorb2: "A |\| B \ A |\| B = A" + by (rule Int_absorb2[Transfer.transferred]) + +lemma finter_fempty_left: "{||} |\| B = {||}" + by (rule Int_empty_left[Transfer.transferred]) + +lemma finter_fempty_right: "A |\| {||} = {||}" + by (rule Int_empty_right[Transfer.transferred]) + +lemma disjoint_iff_fnot_equal: "(A |\| B = {||}) = fBall A (\x. fBall B ((\) x))" + by (rule disjoint_iff_not_equal[Transfer.transferred]) + +lemma finter_funion_distrib: "A |\| (B |\| C) = A |\| B |\| (A |\| C)" + by (rule Int_Un_distrib[Transfer.transferred]) + +lemma finter_funion_distrib2: "B |\| C |\| A = B |\| A |\| (C |\| A)" + by (rule Int_Un_distrib2[Transfer.transferred]) + +lemma finter_fsubset_iff[no_atp, simp]: "(C |\| A |\| B) = (C |\| A \ C |\| B)" + by (rule Int_subset_iff[Transfer.transferred]) + +lemma funion_absorb: "A |\| A = A" + by (rule Un_absorb[Transfer.transferred]) + +lemma funion_left_absorb: "A |\| (A |\| B) = A |\| B" + by (rule Un_left_absorb[Transfer.transferred]) + +lemma funion_commute: "A |\| B = B |\| A" + by (rule Un_commute[Transfer.transferred]) + +lemma funion_left_commute: "A |\| (B |\| C) = B |\| (A |\| C)" + by (rule Un_left_commute[Transfer.transferred]) + +lemma funion_assoc: "A |\| B |\| C = A |\| (B |\| C)" + by (rule Un_assoc[Transfer.transferred]) + +lemma funion_ac: + "A |\| B |\| C = A |\| (B |\| C)" + "A |\| (A |\| B) = A |\| B" + "A |\| B = B |\| A" + "A |\| (B |\| C) = B |\| (A |\| C)" + by (rule Un_ac[Transfer.transferred])+ + +lemma funion_absorb1: "A |\| B \ A |\| B = B" + by (rule Un_absorb1[Transfer.transferred]) + +lemma funion_absorb2: "B |\| A \ A |\| B = A" + by (rule Un_absorb2[Transfer.transferred]) + +lemma funion_fempty_left: "{||} |\| B = B" + by (rule Un_empty_left[Transfer.transferred]) + +lemma funion_fempty_right: "A |\| {||} = A" + by (rule Un_empty_right[Transfer.transferred]) + +lemma funion_finsert_left[simp]: "finsert a B |\| C = finsert a (B |\| C)" + by (rule Un_insert_left[Transfer.transferred]) + +lemma funion_finsert_right[simp]: "A |\| finsert a B = finsert a (A |\| B)" + by (rule Un_insert_right[Transfer.transferred]) + +lemma finter_finsert_left: "finsert a B |\| C = (if a |\| C then finsert a (B |\| C) else B |\| C)" + by (rule Int_insert_left[Transfer.transferred]) + +lemma finter_finsert_left_ifffempty[simp]: "a |\| C \ finsert a B |\| C = B |\| C" + by (rule Int_insert_left_if0[Transfer.transferred]) + +lemma finter_finsert_left_if1[simp]: "a |\| C \ finsert a B |\| C = finsert a (B |\| C)" + by (rule Int_insert_left_if1[Transfer.transferred]) + +lemma finter_finsert_right: + "A |\| finsert a B = (if a |\| A then finsert a (A |\| B) else A |\| B)" + by (rule Int_insert_right[Transfer.transferred]) + +lemma finter_finsert_right_ifffempty[simp]: "a |\| A \ A |\| finsert a B = A |\| B" + by (rule Int_insert_right_if0[Transfer.transferred]) + +lemma finter_finsert_right_if1[simp]: "a |\| A \ A |\| finsert a B = finsert a (A |\| B)" + by (rule Int_insert_right_if1[Transfer.transferred]) + +lemma funion_finter_distrib: "A |\| (B |\| C) = A |\| B |\| (A |\| C)" + by (rule Un_Int_distrib[Transfer.transferred]) + +lemma funion_finter_distrib2: "B |\| C |\| A = B |\| A |\| (C |\| A)" + by (rule Un_Int_distrib2[Transfer.transferred]) + +lemma funion_finter_crazy: + "A |\| B |\| (B |\| C) |\| (C |\| A) = A |\| B |\| (B |\| C) |\| (C |\| A)" + by (rule Un_Int_crazy[Transfer.transferred]) + +lemma fsubset_funion_eq: "(A |\| B) = (A |\| B = B)" + by (rule subset_Un_eq[Transfer.transferred]) + +lemma funion_fempty[iff]: "(A |\| B = {||}) = (A = {||} \ B = {||})" + by (rule Un_empty[Transfer.transferred]) + +lemma funion_fsubset_iff[no_atp, simp]: "(A |\| B |\| C) = (A |\| C \ B |\| C)" + by (rule Un_subset_iff[Transfer.transferred]) + +lemma funion_fminus_finter: "A |-| B |\| (A |\| B) = A" + by (rule Un_Diff_Int[Transfer.transferred]) + +lemma ffunion_empty[simp]: "ffUnion {||} = {||}" + by (rule Union_empty[Transfer.transferred]) + +lemma ffunion_mono: "A |\| B \ ffUnion A |\| ffUnion B" + by (rule Union_mono[Transfer.transferred]) + +lemma ffunion_insert[simp]: "ffUnion (finsert a B) = a |\| ffUnion B" + by (rule Union_insert[Transfer.transferred]) + +lemma fminus_finter2: "A |\| C |-| (B |\| C) = A |\| C |-| B" + by (rule Diff_Int2[Transfer.transferred]) + +lemma funion_finter_assoc_eq: "(A |\| B |\| C = A |\| (B |\| C)) = (C |\| A)" + by (rule Un_Int_assoc_eq[Transfer.transferred]) + +lemma fBall_funion: "fBall (A |\| B) P = (fBall A P \ fBall B P)" + by (rule ball_Un[Transfer.transferred]) + +lemma fBex_funion: "fBex (A |\| B) P = (fBex A P \ fBex B P)" + by (rule bex_Un[Transfer.transferred]) + +lemma fminus_eq_fempty_iff[simp,no_atp]: "(A |-| B = {||}) = (A |\| B)" + by (rule Diff_eq_empty_iff[Transfer.transferred]) + +lemma fminus_cancel[simp]: "A |-| A = {||}" + by (rule Diff_cancel[Transfer.transferred]) + +lemma fminus_idemp[simp]: "A |-| B |-| B = A |-| B" + by (rule Diff_idemp[Transfer.transferred]) + +lemma fminus_triv: "A |\| B = {||} \ A |-| B = A" + by (rule Diff_triv[Transfer.transferred]) + +lemma fempty_fminus[simp]: "{||} |-| A = {||}" + by (rule empty_Diff[Transfer.transferred]) + +lemma fminus_fempty[simp]: "A |-| {||} = A" + by (rule Diff_empty[Transfer.transferred]) + +lemma fminus_finsertffempty[simp,no_atp]: "x |\| A \ A |-| finsert x B = A |-| B" + by (rule Diff_insert0[Transfer.transferred]) + +lemma fminus_finsert: "A |-| finsert a B = A |-| B |-| {|a|}" + by (rule Diff_insert[Transfer.transferred]) + +lemma fminus_finsert2: "A |-| finsert a B = A |-| {|a|} |-| B" + by (rule Diff_insert2[Transfer.transferred]) + +lemma finsert_fminus_if: "finsert x A |-| B = (if x |\| B then A |-| B else finsert x (A |-| B))" + by (rule insert_Diff_if[Transfer.transferred]) + +lemma finsert_fminus1[simp]: "x |\| B \ finsert x A |-| B = A |-| B" + by (rule insert_Diff1[Transfer.transferred]) + +lemma finsert_fminus_single[simp]: "finsert a (A |-| {|a|}) = finsert a A" + by (rule insert_Diff_single[Transfer.transferred]) + +lemma finsert_fminus: "a |\| A \ finsert a (A |-| {|a|}) = A" + by (rule insert_Diff[Transfer.transferred]) + +lemma fminus_finsert_absorb: "x |\| A \ finsert x A |-| {|x|} = A" + by (rule Diff_insert_absorb[Transfer.transferred]) + +lemma fminus_disjoint[simp]: "A |\| (B |-| A) = {||}" + by (rule Diff_disjoint[Transfer.transferred]) + +lemma fminus_partition: "A |\| B \ A |\| (B |-| A) = B" + by (rule Diff_partition[Transfer.transferred]) + +lemma double_fminus: "A |\| B \ B |\| C \ B |-| (C |-| A) = A" + by (rule double_diff[Transfer.transferred]) + +lemma funion_fminus_cancel[simp]: "A |\| (B |-| A) = A |\| B" + by (rule Un_Diff_cancel[Transfer.transferred]) + +lemma funion_fminus_cancel2[simp]: "B |-| A |\| A = B |\| A" + by (rule Un_Diff_cancel2[Transfer.transferred]) + +lemma fminus_funion: "A |-| (B |\| C) = A |-| B |\| (A |-| C)" + by (rule Diff_Un[Transfer.transferred]) + +lemma fminus_finter: "A |-| (B |\| C) = A |-| B |\| (A |-| C)" + by (rule Diff_Int[Transfer.transferred]) + +lemma funion_fminus: "A |\| B |-| C = A |-| C |\| (B |-| C)" + by (rule Un_Diff[Transfer.transferred]) + +lemma finter_fminus: "A |\| B |-| C = A |\| (B |-| C)" + by (rule Int_Diff[Transfer.transferred]) + +lemma fminus_finter_distrib: "C |\| (A |-| B) = C |\| A |-| (C |\| B)" + by (rule Diff_Int_distrib[Transfer.transferred]) + +lemma fminus_finter_distrib2: "A |-| B |\| C = A |\| C |-| (B |\| C)" + by (rule Diff_Int_distrib2[Transfer.transferred]) + +lemma fUNIV_bool[no_atp]: "fUNIV = {|False, True|}" + by (rule UNIV_bool[Transfer.transferred]) + +lemma fPow_fempty[simp]: "fPow {||} = {|{||}|}" + by (rule Pow_empty[Transfer.transferred]) + +lemma fPow_finsert: "fPow (finsert a A) = fPow A |\| finsert a |`| fPow A" + by (rule Pow_insert[Transfer.transferred]) + +lemma funion_fPow_fsubset: "fPow A |\| fPow B |\| fPow (A |\| B)" + by (rule Un_Pow_subset[Transfer.transferred]) + +lemma fPow_finter_eq[simp]: "fPow (A |\| B) = fPow A |\| fPow B" + by (rule Pow_Int_eq[Transfer.transferred]) + +lemma fset_eq_fsubset: "(A = B) = (A |\| B \ B |\| A)" + by (rule set_eq_subset[Transfer.transferred]) + +lemma fsubset_iff[no_atp]: "(A |\| B) = (\t. t |\| A \ t |\| B)" + by (rule subset_iff[Transfer.transferred]) + +lemma fsubset_iff_pfsubset_eq: "(A |\| B) = (A |\| B \ A = B)" + by (rule subset_iff_psubset_eq[Transfer.transferred]) + +lemma all_not_fin_conv[simp]: "(\x. x |\| A) = (A = {||})" + by (rule all_not_in_conv[Transfer.transferred]) + +lemma ex_fin_conv: "(\x. x |\| A) = (A \ {||})" + by (rule ex_in_conv[Transfer.transferred]) + +lemma fimage_mono: "A |\| B \ f |`| A |\| f |`| B" + by (rule image_mono[Transfer.transferred]) + +lemma fPow_mono: "A |\| B \ fPow A |\| fPow B" + by (rule Pow_mono[Transfer.transferred]) + +lemma finsert_mono: "C |\| D \ finsert a C |\| finsert a D" + by (rule insert_mono[Transfer.transferred]) + +lemma funion_mono: "A |\| C \ B |\| D \ A |\| B |\| C |\| D" + by (rule Un_mono[Transfer.transferred]) + +lemma finter_mono: "A |\| C \ B |\| D \ A |\| B |\| C |\| D" + by (rule Int_mono[Transfer.transferred]) + +lemma fminus_mono: "A |\| C \ D |\| B \ A |-| B |\| C |-| D" + by (rule Diff_mono[Transfer.transferred]) + +lemma fin_mono: "A |\| B \ x |\| A \ x |\| B" + by (rule in_mono[Transfer.transferred]) + +lemma fthe_felem_eq[simp]: "fthe_elem {|x|} = x" + by (rule the_elem_eq[Transfer.transferred]) + +lemma fLeast_mono: + "mono f \ fBex S (\x. fBall S ((\) x)) \ (LEAST y. y |\| f |`| S) = f (LEAST x. x |\| S)" + by (rule Least_mono[Transfer.transferred]) + +lemma fbind_fbind: "fbind (fbind A B) C = fbind A (\x. fbind (B x) C)" + by (rule Set.bind_bind[Transfer.transferred]) + +lemma fempty_fbind[simp]: "fbind {||} f = {||}" + by (rule empty_bind[Transfer.transferred]) + +lemma nonfempty_fbind_const: "A \ {||} \ fbind A (\_. B) = B" + by (rule nonempty_bind_const[Transfer.transferred]) + +lemma fbind_const: "fbind A (\_. B) = (if A = {||} then {||} else B)" + by (rule bind_const[Transfer.transferred]) + +lemma ffmember_filter[simp]: "(x |\| ffilter P A) = (x |\| A \ P x)" + by (rule member_filter[Transfer.transferred]) + +lemma fequalityI: "A |\| B \ B |\| A \ A = B" + by (rule equalityI[Transfer.transferred]) + +lemma fset_of_list_simps[simp]: + "fset_of_list [] = {||}" + "fset_of_list (x21 # x22) = finsert x21 (fset_of_list x22)" + by (rule set_simps[Transfer.transferred])+ + +lemma fset_of_list_append[simp]: "fset_of_list (xs @ ys) = fset_of_list xs |\| fset_of_list ys" + by (rule set_append[Transfer.transferred]) + +lemma fset_of_list_rev[simp]: "fset_of_list (rev xs) = fset_of_list xs" + by (rule set_rev[Transfer.transferred]) + +lemma fset_of_list_map[simp]: "fset_of_list (map f xs) = f |`| fset_of_list xs" + by (rule set_map[Transfer.transferred]) subsection \Additional lemmas\ subsubsection \\ffUnion\\ -lemmas ffUnion_funion_distrib[simp] = Union_Un_distrib[Transfer.transferred] +lemma ffUnion_funion_distrib[simp]: "ffUnion (A |\| B) = ffUnion A |\| ffUnion B" + by (rule Union_Un_distrib[Transfer.transferred]) subsubsection \\fbind\\ @@ -470,7 +980,8 @@ subsubsection \\fsingleton\\ -lemmas fsingletonE = fsingletonD [elim_format] +lemma fsingletonE: " b |\| {|a|} \ (b = a \ thesis) \ thesis" + by (rule fsingletonD [elim_format]) subsubsection \\femepty\\ @@ -485,7 +996,10 @@ subsubsection \\fset\\ -lemmas fset_simps[simp] = bot_fset.rep_eq finsert.rep_eq +lemma fset_simps[simp]: + "fset {||} = {}" + "fset (finsert x X) = insert x (fset X)" + by (rule bot_fset.rep_eq finsert.rep_eq)+ lemma finite_fset [simp]: shows "finite (fset S)" @@ -500,11 +1014,14 @@ lemma notin_fset: "x |\| S \ x \ fset S" by (simp add: fmember_iff_member_fset) -lemmas inter_fset[simp] = inf_fset.rep_eq - -lemmas union_fset[simp] = sup_fset.rep_eq - -lemmas minus_fset[simp] = minus_fset.rep_eq +lemma inter_fset[simp]: "fset (A |\| B) = fset A \ fset B" + by (rule inf_fset.rep_eq) + +lemma union_fset[simp]: "fset (A |\| B) = fset A \ fset B" + by (rule sup_fset.rep_eq) + +lemma minus_fset[simp]: "fset (A |-| B) = fset A - fset B" + by (rule minus_fset.rep_eq) subsubsection \\ffilter\\ @@ -720,7 +1237,8 @@ context comp_fun_commute begin - lemmas ffold_empty[simp] = fold_empty[Transfer.transferred] + lemma ffold_empty[simp]: "ffold f z {||} = z" + by (rule fold_empty[Transfer.transferred]) lemma ffold_finsert [simp]: assumes "x |\| A" @@ -792,7 +1310,8 @@ lift_definition F :: "('b \ 'a) \ 'b fset \ 'a" is set.F . -lemmas cong[fundef_cong] = set.cong[Transfer.transferred] +lemma cong[fundef_cong]: "A = B \ (\x. x |\| B \ g x = h x) \ F g A = F h B" + by (rule set.cong[Transfer.transferred]) lemma cong_simp[cong]: "\ A = B; \x. x |\| B =simp=> g x = h x \ \ F g A = F h B" @@ -1048,7 +1567,9 @@ context includes lifting_syntax begin -lemmas fempty_transfer [transfer_rule] = empty_transfer[Transfer.transferred] +lemma fempty_transfer [transfer_rule]: + "rel_fset A {||} {||}" + by (rule empty_transfer[Transfer.transferred]) lemma finsert_transfer [transfer_rule]: "(A ===> rel_fset A ===> rel_fset A) finsert finsert" @@ -1219,7 +1740,10 @@ end -lemmas [simp] = fset.map_comp fset.map_id fset.set_map +declare + fset.map_comp[simp] + fset.map_id[simp] + fset.set_map[simp] subsection \Size setup\ @@ -1234,13 +1758,13 @@ instance .. end -lemmas size_fset_simps[simp] = - size_fset_def[THEN meta_eq_to_obj_eq, THEN fun_cong, THEN fun_cong, - unfolded map_fun_def comp_def id_apply] - -lemmas size_fset_overloaded_simps[simp] = - size_fset_simps[of "\_. 0", unfolded add_0_left add_0_right, - folded size_fset_overloaded_def] +lemma size_fset_simps[simp]: "size_fset f X = (\x \ fset X. Suc (f x))" + by (rule size_fset_def[THEN meta_eq_to_obj_eq, THEN fun_cong, THEN fun_cong, + unfolded map_fun_def comp_def id_apply]) + +lemma size_fset_overloaded_simps[simp]: "size X = (\x \ fset X. Suc 0)" + by (rule size_fset_simps[of "\_. 0", unfolded add_0_left add_0_right, + folded size_fset_overloaded_def]) lemma fset_size_o_map: "inj f \ size_fset g \ fimage f = size_fset (g \ f)" apply (subst fun_eq_iff)