84 (* Induction step *) |
80 (* Induction step *) |
85 by (asm_simp_tac (simpset() addsimps [r_distr]) 1); |
81 by (asm_simp_tac (simpset() addsimps [r_distr]) 1); |
86 qed "SUM_rdistr"; |
82 qed "SUM_rdistr"; |
87 |
83 |
88 section "Results for the Construction of Polynomials"; |
84 section "Results for the Construction of Polynomials"; |
89 |
|
90 Goal "[| m <= j; Suc j <= n |] ==> (n - m) - Suc (j - m) = n - Suc j"; |
|
91 by (asm_simp_tac (simpset() addsplits [nat_diff_split']) 1); |
|
92 qed "Suc_diff_lemma"; |
|
93 |
85 |
94 Goal |
86 Goal |
95 "!!a::nat=>'a::ring. k <= n --> \ |
87 "!!a::nat=>'a::ring. k <= n --> \ |
96 \ SUM k (%j. SUM j (%i. a i * b (j-i)) * c (n-j)) = \ |
88 \ SUM k (%j. SUM j (%i. a i * b (j-i)) * c (n-j)) = \ |
97 \ SUM k (%j. a j * SUM (k-j) (%i. b i * c (n-j-i)))"; |
89 \ SUM k (%j. a j * SUM (k-j) (%i. b i * c (n-j-i)))"; |
99 (* Base case *) |
91 (* Base case *) |
100 by (simp_tac (simpset() addsimps [m_assoc]) 1); |
92 by (simp_tac (simpset() addsimps [m_assoc]) 1); |
101 (* Induction step *) |
93 (* Induction step *) |
102 by (rtac impI 1); |
94 by (rtac impI 1); |
103 by (etac impE 1); |
95 by (etac impE 1); |
104 by (rtac Suc_leD 1); |
96 by (arith_tac 1); |
105 by (assume_tac 1); |
|
106 by (asm_simp_tac |
97 by (asm_simp_tac |
107 (simpset() addsimps a_ac@ |
98 (simpset() addsimps a_ac@ |
108 [Suc_diff_le, l_distr, r_distr, m_assoc, SUM_add]) 1); |
99 [Suc_diff_le, l_distr, r_distr, m_assoc, SUM_add]) 1); |
109 by (asm_simp_tac |
100 by (asm_simp_tac (simpset() addsimps a_ac@ [SUM_ldistr, m_assoc]) 1); |
110 (simpset() addsimps a_ac@ [Suc_diff_lemma, SUM_ldistr, m_assoc]) 1); |
101 qed_spec_mp "poly_assoc_lemma1"; |
111 qed "poly_assoc_lemma1"; |
|
112 |
102 |
113 Goal |
103 Goal |
114 "!!a::nat=>'a::ring. \ |
104 "!!a::nat=>'a::ring. \ |
115 \ SUM n (%j. SUM j (%i. a i * b (j-i)) * c (n-j)) = \ |
105 \ SUM n (%j. SUM j (%i. a i * b (j-i)) * c (n-j)) = \ |
116 \ SUM n (%j. a j * SUM (n-j) (%i. b i * c (n-j-i)))"; |
106 \ SUM n (%j. a j * SUM (n-j) (%i. b i * c (n-(j+i))))"; |
117 by (rtac (poly_assoc_lemma1 RS mp) 1); |
107 by (asm_simp_tac (simpset() addsimps [poly_assoc_lemma1]) 1); |
118 by (rtac le_refl 1); |
|
119 qed "poly_assoc_lemma"; |
108 qed "poly_assoc_lemma"; |
120 |
|
121 goal Main.thy (* could go to Arith *) |
|
122 "!! n. Suc i <= n ==> Suc (a + (n - Suc i)) = a + (n - i)"; |
|
123 by (asm_simp_tac (simpset() delsimps [add_Suc] addsimps [add_Suc_right RS sym, Suc_diff_Suc]) 1); |
|
124 qed "Suc_add_diff_Suc"; |
|
125 |
|
126 goal Main.thy (* could go to Arith *) |
|
127 "!! n. [| Suc j <= n; i <= j |] ==> \ |
|
128 \ n - Suc i - (n - Suc j) = n - i - (n - j)"; |
|
129 by (res_inst_tac [("m1", "n - Suc i"), ("n1", "n - Suc j")] |
|
130 (diff_Suc_Suc RS subst) 1); |
|
131 by (subgoal_tac "Suc i <= n" 1); |
|
132 by (asm_simp_tac (simpset() delsimps [diff_Suc_Suc] addsimps [Suc_diff_Suc]) 1); |
|
133 by (fast_arith_tac 1); |
|
134 qed "diff_lemma2"; |
|
135 |
109 |
136 Goal |
110 Goal |
137 "!! a::nat=>'a::ring. j <= n --> \ |
111 "!! a::nat=>'a::ring. j <= n --> \ |
138 \ SUM j (%i. a i * b (n-i)) = SUM j (%i. a (n-i-(n-j)) * b (i+(n-j)))"; |
112 \ SUM j (%i. a i * b (n-i)) = SUM j (%i. a (n-i-(n-j)) * b (i+(n-j)))"; |
139 by (induct_tac "j" 1); |
113 by (induct_tac "j" 1); |
140 (* Base case *) |
114 (* Base case *) |
141 by (Simp_tac 1); |
115 by (Simp_tac 1); |
142 (* Induction step *) |
116 (* Induction step *) |
143 by (rtac impI 1); |
|
144 by (etac impE 1); |
|
145 by (rtac Suc_leD 1); |
|
146 by (assume_tac 1); |
|
147 by (stac SUM_Suc2 1); |
117 by (stac SUM_Suc2 1); |
148 by (stac SUM_Suc 1); |
118 by (asm_simp_tac (simpset() addsimps [Suc_diff_Suc, a_comm]) 1); |
149 by (asm_simp_tac (simpset() |
|
150 addsimps [a_comm, Suc_add_diff_Suc, diff_diff_cancel, diff_lemma2]) 1); |
|
151 qed "poly_comm_lemma1"; |
119 qed "poly_comm_lemma1"; |
152 |
120 |
153 Goal |
121 Goal |
154 "!!a::nat=>'a::ring. SUM n (%i. a i * b (n-i)) = SUM n (%i. a (n-i) * b i)"; |
122 "!!a::nat=>'a::ring. SUM n (%i. a i * b (n-i)) = SUM n (%i. a (n-i) * b i)"; |
155 by (cut_inst_tac [("j", "n"), ("n", "n")] poly_comm_lemma1 1); |
123 by (cut_inst_tac [("j", "n"), ("n", "n")] poly_comm_lemma1 1); |
235 \ SUM j (%k. SUM (j - k) (%i. f k * g i))"; |
198 \ SUM j (%k. SUM (j - k) (%i. f k * g i))"; |
236 by (induct_tac "j" 1); |
199 by (induct_tac "j" 1); |
237 (* Base case *) |
200 (* Base case *) |
238 by (Simp_tac 1); |
201 by (Simp_tac 1); |
239 (* Induction step *) |
202 (* Induction step *) |
240 by (simp_tac (simpset() addsimps [Suc_diff_le]) 1); |
203 by (simp_tac (simpset() addsimps [Suc_diff_le, SUM_add]) 1); |
241 by (simp_tac (simpset() addsimps [SUM_add]) 1); |
|
242 by (rtac impI 1); |
|
243 by (etac impE 1); |
|
244 by (dtac Suc_leD 1); |
|
245 by (assume_tac 1); |
|
246 by (asm_simp_tac (simpset() addsimps a_ac) 1); |
204 by (asm_simp_tac (simpset() addsimps a_ac) 1); |
247 val DiagSum_lemma = result(); |
205 val DiagSum_lemma = result(); |
248 |
206 |
249 Goal |
207 Goal |
250 "!!f::nat=>'a::ring. \ |
208 "!!f::nat=>'a::ring. \ |