# HG changeset patch # User Cezary Kaliszyk # Date 1271163649 -7200 # Node ID 63dd459dbc0d9857a38ff935e0f15583d51b0f17 # Parent 37480540c1af1d234a17ae487d55a5ff77c422b9 Much more in FSet (currently non-working) diff -r 37480540c1af -r 63dd459dbc0d Nominal/FSet.thy --- a/Nominal/FSet.thy Tue Apr 13 07:40:54 2010 +0200 +++ b/Nominal/FSet.thy Tue Apr 13 15:00:49 2010 +0200 @@ -70,6 +70,10 @@ "\x # xs \ []" by auto +lemma not_memb_nil: + "\memb x []" + by (simp add: memb_def) + lemma memb_cons_iff: shows "memb x (y # xs) = (x = y \ memb x xs)" by (induct xs) (auto simp add: memb_def) @@ -139,12 +143,56 @@ fixes xs :: "'a list" fixes n :: "nat" assumes c: "fcard_raw xs = Suc n" - shows "\a ys. ~(memb a ys) \ xs \ (a # ys)" + shows "\a ys. ~(memb a ys) \ xs \ (a # ys) \ fcard_raw ys = n" + unfolding memb_def using c - apply(induct xs) + proof (induct xs) + case Nil + then show ?case by simp + next + case (Cons a xs) + have f1: "fcard_raw xs = Suc n \ \a ys. a \ set ys \ xs \ a # ys \ fcard_raw ys = n" by fact + have f2: "fcard_raw (a # xs) = Suc n" by fact + then show ?case proof (cases "a \ set xs") + case True + then show ?thesis using f1 f2 apply - + apply (simp add: memb_def) + apply clarify + by metis + case False + then have ?thesis using f1 f2 apply - + apply (rule_tac x="a" in exI) + apply (rule_tac x="xs" in exI) + apply (simp add: memb_def) + done + qed + qed +qed + +lemma singleton_fcard_1: "set a = {b} \ fcard_raw a = Suc 0" + apply (induct a) + apply simp_all + apply auto + apply (subgoal_tac "set a2 = {b}") apply simp - apply (auto) - apply (metis memb_def) + apply (simp add: memb_def) + apply auto + apply (subgoal_tac "set a2 = {}") + apply simp + by (metis memb_def subset_empty subset_insert) + +lemma fcard_raw_1: + fixes a :: "'a list" + shows "(fcard_raw a = 1) = (\b. a \ [b])" + apply auto + apply (drule fcard_raw_suc) + apply clarify + apply (simp add: fcard_raw_0) + apply (rule_tac x="aa" in exI) + apply simp + apply (subgoal_tac "set a = {b}") + apply (erule singleton_fcard_1) + apply auto done lemma fcard_raw_delete_one: @@ -179,6 +227,10 @@ "(map f (a @ b)) \ (map f a) @ (map f b)" by simp +lemma memb_append: + "memb e (append l r) = (memb e l \ memb e r)" + by (induct l) (simp_all add: not_memb_nil memb_cons_iff) + text {* raw section *} lemma map_rsp_aux: @@ -206,7 +258,7 @@ "(\a. a \ set A) = (A \ [])" by simp -lemma finite_set_raw_strong_cases: +lemma fset_raw_strong_cases: "(X = []) \ (\a Y. ((a \ set Y) \ (X \ a # Y)))" apply (induct X) apply (simp) @@ -231,28 +283,35 @@ "delete_raw [] x = []" | "delete_raw (a # A) x = (if (a = x) then delete_raw A x else a # (delete_raw A x))" -lemma mem_delete_raw: - "x \ set (delete_raw A a) = (x \ set A \ \(x = a))" - by (induct A arbitrary: x a) (auto) +lemma memb_delete_raw: + "memb x (delete_raw A a) = (memb x A \ x \ a)" + by (induct A arbitrary: x a) (auto simp add: memb_def) -lemma mem_delete_raw_ident: - "\(a \ set (delete_raw A a))" - by (induct A) (auto) +lemma [quot_respect]: + "(op \ ===> op = ===> op \) delete_raw delete_raw" + by (simp add: memb_def[symmetric] memb_delete_raw) + +lemma memb_delete_raw_ident: + "\ memb a (delete_raw A a)" + by (induct A) (auto simp add: memb_def) -lemma not_mem_delete_raw_ident: - "b \ set A \ (delete_raw A b = A)" - by (induct A) (auto) +lemma not_memb_delete_raw_ident: + "\ memb b A \ delete_raw A b = A" + by (induct A) (auto simp add: memb_def) + +lemma fset_raw_delete_raw_cases: + "X = [] \ (\a. memb a X \ X \ a # delete_raw X a)" + by (induct X) (auto simp add: memb_def) -lemma finite_set_raw_delete_raw_cases: - "X = [] \ (\a. a mem X \ X \ a # delete_raw X a)" - by (induct X) (auto) +lemma fdelete_raw_filter: + "delete_raw xs y = [x \ xs. x \ y]" + by (induct xs) simp_all -lemma list2set_thm: - shows "set [] = {}" - and "set (h # t) = insert h (set t)" - by (auto) +lemma fcard_raw_delete: + "fcard_raw (delete_raw xs y) = (if memb y xs then fcard_raw xs - 1 else fcard_raw xs)" + by (simp add: fdelete_raw_filter fcard_raw_delete_one) -lemma list2set_rsp[quot_respect]: +lemma set_rsp[quot_respect]: "(op \ ===> op =) set set" by auto @@ -262,15 +321,54 @@ "rsp_fold f = (\u v w. (f u (f v w) = f v (f u w)))" primrec - fold_raw :: "('a \ 'b \ 'b) \ 'b \ 'a list \ 'b" + ffold_raw :: "('a \ 'b \ 'b) \ 'b \ 'a list \ 'b" where - "fold_raw f z [] = z" -| "fold_raw f z (a # A) = + "ffold_raw f z [] = z" +| "ffold_raw f z (a # A) = (if (rsp_fold f) then - if a mem A then fold_raw f z A - else f a (fold_raw f z A) + if memb a A then ffold_raw f z A + else f a (ffold_raw f z A) else z)" +lemma memb_commute_ffold_raw: + "rsp_fold f \ memb h b \ ffold_raw f z b = f h (ffold_raw f z (delete_raw b h))" + apply (induct b) + apply (simp add: not_memb_nil) + apply (simp add: ffold_raw.simps) + apply (rule conjI) + apply (rule_tac [!] impI) + apply (rule_tac [!] conjI) + apply (rule_tac [!] impI) + apply (simp_all add: memb_delete_raw) + apply (simp add: memb_cons_iff) + apply (simp add: not_memb_delete_raw_ident) + apply (simp add: memb_cons_iff rsp_fold_def) + done + +primrec + finter_raw :: "'a list \ 'a list \ 'a list" +where + "finter_raw [] l = []" +| "finter_raw (h # t) l = + (if memb h l then h # (finter_raw t l) else finter_raw t l)" + +lemma finter_raw_empty: + "finter_raw l [] = []" + by (induct l) (simp_all add: not_memb_nil) + +lemma memb_finter_raw: + "memb e (finter_raw l r) = (memb e l \ memb e r)" + apply (induct l) + apply (simp add: not_memb_nil) + apply (simp add: finter_raw.simps) + apply (simp add: memb_cons_iff) + apply auto + done + +lemma [quot_respect]: + "(op \ ===> op \ ===> op \) finter_raw finter_raw" + by (simp add: memb_def[symmetric] memb_finter_raw) + section {* Constants on the Quotient Type *} quotient_definition @@ -281,6 +379,16 @@ "fset_to_set :: 'a fset \ 'a set" is "set" +quotient_definition + "ffold :: ('a \ 'b \ 'b) \ 'b \ 'a fset \ 'b" + is "ffold_raw" + +quotient_definition + finter (infix "|\|" 50) +where + "finter :: 'a fset \ 'a fset \ 'a fset" +is "finter_raw" + lemma funion_sym_pre: "a @ b \ b @ a" by auto @@ -312,6 +420,8 @@ section {* lifted part *} +lemma not_fin_fnil: "x |\| {||}" + by (lifting not_memb_nil) lemma fin_finsert_iff[simp]: "x |\| finsert y S = (x = y \ x |\| S)" @@ -346,15 +456,15 @@ text {* fset_to_set *} lemma fset_to_set_simps[simp]: - "fset_to_set {||} = {}" - "fset_to_set (finsert (h :: 'b) t) = insert h (fset_to_set t)" - by (lifting list2set_thm) + "fset_to_set {||} = ({} :: 'a set)" + "fset_to_set (finsert (h :: 'a) t) = insert h (fset_to_set t)" + by (lifting set.simps) lemma in_fset_to_set: "x \ fset_to_set xs \ x |\| xs" by (lifting memb_def[symmetric]) -lemma none_in_fempty: +lemma none_fin_fempty: "(\a. a \ fset_to_set A) = (A = {||})" by (lifting none_mem_nil) @@ -375,15 +485,22 @@ lemma fcard_0: "(fcard a = 0) = (a = {||})" by (lifting fcard_raw_0) +lemma fcard_1: "(fcard a = 1) = (\b. a = {|b|})" + by (lifting fcard_raw_1) + lemma fcard_gt_0: "x \ fset_to_set xs \ 0 < fcard xs" by (lifting fcard_raw_gt_0) -lemma fcard_not_memb: "(x |\| xs) = (fcard (finsert x xs) = Suc (fcard xs))" +lemma fcard_not_fin: "(x |\| xs) = (fcard (finsert x xs) = Suc (fcard xs))" by (lifting fcard_raw_not_memb) -lemma fcard_suc: "fcard xs = Suc n \ \a ys. a |\| ys \ xs = finsert a ys" +lemma fcard_suc: "fcard xs = Suc n \ \a ys. a |\| ys \ xs = finsert a ys \ fcard ys = n" by (lifting fcard_raw_suc) +lemma fcard_delete: + "fcard (fdelete xs y) = (if y |\| xs then fcard xs - 1 else fcard xs)" + by (lifting fcard_raw_delete) + text {* funion *} lemma funion_simps[simp]: @@ -403,7 +520,7 @@ lemma fset_strong_cases: "X = {||} \ (\a Y. a \ fset_to_set Y \ X = finsert a Y)" - by (lifting finite_set_raw_strong_cases) + by (lifting fset_raw_strong_cases) lemma fset_exhaust[case_names fempty finsert, cases type: fset]: shows "\S = {||} \ P; \x S'. S = finsert x S' \ P\ \ P" @@ -448,7 +565,8 @@ apply simp_all done -(* fmap *) +text {* fmap *} + lemma fmap_simps[simp]: "fmap (f :: 'a \ 'b) {||} = {||}" "fmap f (finsert x xs) = finsert (f x) (fmap f xs)" @@ -467,6 +585,54 @@ lemma fmap_funion: "fmap f (a |\| b) = fmap f a |\| fmap f b" by (lifting map_append) +lemma fin_funion: + "(e |\| l |\| r) = (e |\| l \ e |\| r)" + by (lifting memb_append) + +text {* ffold *} + +lemma ffold_nil: "ffold f z {||} = z" + by (lifting ffold_raw.simps(1)[where 'a="'b" and 'b="'a"]) + +lemma ffold_finsert: "ffold f z (finsert a A) = + (if rsp_fold f then if a |\| A then ffold f z A else f a (ffold f z A) else z)" + by (lifting ffold_raw.simps(2)[where 'a="'b" and 'b="'a"]) + +lemma fin_commute_ffold: + "\rsp_fold f; h |\| b\ \ ffold f z b = f h (ffold f z (fdelete b h))" + by (lifting memb_commute_ffold_raw) + +text {* fdelete *} + +lemma fin_fdelete: "(x |\| fdelete A a) = (x |\| A \ x \ a)" + by (lifting memb_delete_raw) + +lemma fin_fdelete_ident: "a |\| fdelete A a" + by (lifting memb_delete_raw_ident) + +lemma not_memb_fdelete_ident: "b |\| A \ fdelete A b = A" + by (lifting not_memb_delete_raw_ident) + +lemma fset_fdelete_cases: + "X = {||} \ (\a. a |\| X \ X = finsert a (fdelete X a))" + by (lifting fset_raw_delete_raw_cases) + +text {* inter *} + +lemma finter_empty_l: "({||} |\| r) = {||}" + by (lifting finter_raw.simps(1)) + +lemma finter_empty_r: "(l |\| {||}) = {||}" + by (lifting finter_raw_empty) + +lemma finter_finsert: + "(finsert h t |\| l) = (if h |\| l then finsert h (t |\| l) else t |\| l)" + by (lifting finter_raw.simps(2)) + +lemma fin_finter: + "(e |\| (l |\| r)) = (e |\| l \ e |\| r)" + by (lifting memb_finter_raw) + ML {* fun dest_fsetT (Type ("FSet.fset", [T])) = T | dest_fsetT T = raise TYPE ("dest_fsetT: fset type expected", [T], []);