52 lemma cons_left_idem: |
52 lemma cons_left_idem: |
53 "x # x # A \<approx> x # A" |
53 "x # x # A \<approx> x # A" |
54 by auto |
54 by auto |
55 |
55 |
56 lemma finite_set_raw_strong_cases: |
56 lemma finite_set_raw_strong_cases: |
57 "(X = []) \<or> (\<exists>a. \<exists> Y. (~(a mem Y) \<and> (X \<approx> a # Y)))" |
57 "(X = []) \<or> (\<exists>a Y. ((a \<notin> set Y) \<and> (X \<approx> a # Y)))" |
58 apply (induct X) |
58 apply (induct X) |
|
59 apply (simp) |
|
60 apply (rule disjI2) |
|
61 apply (erule disjE) |
|
62 apply (rule_tac x="a" in exI) |
|
63 apply (rule_tac x="[]" in exI) |
|
64 apply (simp) |
|
65 apply (erule exE)+ |
|
66 apply (case_tac "a = aa") |
|
67 apply (rule_tac x="a" in exI) |
|
68 apply (rule_tac x="Y" in exI) |
|
69 apply (simp) |
|
70 apply (rule_tac x="aa" in exI) |
|
71 apply (rule_tac x="a # Y" in exI) |
59 apply (auto) |
72 apply (auto) |
60 sorry |
73 done |
61 |
74 |
62 fun |
75 fun |
63 delete_raw :: "'a list \<Rightarrow> 'a \<Rightarrow> 'a list" |
76 delete_raw :: "'a list \<Rightarrow> 'a \<Rightarrow> 'a list" |
64 where |
77 where |
65 "delete_raw [] x = []" |
78 "delete_raw [] x = []" |
66 | "delete_raw (a # A) x = (if (a = x) then delete_raw A x else a # (delete_raw A x))" |
79 | "delete_raw (a # A) x = (if (a = x) then delete_raw A x else a # (delete_raw A x))" |
67 |
80 |
68 (* definitely FALSE |
|
69 lemma mem_delete_raw: |
81 lemma mem_delete_raw: |
70 "x mem (delete_raw A a) = x mem A \<and> \<not>(x = a)" |
82 "x \<in> set (delete_raw A a) = (x \<in> set A \<and> \<not>(x = a))" |
71 apply(induct A arbitrary: x a) |
83 by (induct A arbitrary: x a) (auto) |
72 apply(auto) |
|
73 sorry |
|
74 *) |
|
75 |
84 |
76 lemma mem_delete_raw_ident: |
85 lemma mem_delete_raw_ident: |
77 "\<not>(a \<in> set (delete_raw A a))" |
86 "\<not>(a \<in> set (delete_raw A a))" |
78 by (induct A) (auto) |
87 by (induct A) (auto) |
79 |
88 |
86 apply(induct A arbitrary: B a) |
95 apply(induct A arbitrary: B a) |
87 apply(auto) |
96 apply(auto) |
88 sorry |
97 sorry |
89 |
98 |
90 lemma cons_delete_raw: |
99 lemma cons_delete_raw: |
91 "a # (delete_raw A a) \<approx> (if a mem A then A else (a # A))" |
100 "a # (delete_raw A a) \<approx> (if a \<in> set A then A else (a # A))" |
92 sorry |
101 sorry |
93 |
102 |
94 lemma mem_cons_delete_raw: |
103 lemma mem_cons_delete_raw: |
95 "a mem A \<Longrightarrow> a # (delete_raw A a) \<approx> A" |
104 "a \<in> set A \<Longrightarrow> a # (delete_raw A a) \<approx> A" |
96 sorry |
|
97 |
|
98 lemma finite_set_raw_delete_raw_cases1: |
|
99 "X = [] \<or> (\<exists>a. X \<approx> a # delete_raw X a)" |
|
100 sorry |
105 sorry |
101 |
106 |
102 lemma finite_set_raw_delete_raw_cases: |
107 lemma finite_set_raw_delete_raw_cases: |
103 "X = [] \<or> (\<exists>a. a mem X \<and> X \<approx> a # delete_raw X a)" |
108 "X = [] \<or> (\<exists>a. a mem X \<and> X \<approx> a # delete_raw X a)" |
104 sorry |
109 by (induct X) (auto) |
105 |
110 |
106 fun |
111 fun |
107 card_raw :: "'a list \<Rightarrow> nat" |
112 card_raw :: "'a list \<Rightarrow> nat" |
108 where |
113 where |
109 card_raw_nil: "card_raw [] = 0" |
114 card_raw_nil: "card_raw [] = 0" |
110 | card_raw_cons: "card_raw (x # xs) = (if x mem xs then card_raw xs else Suc (card_raw xs))" |
115 | card_raw_cons: "card_raw (x # xs) = (if x \<in> set xs then card_raw xs else Suc (card_raw xs))" |
111 |
116 |
112 lemma not_mem_card_raw: |
117 lemma not_mem_card_raw: |
113 fixes x :: "'a" |
118 fixes x :: "'a" |
114 fixes xs :: "'a list" |
119 fixes xs :: "'a list" |
115 shows "(\<not>(x mem xs)) = (card_raw (x # xs) = Suc (card_raw xs))" |
120 shows "(\<not>(x mem xs)) = (card_raw (x # xs) = Suc (card_raw xs))" |
116 sorry |
121 sorry |
117 |
122 |
118 lemma card_raw_suc: |
123 lemma card_raw_suc: |
119 fixes xs :: "'a list" |
|
120 fixes n :: "nat" |
|
121 assumes c: "card_raw xs = Suc n" |
124 assumes c: "card_raw xs = Suc n" |
122 shows "\<exists>a ys. \<not>(a mem ys) \<and> xs \<approx> (a # ys)" |
125 shows "\<exists>a ys. (a \<notin> set ys) \<and> xs \<approx> (a # ys)" |
123 using c |
126 using c apply(induct xs) |
124 apply(induct xs) |
127 apply(simp) |
125 (*apply(metis mem_delete_raw) |
128 sorry |
126 apply(metis mem_delete_raw) |
129 |
127 done*) |
130 lemma mem_card_raw_gt_0: |
128 sorry |
131 "a \<in> set A \<Longrightarrow> 0 < card_raw A" |
129 |
132 by (induct A) (auto) |
130 |
|
131 lemma mem_card_raw_not_0: |
|
132 "a mem A \<Longrightarrow> \<not>(card_raw A = 0)" |
|
133 sorry |
|
134 |
133 |
135 lemma card_raw_cons_gt_0: |
134 lemma card_raw_cons_gt_0: |
136 "0 < card_raw (a # A)" |
135 "0 < card_raw (a # A)" |
137 sorry |
136 by (induct A) (auto) |
138 |
137 |
139 lemma card_raw_delete_raw: |
138 lemma card_raw_delete_raw: |
140 "card_raw (delete_raw A a) = (if a mem A then card_raw A - 1 else card_raw A)" |
139 "card_raw (delete_raw A a) = (if a \<in> set A then card_raw A - 1 else card_raw A)" |
141 sorry |
140 sorry |
142 |
141 |
143 lemma card_raw_rsp_aux: |
142 lemma card_raw_rsp_aux: |
144 assumes e: "a \<approx> b" |
143 assumes e: "a \<approx> b" |
145 shows "card_raw a = card_raw b" |
144 shows "card_raw a = card_raw b" |
149 "(op \<approx> ===> op =) card_raw card_raw" |
148 "(op \<approx> ===> op =) card_raw card_raw" |
150 by (simp add: card_raw_rsp_aux) |
149 by (simp add: card_raw_rsp_aux) |
151 |
150 |
152 lemma card_raw_0: |
151 lemma card_raw_0: |
153 "(card_raw A = 0) = (A = [])" |
152 "(card_raw A = 0) = (A = [])" |
154 sorry |
153 by (induct A) (auto) |
155 |
154 |
156 lemma list2set_thm: |
155 lemma list2set_thm: |
157 shows "set [] = {}" |
156 shows "set [] = {}" |
158 and "set (h # t) = insert h (set t)" |
157 and "set (h # t) = insert h (set t)" |
159 sorry |
158 by (auto) |
160 |
159 |
161 lemma list2set_RSP: |
160 lemma list2set_RSP: |
162 "A \<approx> B \<Longrightarrow> set A = set B" |
161 "A \<approx> B \<Longrightarrow> set A = set B" |
163 sorry |
162 by auto |
164 |
163 |
165 definition |
164 definition |
166 rsp_fold |
165 rsp_fold |
167 where |
166 where |
168 "rsp_fold f = (\<forall>u v w. (f u (f v w) = f v (f u w)))" |
167 "rsp_fold f = (\<forall>u v w. (f u (f v w) = f v (f u w)))" |