181 "lin_add (C b1, C b2) = C (b1+b2)" |
181 "lin_add (C b1, C b2) = C (b1+b2)" |
182 "lin_add (a,b) = Add a b" |
182 "lin_add (a,b) = Add a b" |
183 lemma lin_add: "Inum (lin_add (t,s)) bs = Inum (Add t s) bs" |
183 lemma lin_add: "Inum (lin_add (t,s)) bs = Inum (Add t s) bs" |
184 apply (induct t s rule: lin_add.induct, simp_all add: Let_def) |
184 apply (induct t s rule: lin_add.induct, simp_all add: Let_def) |
185 apply (case_tac "c1+c2 = 0",case_tac "n1 \<le> n2", simp_all) |
185 apply (case_tac "c1+c2 = 0",case_tac "n1 \<le> n2", simp_all) |
186 by (case_tac "n1 = n2", simp_all add: ring_simps) |
186 by (case_tac "n1 = n2", simp_all add: algebra_simps) |
187 |
187 |
188 consts lin_mul :: "num \<Rightarrow> nat \<Rightarrow> num" |
188 consts lin_mul :: "num \<Rightarrow> nat \<Rightarrow> num" |
189 recdef lin_mul "measure size " |
189 recdef lin_mul "measure size " |
190 "lin_mul (C j) = (\<lambda> i. C (i*j))" |
190 "lin_mul (C j) = (\<lambda> i. C (i*j))" |
191 "lin_mul (CN n c a) = (\<lambda> i. if i=0 then (C 0) else CN n (i*c) (lin_mul a i))" |
191 "lin_mul (CN n c a) = (\<lambda> i. if i=0 then (C 0) else CN n (i*c) (lin_mul a i))" |
192 "lin_mul t = (\<lambda> i. Mul i t)" |
192 "lin_mul t = (\<lambda> i. Mul i t)" |
193 |
193 |
194 lemma lin_mul: "Inum (lin_mul t i) bs = Inum (Mul i t) bs" |
194 lemma lin_mul: "Inum (lin_mul t i) bs = Inum (Mul i t) bs" |
195 by (induct t arbitrary: i rule: lin_mul.induct, auto simp add: ring_simps) |
195 by (induct t arbitrary: i rule: lin_mul.induct, auto simp add: algebra_simps) |
196 |
196 |
197 consts linum:: "num \<Rightarrow> num" |
197 consts linum:: "num \<Rightarrow> num" |
198 recdef linum "measure num_size" |
198 recdef linum "measure num_size" |
199 "linum (C b) = C b" |
199 "linum (C b) = C b" |
200 "linum (Var n) = CN n 1 (C 0)" |
200 "linum (Var n) = CN n 1 (C 0)" |