(* Title: HOL/Library/FSet.thy Author: Ondrej Kuncar, TU Muenchen Author: Cezary Kaliszyk and Christian Urban Author: Andrei Popescu, TU Muenchen Author: Martin Desharnais, MPI-INF Saarbruecken *)
section‹Type of finite sets defined as a subtype of sets›
theory FSet imports Main Countable begin
subsection‹Definition of the type›
typedef 'a fset = "{A :: 'a set. finite A}"morphisms fset Abs_fset by auto
setup_lifting type_definition_fset
subsection‹Basic operations and type class instantiations›
(* FIXME transfer and right_total vs. bi_total *) instantiation fset :: (finite) finite begin instanceby (standard; transfer; simp) end
instantiation fset :: (type) "{bounded_lattice_bot, distrib_lattice, minus}" begin
lift_definition bot_fset :: "'a fset"is"{}" parametric empty_transfer by simp
instantiation fset :: (equal) equal begin definition"HOL.equal A B ⟷ A |⊆| B ∧ B |⊆| A" instanceby intro_classes (auto simp add: equal_fset_def) end
instantiation fset :: (type) conditionally_complete_lattice begin
contextincludes lifting_syntax begin
lemma right_total_Inf_fset_transfer: assumes [transfer_rule]: "bi_unique A"and [transfer_rule]: "right_total A" shows"(rel_set (rel_set A) ===> rel_set A) (λS. if finite (∩S ∩ Collect (Domainp A)) then ∩S ∩ Collect (Domainp A) else {}) (λS. if finite (Inf S) then Inf S else {})" by transfer_prover
lemma Inf_fset_transfer: assumes [transfer_rule]: "bi_unique A"and [transfer_rule]: "bi_total A" shows"(rel_set (rel_set A) ===> rel_set A) (λA. if finite (Inf A) then Inf A else {}) (λA. if finite (Inf A) then Inf A else {})" by transfer_prover
lift_definition Inf_fset :: "'a fset set ==> 'a fset"is"λA. if finite (Inf A) then Inf A else {}"
parametric right_total_Inf_fset_transfer Inf_fset_transfer by simp
lemma Sup_fset_transfer: assumes [transfer_rule]: "bi_unique A" shows"(rel_set (rel_set A) ===> rel_set A) (λA. if finite (Sup A) then Sup A else {}) (λA. if finite (Sup A) then Sup A else {})"by transfer_prover
lift_definition Sup_fset :: "'a fset set ==> 'a fset"is"λA. if finite (Sup A) then Sup A else {}"
parametric Sup_fset_transfer by simp
lemma finite_Sup: "∃z. finite z ∧ (∀a. a ∈ X ⟶ a ≤ z) ==> finite (Sup X)" by (auto intro: finite_subset)
lemma transfer_bdd_below[transfer_rule]: "(rel_set (pcr_fset (=)) ===> (=)) bdd_below bdd_below" by auto
end
instance proof fix x z :: "'a fset" fix X :: "'a fset set"
{ assume"x ∈ X""bdd_below X" thenshow"Inf X |⊆| x"by transfer auto next assume"X ≠ {}""(∧x. x ∈ X ==> z |⊆| x)" thenshow"z |⊆| Inf X"by transfer (clarsimp, blast) next assume"x ∈ X""bdd_above X" thenobtain z where"x ∈ X""(∧x. x ∈ X ==> x |⊆| z)" by (auto simp: bdd_above_def) thenshow"x |⊆| Sup X" by transfer (auto intro!: finite_Sup) next assume"X ≠ {}""(∧x. x ∈ X ==> x |⊆| z)" thenshow"Sup X |⊆| z"by transfer (clarsimp, blast)
} qed end
instantiation fset :: (finite) complete_lattice begin
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_upper2: "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 transfer simp
lemma fequalityI: "A |⊆| B ==> B |⊆| A ==> A = B" by (rule equalityI[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›\ lemma ffUnion_funion_distrib[simp]: "ffUnion (A |∪| B) = ffUnion A |∪| ffUnion B" by (rule Union_Un_distrib[Transfer.transferred])
subsubsection ‹‹fbind›\›
lemma fbind_cong[fundef_cong]: "A = B ==> (∧x. x |∈| B ==> f x = g x) ==> fbind A f = fbind B g" by transfer force
subsubsection ‹‹fsingleton›\›
lemma fsingletonE: " b |∈| {|a|} ==> (b = a ==> thesis) ==> thesis" by (rule fsingletonD [elim_format])
subsubsection ‹‹femepty›\›
lemma fempty_ffilter[simp]: "ffilter (λ_. False) A = {||}" by transfer auto
(* FIXME, transferred doesn't work here *) lemma femptyE [elim!]: "a |∈| {||} ==> P" by simp
subsubsection ‹‹fset›\ 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)" by transfer simp
lemmas fset_cong = fset_inject
lemma filter_fset [simp]: shows"fset (ffilter P xs) = Collect P ∩ fset xs" by transfer auto
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›\›
lemma subset_ffilter: "ffilter P A |⊆| ffilter Q A = (∀ x. x |∈| A ⟶ P x ⟶ Q x)" by transfer auto
lemma eq_ffilter: "(ffilter P A = ffilter Q A) = (∀x. x |∈| A ⟶ P x = Q x)" by transfer auto
lemma pfsubset_ffilter: "(∧x. x |∈| A ==> P x ==> Q x) ==> (x |∈| A ∧¬ P x ∧ Q x) ==> ffilter P A |⊂| ffilter Q A" unfolding less_fset_def by (auto simp add: subset_ffilter eq_ffilter)
subsubsection ‹‹fset_of_list›\›
lemma fset_of_list_filter[simp]: "fset_of_list (filter P xs) = ffilter P (fset_of_list xs)" by transfer auto
lemma fset_of_list_subset[intro]: "set xs ⊆ set ys ==> fset_of_list xs |⊆| fset_of_list ys" by transfer simp
lemma fset_of_list_elem: "(x |∈| fset_of_list xs) ⟷ (x ∈ set xs)" by transfer simp
subsubsection ‹‹finsert›\›
(* FIXME, transferred doesn't work here *) lemma set_finsert: assumes"x |∈| A" obtains B where"A = finsert x B"and"x |∉| B" using assms by transfer (metis Set.set_insert finite_insert)
lemma mk_disjoint_finsert: "a |∈| A ==>∃B. A = finsert a B ∧ a |∉| B" by (rule exI [where x = "A |-| {|a|}"]) blast
lemma finsert_eq_iff: assumes"a |∉| A"and"b |∉| B" shows"(finsert a A = finsert b B) = (if a = b then A = B else ∃C. A = finsert b C ∧ b |∉| C ∧ B = finsert a C ∧ a |∉| C)" using assms by transfer (force simp: insert_eq_iff)
subsubsection ‹‹fimage›\ lemma subset_fimage_iff: "(B |⊆| f|`|A) = (∃ AA. AA |⊆| A ∧ B = f|`|AA)" by transfer (metis mem_Collect_eq rev_finite_subset subset_image_iff)
lemma fimage_strict_mono: assumes"inj_on f (fset B)"and"A |⊂| B" shows"f |`| A |⊂| f |`| B" 🍋‹TODO: Configure transfer framework to lift @{thm Fun.image_strict_mono}.› proof (rule pfsubsetI) from‹A |⊂| B›have"A |⊆| B" by (rule pfsubset_imp_fsubset) thus"f |`| A |⊆| f |`| B" by (rule fimage_mono) next from‹A |⊂| B›have"A |⊆| B"and"A ≠ B" by (simp_all add: pfsubset_eq)
have"fset A ≠ fset B" using‹A ≠ B› by (simp add: fset_cong) hence"f ` fset A ≠ f ` fset B" using‹A |⊆| B› by (simp add: inj_on_image_eq_iff[OF ‹inj_on f (fset B)›] less_eq_fset.rep_eq) hence"fset (f |`| A) ≠ fset (f |`| B)" by (simp add: fimage.rep_eq) thus"f |`| A ≠ f |`| B" by (simp add: fset_cong) qed
subsubsection ‹bounded quantification›
lemma bex_simps [simp, no_atp]: "∧A P Q. fBex A (λx. P x ∧ Q) = (fBex A P ∧ Q)" "∧A P Q. fBex A (λx. P ∧ Q x) = (P ∧ fBex A Q)" "∧P. fBex {||} P = False" "∧a B P. fBex (finsert a B) P = (P a ∨ fBex B P)" "∧A P f. fBex (f |`| A) P = fBex A (λx. P (f x))" "∧A P. (¬ fBex A P) = fBall A (λx. ¬ P x)" by auto
lemma ball_simps [simp, no_atp]: "∧A P Q. fBall A (λx. P x ∨ Q) = (fBall A P ∨ Q)" "∧A P Q. fBall A (λx. P ∨ Q x) = (P ∨ fBall A Q)" "∧A P Q. fBall A (λx. P ⟶ Q x) = (P ⟶ fBall A Q)" "∧A P Q. fBall A (λx. P x ⟶ Q) = (fBex A P ⟶ Q)" "∧P. fBall {||} P = True" "∧a B P. fBall (finsert a B) P = (P a ∧ fBall B P)" "∧A P f. fBall (f |`| A) P = fBall A (λx. P (f x))" "∧A P. (¬ fBall A P) = fBex A (λx. ¬ P x)" by auto
lemma atomize_fBall: "(∧x. x |∈| A ==> P x) == Trueprop (fBall A (λx. P x))" by (simp add: Set.atomize_ball)
lemma fBall_mono[mono]: "P ≤ Q ==> fBall S P ≤ fBall S Q" by auto
lemma fBex_mono[mono]: "P ≤ Q ==> fBex S P ≤ fBex S Q" by auto
end
subsubsection ‹‹fcard›\›
(* FIXME: improve transferred to handle bounded meta quantification *)
lemma fcard_fempty: "fcard {||} = 0" by transfer (rule card.empty)
lemma fcard_finsert_disjoint: "x |∉| A ==> fcard (finsert x A) = Suc (fcard A)" by transfer (rule card_insert_disjoint)
lemma fcard_finsert_if: "fcard (finsert x A) = (if x |∈| A then fcard A else Suc (fcard A))" by transfer (rule card_insert_if)
lemma fcard_0_eq [simp, no_atp]: "fcard A = 0 ⟷ A = {||}" by transfer (rule card_0_eq)
lemma fcard_Suc_fminus1: "x |∈| A ==> Suc (fcard (A |-| {|x|})) = fcard A" by transfer (rule card_Suc_Diff1)
lemma fcard_fminus_fsingleton: "x |∈| A ==> fcard (A |-| {|x|}) = fcard A - 1" by transfer (rule card_Diff_singleton)
lemma fcard_fminus_fsingleton_if: "fcard (A |-| {|x|}) = (if x |∈| A then fcard A - 1 else fcard A)" by transfer (rule card_Diff_singleton_if)
lemma fcard_fminus_finsert[simp]: assumes"a |∈| A"and"a |∉| B" shows"fcard (A |-| finsert a B) = fcard (A |-| B) - 1" using assms by transfer (rule card_Diff_insert)
lemma fcard_finsert: "fcard (finsert x A) = Suc (fcard (A |-| {|x|}))" by transfer (rule card.insert_remove)
lemma fcard_finsert_le: "fcard A ≤ fcard (finsert x A)" by transfer (rule card_insert_le)
lemma fcard_mono: "A |⊆| B ==> fcard A ≤ fcard B" by transfer (rule card_mono)
lemma fcard_seteq: "A |⊆| B ==> fcard B ≤ fcard A ==> A = B" by transfer (rule card_seteq)
lemma pfsubset_fcard_mono: "A |⊂| B ==> fcard A < fcard B" by transfer (rule psubset_card_mono)
lemma fcard_funion_finter: "fcard A + fcard B = fcard (A |∪| B) + fcard (A |∩| B)" by transfer (rule card_Un_Int)
lemma fcard_funion_disjoint: "A |∩| B = {||} ==> fcard (A |∪| B) = fcard A + fcard B" by transfer (rule card_Un_disjoint)
lemma fcard_funion_fsubset: "B |⊆| A ==> fcard (A |-| B) = fcard A - fcard B" by transfer (rule card_Diff_subset)
lemma diff_fcard_le_fcard_fminus: "fcard A - fcard B ≤ fcard(A |-| B)" by transfer (rule diff_card_le_card_Diff)
lemma fcard_fminus1_less: "x |∈| A ==> fcard (A |-| {|x|}) < fcard A" by transfer (rule card_Diff1_less)
lemma fcard_fminus2_less: "x |∈| A ==> y |∈| A ==> fcard (A |-| {|x|} |-| {|y|}) < fcard A" by transfer (rule card_Diff2_less)
lemma fcard_fminus1_le: "fcard (A |-| {|x|}) ≤ fcard A" by transfer (rule card_Diff1_le)
lemma fcard_pfsubset: "A |⊆| B ==> fcard A < fcard B ==> A < B" by transfer (rule card_psubset)
(* FIXME: improve transferred to handle bounded meta quantification *)
context comp_fun_commute begin lemma ffold_empty[simp]: "ffold f z {||} = z" by (rule fold_empty[Transfer.transferred])
lemma ffold_finsert [simp]: assumes"x |∉| A" shows"ffold f z (finsert x A) = f x (ffold f z A)" using assms by (transfer fixing: f) (rule fold_insert)
lemma ffold_fun_left_comm: "f x (ffold f z A) = ffold f (f x z) A" by (transfer fixing: f) (rule fold_fun_left_comm)
lemma ffold_finsert2: "x |∉| A ==> ffold f z (finsert x A) = ffold f (f x z) A" by (transfer fixing: f) (rule fold_insert2)
lemma ffold_rec: assumes"x |∈| A" shows"ffold f z A = f x (ffold f z (A |-| {|x|}))" using assms by (transfer fixing: f) (rule fold_rec)
lemma ffold_finsert_fremove: "ffold f z (finsert x A) = f x (ffold f z (A |-| {|x|}))" by (transfer fixing: f) (rule fold_insert_remove) end
lemma ffold_fimage: assumes"inj_on g (fset A)" shows"ffold f z (g |`| A) = ffold (f ∘ g) z A" using assms by transfer' (rule fold_image)
lemma ffold_cong: assumes"comp_fun_commute f""comp_fun_commute g" "∧x. x |∈| A ==> f x = g x" and"s = t"and"A = B" shows"ffold f s A = ffold g t B" using assms[unfolded comp_fun_commute_def'] by transfer (meson Finite_Set.fold_cong subset_UNIV)
context comp_fun_idem begin
lemma ffold_finsert_idem: "ffold f z (finsert x A) = f x (ffold f z A)" by (transfer fixing: f) (rule fold_insert_idem)
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" unfolding simp_implies_def by (auto cong: cong)
end
context comm_monoid_add begin
sublocale fsum: comm_monoid_fset plus 0
rewrites "comm_monoid_set.F plus 0 = sum" defines fsum = fsum.F proof - show"comm_monoid_fset (+) 0"by standard
show"comm_monoid_set.F (+) 0 = sum"unfolding sum_def .. qed
end
subsubsection ‹Semilattice operations›
locale semilattice_fset = semilattice begin
sublocale set: semilattice_set ..
lift_definition F :: "'a fset ==> 'a"is set.F .
lemma eq_fold: "F (finsert x A) = ffold f x A" by transfer (rule set.eq_fold)
lemma singleton [simp]: "F {|x|} = x" by transfer (rule set.singleton)
lemma insert_not_elem: "x |∉| A ==> A ≠ {||} ==> F (finsert x A) = x 🪙* F A" by transfer (rule set.insert_not_elem)
lemma in_idem: "x |∈| A ==> x 🪙* F A = F A" by transfer (rule set.in_idem)
lemma insert [simp]: "A ≠ {||} ==> F (finsert x A) = x 🪙* F A" by transfer (rule set.insert)
end
locale semilattice_order_fset = binary?: semilattice_order + semilattice_fset begin
end
context linorder begin
sublocale fMin: semilattice_order_fset min less_eq less
rewrites "semilattice_set.F min = Min" defines fMin = fMin.F proof - show"semilattice_order_fset min (≤) (<)"by standard
show"semilattice_set.F min = Min"unfolding Min_def .. qed
sublocale fMax: semilattice_order_fset max greater_eq greater
rewrites "semilattice_set.F max = Max" defines fMax = fMax.F proof - show"semilattice_order_fset max (≥) (>)" by standard
show"semilattice_set.F max = Max" unfolding Max_def .. qed
end
lemma mono_fMax_commute: "mono f ==> A ≠ {||} ==> f (fMax A) = fMax (f |`| A)" by transfer (rule mono_Max_commute)
lemma mono_fMin_commute: "mono f ==> A ≠ {||} ==> f (fMin A) = fMin (f |`| A)" by transfer (rule mono_Min_commute)
lemma fMax_in[simp]: "A ≠ {||} ==> fMax A |∈| A" by transfer (rule Max_in)
lemma fMin_in[simp]: "A ≠ {||} ==> fMin A |∈| A" by transfer (rule Min_in)
lemma fMax_ge[simp]: "x |∈| A ==> x ≤ fMax A" by transfer (rule Max_ge)
lemma fMin_le[simp]: "x |∈| A ==> fMin A ≤ x" by transfer (rule Min_le)
lemma fMax_eqI: "(∧y. y |∈| A ==> y ≤ x) ==> x |∈| A ==> fMax A = x" by transfer (rule Max_eqI)
lemma fMin_eqI: "(∧y. y |∈| A ==> x ≤ y) ==> x |∈| A ==> fMin A = x" by transfer (rule Min_eqI)
lemma fMax_finsert[simp]: "fMax (finsert x A) = (if A = {||} then x else max x (fMax A))" by transfer simp
lemma fMin_finsert[simp]: "fMin (finsert x A) = (if A = {||} then x else min x (fMin A))" by transfer simp
context linorder begin
lemma fset_linorder_max_induct[case_names fempty finsert]: assumes"P {||}" and"∧x S. [∀y. y |∈| S ⟶ y < x; P S]==> P (finsert x S)" shows"P S" proof - (* FIXME transfer and right_total vs. bi_total *) note Domainp_forall_transfer[transfer_rule] show ?thesis using assms by (transfer fixing: less) (auto intro: finite_linorder_max_induct) qed
lemma fset_linorder_min_induct[case_names fempty finsert]: assumes"P {||}" and"∧x S. [∀y. y |∈| S ⟶ y > x; P S]==> P (finsert x S)" shows"P S" proof - (* FIXME transfer and right_total vs. bi_total *) note Domainp_forall_transfer[transfer_rule] show ?thesis using assms by (transfer fixing: less) (auto intro: finite_linorder_min_induct) qed
end
subsection‹Choice in fsets›
lemma fset_choice: assumes"∀x. x |∈| A ⟶ (∃y. P x y)" shows"∃f. ∀x. x |∈| A ⟶ P x (f x)" using assms by transfer metis
subsection‹Induction and Cases rules for fsets›
lemma fset_exhaust [case_names empty insert, cases type: fset]: assumes fempty_case: "S = {||} ==> P" and finsert_case: "∧x S'. S = finsert x S' ==> P" shows"P" using assms by transfer blast
lemma fset_induct [case_names empty insert]: assumes fempty_case: "P {||}" and finsert_case: "∧x S. P S ==> P (finsert x S)" shows"P S" proof - (* FIXME transfer and right_total vs. bi_total *) note Domainp_forall_transfer[transfer_rule] show ?thesis using assms by transfer (auto intro: finite_induct) qed
lemma fset_induct_stronger [case_names empty insert, induct type: fset]: assumes empty_fset_case: "P {||}" and insert_fset_case: "∧x S. [x |∉| S; P S]==> P (finsert x S)" shows"P S" proof - (* FIXME transfer and right_total vs. bi_total *) note Domainp_forall_transfer[transfer_rule] show ?thesis using assms by transfer (auto intro: finite_induct) qed
lemma fset_card_induct: assumes empty_fset_case: "P {||}" and card_fset_Suc_case: "∧S T. Suc (fcard S) = (fcard T) ==> P S ==> P T" shows"P S" proof (induct S) case empty show"P {||}"by (rule empty_fset_case) next case (insert x S) have h: "P S"by fact have"x |∉| S"by fact thenhave"Suc (fcard S) = fcard (finsert x S)" by transfer auto thenshow"P (finsert x S)" using h card_fset_Suc_case by simp qed
lemma fset_strong_cases: obtains"xs = {||}"
| ys x where"x |∉| ys"and"xs = finsert x ys" by auto
lemma fset_induct2: "P {||} {||} ==> (∧x xs. x |∉| xs ==> P (finsert x xs) {||}) ==> (∧y ys. y |∉| ys ==> P {||} (finsert y ys)) ==> (∧x xs y ys. [P xs ys; x |∉| xs; y |∉| ys]==> P (finsert x xs) (finsert y ys)) ==> P xsa ysa" by (induct xsa arbitrary: ysa; metis fset_induct_stronger)
subsection‹Lemmas depending on induction›
lemma ffUnion_fsubset_iff: "ffUnion A |⊆| B ⟷ fBall A (λx. x |⊆| B)" by (induction A) simp_all
lemma rel_fset_alt_def: "rel_fset R = (λA B. (∀x.∃y. x|∈|A ⟶ y|∈|B ∧ R x y) ∧ (∀y. ∃x. y|∈|B ⟶ x|∈|A ∧ R x y))" by transfer' (metis (no_types, opaque_lifting) rel_set_def)
lemma finite_rel_set: assumes fin: "finite X""finite Z" assumes R_S: "rel_set (R OO S) X Z" shows"∃Y. finite Y ∧ rel_set R X Y ∧ rel_set S Y Z" proof - obtain f g where f: "∀x∈X. R x (f x) ∧ (∃z∈Z. S (f x) z)" and g: "∀z∈Z. S (g z) z ∧ (∃x∈X. R x (g z))" using R_S[unfolded rel_set_def OO_def] by metis
let ?Y = "f ` X ∪ g ` Z" have"finite ?Y"by (simp add: fin) moreoverhave"rel_set R X ?Y" unfolding rel_set_def using f g by clarsimp blast moreoverhave"rel_set S ?Y Z" unfolding rel_set_def using f g by clarsimp blast ultimatelyshow ?thesis by metis qed
subsubsection ‹Transfer rules for the Transfer package›
text‹Unconditional transfer rules›
contextincludes lifting_syntax begin
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" unfolding rel_fun_def rel_fset_alt_def by blast
lemma funion_transfer [transfer_rule]: "(rel_fset A ===> rel_fset A ===> rel_fset A) funion funion" unfolding rel_fun_def rel_fset_alt_def by blast
lemma ffUnion_transfer [transfer_rule]: "(rel_fset (rel_fset A) ===> rel_fset A) ffUnion ffUnion" unfolding rel_fun_def rel_fset_alt_def by transfer (simp, fast)
lemma fimage_transfer [transfer_rule]: "((A ===> B) ===> rel_fset A ===> rel_fset B) fimage fimage" unfolding rel_fun_def rel_fset_alt_def by simp blast
lemma fBall_transfer [transfer_rule]: "(rel_fset A ===> (A ===> (=)) ===> (=)) fBall fBall" unfolding rel_fset_alt_def rel_fun_def by blast
lemma fBex_transfer [transfer_rule]: "(rel_fset A ===> (A ===> (=)) ===> (=)) fBex fBex" unfolding rel_fset_alt_def rel_fun_def by blast
(* FIXME transfer doesn't work here *) lemma fPow_transfer [transfer_rule]: "(rel_fset A ===> rel_fset (rel_fset A)) fPow fPow" unfolding rel_fun_def using Pow_transfer[unfolded rel_fun_def, rule_format, Transfer.transferred] by blast
lemma rel_fset_transfer [transfer_rule]: "((A ===> B ===> (=)) ===> rel_fset A ===> rel_fset B ===> (=)) rel_fset rel_fset" unfolding rel_fun_def using rel_set_transfer[unfolded rel_fun_def,rule_format, Transfer.transferred, whereA = A and B = B] by simp
lemma bind_transfer [transfer_rule]: "(rel_fset A ===> (A ===> rel_fset B) ===> rel_fset B) fbind fbind" unfolding rel_fun_def using bind_transfer[unfolded rel_fun_def, rule_format, Transfer.transferred] by blast
text‹Rules requiring bi-unique, bi-total or right-total relations›
lemma fmember_transfer [transfer_rule]: assumes"bi_unique A" shows"(A ===> rel_fset A ===> (=)) (|∈|) (|∈|)" using assms unfolding rel_fun_def rel_fset_alt_def bi_unique_def by metis
lemma finter_transfer [transfer_rule]: assumes"bi_unique A" shows"(rel_fset A ===> rel_fset A ===> rel_fset A) finter finter" using assms unfolding rel_fun_def using inter_transfer[unfolded rel_fun_def, rule_format, Transfer.transferred] by blast
lemma fminus_transfer [transfer_rule]: assumes"bi_unique A" shows"(rel_fset A ===> rel_fset A ===> rel_fset A) (|-|) (|-|)" using assms unfolding rel_fun_def using Diff_transfer[unfolded rel_fun_def, rule_format, Transfer.transferred] by blast
lemma fsubset_transfer [transfer_rule]: assumes"bi_unique A" shows"(rel_fset A ===> rel_fset A ===> (=)) (|⊆|) (|⊆|)" using assms unfolding rel_fun_def using subset_transfer[unfolded rel_fun_def, rule_format, Transfer.transferred] by blast
lemma fSup_transfer [transfer_rule]: "bi_unique A ==> (rel_set (rel_fset A) ===> rel_fset A) Sup Sup" unfolding rel_fun_def apply clarify apply transfer' using Sup_fset_transfer[unfolded rel_fun_def] by blast
(* FIXME: add right_total_fInf_transfer *)
lemma fInf_transfer [transfer_rule]: assumes"bi_unique A"and"bi_total A" shows"(rel_set (rel_fset A) ===> rel_fset A) Inf Inf" using assms unfolding rel_fun_def apply clarify apply transfer' using Inf_fset_transfer[unfolded rel_fun_def] by blast
lemma ffilter_transfer [transfer_rule]: assumes"bi_unique A" shows"((A ===> (=)) ===> rel_fset A ===> rel_fset A) ffilter ffilter" using assms Lifting_Set.filter_transfer unfolding rel_fun_def by (metis ffilter.rep_eq rel_fset.rep_eq)
lemma card_transfer [transfer_rule]: "bi_unique A ==> (rel_fset A ===> (=)) fcard fcard" using card_transfer unfolding rel_fun_def by (metis fcard.rep_eq rel_fset.rep_eq)
contextincludes fset.lifting begin
lift_definition size_fset :: "('a ==> nat) ==> 'a fset ==> nat"is"λf. sum (Suc ∘ f)". end
instantiation fset :: (type) size begin definition size_fset where
size_fset_overloaded_def: "size_fset = FSet.size_fset (λ_. 0)" instance .. end
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])
definition [code_unfold]: "valtermify_finsert x s = Code_Evaluation.valtermify finsert {⋅} (x :: ('a :: typerep * _)) {⋅} s"
end
instantiation fset :: (exhaustive) exhaustive begin
fun exhaustive_fset where "exhaustive_fset f i = (if i = 0 then None else (f {||} orelse exhaustive_fset (λA. f A orelse Quickcheck_Exhaustive.exhaustive (λx. if x |∈| A then None else f (finsert x A)) (i - 1)) (i - 1)))"
instance ..
end
instantiation fset :: (full_exhaustive) full_exhaustive begin
fun full_exhaustive_fset where "full_exhaustive_fset f i = (if i = 0 then None else (f valterm_femptyset orelse full_exhaustive_fset (λA. f A orelse Quickcheck_Exhaustive.full_exhaustive (λx. if fst x |∈| fst A then None else f (valtermify_finsert x A)) (i - 1)) (i - 1)))"
lemma [code]: "random_aux_fset i j = Quickcheck_Random.collapse (Random.select_weight [(1, Pair valterm_femptyset), (i, Quickcheck_Random.random j ∘→ (λx. random_aux_fset (i - 1) j ∘→ (λs. Pair (valtermify_finsert x s))))])" proof (induct i rule: natural.induct) case zero show ?caseby (subst select_weight_drop_zero[symmetric]) (simp add: less_natural_def) next case (Suc i) show ?caseby (simp only: random_aux_fset.simps Suc_natural_minus_one) qed
definition"random_fset i = random_aux_fset i i"
instance ..
end
end
subsection‹Code Generation Setup›
text‹The following @{attribute code_unfold} lemmas are so the pre-processor of the code generator will perform conversions like, e.g., @{lemma "x |∈| fimage f (fset_of_list xs) ⟷ x ∈ f ` set xs" by (simp only: fimage.rep_eq fset_of_list.rep_eq)}.›
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.