author  chaieb 
Mon, 21 Jul 2008 13:36:39 +0200  
changeset 27666  1436d81d1294 
parent 26462  dac4e2bce00d 
child 28402  09e4aa3ddc25 
permissions  rwrr 
23252  1 
(* Title: HOL/Groebner_Basis.thy 
2 
ID: $Id$ 

3 
Author: Amine Chaieb, TU Muenchen 

4 
*) 

5 

6 
header {* Semiring normalization and Groebner Bases *} 

7 
theory Groebner_Basis 

8 
imports NatBin 

9 
uses 

10 
"Tools/Groebner_Basis/misc.ML" 

11 
"Tools/Groebner_Basis/normalizer_data.ML" 

12 
("Tools/Groebner_Basis/normalizer.ML") 

23312  13 
("Tools/Groebner_Basis/groebner.ML") 
23252  14 
begin 
15 

16 
subsection {* Semiring normalization *} 

17 

18 
setup NormalizerData.setup 

19 

20 

23258
9062e98fdab1
renamed locale ring/semiring to gb_ring/gb_semiring to avoid clash with Ring_and_Field versions;
wenzelm
parents:
23252
diff
changeset

21 
locale gb_semiring = 
23252  22 
fixes add mul pwr r0 r1 
23 
assumes add_a:"(add x (add y z) = add (add x y) z)" 

24 
and add_c: "add x y = add y x" and add_0:"add r0 x = x" 

25 
and mul_a:"mul x (mul y z) = mul (mul x y) z" and mul_c:"mul x y = mul y x" 

26 
and mul_1:"mul r1 x = x" and mul_0:"mul r0 x = r0" 

27 
and mul_d:"mul x (add y z) = add (mul x y) (mul x z)" 

28 
and pwr_0:"pwr x 0 = r1" and pwr_Suc:"pwr x (Suc n) = mul x (pwr x n)" 

29 
begin 

30 

31 
lemma mul_pwr:"mul (pwr x p) (pwr x q) = pwr x (p + q)" 

32 
proof (induct p) 

33 
case 0 

34 
then show ?case by (auto simp add: pwr_0 mul_1) 

35 
next 

36 
case Suc 

37 
from this [symmetric] show ?case 

38 
by (auto simp add: pwr_Suc mul_1 mul_a) 

39 
qed 

40 

41 
lemma pwr_mul: "pwr (mul x y) q = mul (pwr x q) (pwr y q)" 

42 
proof (induct q arbitrary: x y, auto simp add:pwr_0 pwr_Suc mul_1) 

43 
fix q x y 

44 
assume "\<And>x y. pwr (mul x y) q = mul (pwr x q) (pwr y q)" 

45 
have "mul (mul x y) (mul (pwr x q) (pwr y q)) = mul x (mul y (mul (pwr x q) (pwr y q)))" 

46 
by (simp add: mul_a) 

47 
also have "\<dots> = (mul (mul y (mul (pwr y q) (pwr x q))) x)" by (simp add: mul_c) 

48 
also have "\<dots> = (mul (mul y (pwr y q)) (mul (pwr x q) x))" by (simp add: mul_a) 

49 
finally show "mul (mul x y) (mul (pwr x q) (pwr y q)) = 

50 
mul (mul x (pwr x q)) (mul y (pwr y q))" by (simp add: mul_c) 

51 
qed 

52 

53 
lemma pwr_pwr: "pwr (pwr x p) q = pwr x (p * q)" 

54 
proof (induct p arbitrary: q) 

55 
case 0 

56 
show ?case using pwr_Suc mul_1 pwr_0 by (induct q) auto 

57 
next 

58 
case Suc 

59 
thus ?case by (auto simp add: mul_pwr [symmetric] pwr_mul pwr_Suc) 

60 
qed 

61 

62 

63 
subsubsection {* Declaring the abstract theory *} 

64 

65 
lemma semiring_ops: 

66 
includes meta_term_syntax 

67 
shows "TERM (add x y)" and "TERM (mul x y)" and "TERM (pwr x n)" 

68 
and "TERM r0" and "TERM r1" 

69 
by rule+ 

70 

71 
lemma semiring_rules: 

72 
"add (mul a m) (mul b m) = mul (add a b) m" 

73 
"add (mul a m) m = mul (add a r1) m" 

74 
"add m (mul a m) = mul (add a r1) m" 

75 
"add m m = mul (add r1 r1) m" 

76 
"add r0 a = a" 

77 
"add a r0 = a" 

78 
"mul a b = mul b a" 

79 
"mul (add a b) c = add (mul a c) (mul b c)" 

80 
"mul r0 a = r0" 

81 
"mul a r0 = r0" 

82 
"mul r1 a = a" 

83 
"mul a r1 = a" 

84 
"mul (mul lx ly) (mul rx ry) = mul (mul lx rx) (mul ly ry)" 

85 
"mul (mul lx ly) (mul rx ry) = mul lx (mul ly (mul rx ry))" 

86 
"mul (mul lx ly) (mul rx ry) = mul rx (mul (mul lx ly) ry)" 

87 
"mul (mul lx ly) rx = mul (mul lx rx) ly" 

88 
"mul (mul lx ly) rx = mul lx (mul ly rx)" 

89 
"mul lx (mul rx ry) = mul (mul lx rx) ry" 

90 
"mul lx (mul rx ry) = mul rx (mul lx ry)" 

91 
"add (add a b) (add c d) = add (add a c) (add b d)" 

92 
"add (add a b) c = add a (add b c)" 

93 
"add a (add c d) = add c (add a d)" 

94 
"add (add a b) c = add (add a c) b" 

95 
"add a c = add c a" 

96 
"add a (add c d) = add (add a c) d" 

97 
"mul (pwr x p) (pwr x q) = pwr x (p + q)" 

98 
"mul x (pwr x q) = pwr x (Suc q)" 

99 
"mul (pwr x q) x = pwr x (Suc q)" 

100 
"mul x x = pwr x 2" 

101 
"pwr (mul x y) q = mul (pwr x q) (pwr y q)" 

102 
"pwr (pwr x p) q = pwr x (p * q)" 

103 
"pwr x 0 = r1" 

104 
"pwr x 1 = x" 

105 
"mul x (add y z) = add (mul x y) (mul x z)" 

106 
"pwr x (Suc q) = mul x (pwr x q)" 

107 
"pwr x (2*n) = mul (pwr x n) (pwr x n)" 

108 
"pwr x (Suc (2*n)) = mul x (mul (pwr x n) (pwr x n))" 

109 
proof  

110 
show "add (mul a m) (mul b m) = mul (add a b) m" using mul_d mul_c by simp 

111 
next show"add (mul a m) m = mul (add a r1) m" using mul_d mul_c mul_1 by simp 

112 
next show "add m (mul a m) = mul (add a r1) m" using mul_c mul_d mul_1 add_c by simp 

113 
next show "add m m = mul (add r1 r1) m" using mul_c mul_d mul_1 by simp 

114 
next show "add r0 a = a" using add_0 by simp 

115 
next show "add a r0 = a" using add_0 add_c by simp 

116 
next show "mul a b = mul b a" using mul_c by simp 

117 
next show "mul (add a b) c = add (mul a c) (mul b c)" using mul_c mul_d by simp 

118 
next show "mul r0 a = r0" using mul_0 by simp 

119 
next show "mul a r0 = r0" using mul_0 mul_c by simp 

120 
next show "mul r1 a = a" using mul_1 by simp 

121 
next show "mul a r1 = a" using mul_1 mul_c by simp 

122 
next show "mul (mul lx ly) (mul rx ry) = mul (mul lx rx) (mul ly ry)" 

123 
using mul_c mul_a by simp 

124 
next show "mul (mul lx ly) (mul rx ry) = mul lx (mul ly (mul rx ry))" 

125 
using mul_a by simp 

126 
next 

127 
have "mul (mul lx ly) (mul rx ry) = mul (mul rx ry) (mul lx ly)" by (rule mul_c) 

128 
also have "\<dots> = mul rx (mul ry (mul lx ly))" using mul_a by simp 

129 
finally 

130 
show "mul (mul lx ly) (mul rx ry) = mul rx (mul (mul lx ly) ry)" 

131 
using mul_c by simp 

132 
next show "mul (mul lx ly) rx = mul (mul lx rx) ly" using mul_c mul_a by simp 

133 
next 

134 
show "mul (mul lx ly) rx = mul lx (mul ly rx)" by (simp add: mul_a) 

135 
next show "mul lx (mul rx ry) = mul (mul lx rx) ry" by (simp add: mul_a ) 

136 
next show "mul lx (mul rx ry) = mul rx (mul lx ry)" by (simp add: mul_a,simp add: mul_c) 

137 
next show "add (add a b) (add c d) = add (add a c) (add b d)" 

138 
using add_c add_a by simp 

139 
next show "add (add a b) c = add a (add b c)" using add_a by simp 

140 
next show "add a (add c d) = add c (add a d)" 

141 
apply (simp add: add_a) by (simp only: add_c) 

142 
next show "add (add a b) c = add (add a c) b" using add_a add_c by simp 

143 
next show "add a c = add c a" by (rule add_c) 

144 
next show "add a (add c d) = add (add a c) d" using add_a by simp 

145 
next show "mul (pwr x p) (pwr x q) = pwr x (p + q)" by (rule mul_pwr) 

146 
next show "mul x (pwr x q) = pwr x (Suc q)" using pwr_Suc by simp 

147 
next show "mul (pwr x q) x = pwr x (Suc q)" using pwr_Suc mul_c by simp 

148 
next show "mul x x = pwr x 2" by (simp add: nat_number pwr_Suc pwr_0 mul_1 mul_c) 

149 
next show "pwr (mul x y) q = mul (pwr x q) (pwr y q)" by (rule pwr_mul) 

150 
next show "pwr (pwr x p) q = pwr x (p * q)" by (rule pwr_pwr) 

151 
next show "pwr x 0 = r1" using pwr_0 . 

152 
next show "pwr x 1 = x" by (simp add: nat_number pwr_Suc pwr_0 mul_1 mul_c) 

153 
next show "mul x (add y z) = add (mul x y) (mul x z)" using mul_d by simp 

154 
next show "pwr x (Suc q) = mul x (pwr x q)" using pwr_Suc by simp 

155 
next show "pwr x (2 * n) = mul (pwr x n) (pwr x n)" by (simp add: nat_number mul_pwr) 

156 
next show "pwr x (Suc (2 * n)) = mul x (mul (pwr x n) (pwr x n))" 

157 
by (simp add: nat_number pwr_Suc mul_pwr) 

158 
qed 

159 

160 

26462  161 
lemmas gb_semiring_axioms' = 
26314  162 
gb_semiring_axioms [normalizer 
23252  163 
semiring ops: semiring_ops 
26314  164 
semiring rules: semiring_rules] 
23252  165 

166 
end 

167 

23258
9062e98fdab1
renamed locale ring/semiring to gb_ring/gb_semiring to avoid clash with Ring_and_Field versions;
wenzelm
parents:
23252
diff
changeset

168 
interpretation class_semiring: gb_semiring 
23252  169 
["op +" "op *" "op ^" "0::'a::{comm_semiring_1, recpower}" "1"] 
23477
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
nipkow
parents:
23458
diff
changeset

170 
by unfold_locales (auto simp add: ring_simps power_Suc) 
23252  171 

172 
lemmas nat_arith = 

173 
add_nat_number_of diff_nat_number_of mult_nat_number_of eq_nat_number_of less_nat_number_of 

174 

175 
lemma not_iszero_Numeral1: "\<not> iszero (Numeral1::'a::number_ring)" 

176 
by (simp add: numeral_1_eq_1) 

177 
lemmas comp_arith = Let_def arith_simps nat_arith rel_simps if_False 

178 
if_True add_0 add_Suc add_number_of_left mult_number_of_left 

179 
numeral_1_eq_1[symmetric] Suc_eq_add_numeral_1 

180 
numeral_0_eq_0[symmetric] numerals[symmetric] not_iszero_1 

26086
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
huffman
parents:
25250
diff
changeset

181 
iszero_number_of_Bit1 iszero_number_of_Bit0 nonzero_number_of_Min 
23252  182 
iszero_number_of_Pls iszero_0 not_iszero_Numeral1 
183 

184 
lemmas semiring_norm = comp_arith 

185 

186 
ML {* 

23573  187 
local 
23252  188 

23573  189 
open Conv; 
190 

191 
fun numeral_is_const ct = 

192 
can HOLogic.dest_number (Thm.term_of ct); 

23252  193 

23573  194 
fun int_of_rat x = 
195 
(case Rat.quotient_of_rat x of (i, 1) => i 

196 
 _ => error "int_of_rat: bad int"); 

23252  197 

23573  198 
val numeral_conv = 
199 
Simplifier.rewrite (HOL_basic_ss addsimps @{thms semiring_norm}) then_conv 

200 
Simplifier.rewrite (HOL_basic_ss addsimps 

201 
(@{thms numeral_1_eq_1} @ @{thms numeral_0_eq_0} @ @{thms numerals(12)})); 

202 

203 
in 

204 

205 
fun normalizer_funs key = 

206 
NormalizerData.funs key 

23252  207 
{is_const = fn phi => numeral_is_const, 
208 
dest_const = fn phi => fn ct => 

209 
Rat.rat_of_int (snd 

210 
(HOLogic.dest_number (Thm.term_of ct) 

211 
handle TERM _ => error "ring_dest_const")), 

23573  212 
mk_const = fn phi => fn cT => fn x => Numeral.mk_cnumber cT (int_of_rat x), 
23330
01c09922ce59
Conversion for computation on constants now depends on the context
chaieb
parents:
23327
diff
changeset

213 
conv = fn phi => K numeral_conv} 
23573  214 

215 
end 

23252  216 
*} 
217 

26462  218 
declaration {* normalizer_funs @{thm class_semiring.gb_semiring_axioms'} *} 
23573  219 

23252  220 

23258
9062e98fdab1
renamed locale ring/semiring to gb_ring/gb_semiring to avoid clash with Ring_and_Field versions;
wenzelm
parents:
23252
diff
changeset

221 
locale gb_ring = gb_semiring + 
23252  222 
fixes sub :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" 
223 
and neg :: "'a \<Rightarrow> 'a" 

224 
assumes neg_mul: "neg x = mul (neg r1) x" 

225 
and sub_add: "sub x y = add x (neg y)" 

226 
begin 

227 

228 
lemma ring_ops: 

229 
includes meta_term_syntax 

230 
shows "TERM (sub x y)" and "TERM (neg x)" . 

231 

232 
lemmas ring_rules = neg_mul sub_add 

233 

26462  234 
lemmas gb_ring_axioms' = 
26314  235 
gb_ring_axioms [normalizer 
236 
semiring ops: semiring_ops 

237 
semiring rules: semiring_rules 

238 
ring ops: ring_ops 

239 
ring rules: ring_rules] 

23252  240 

241 
end 

242 

243 

23258
9062e98fdab1
renamed locale ring/semiring to gb_ring/gb_semiring to avoid clash with Ring_and_Field versions;
wenzelm
parents:
23252
diff
changeset

244 
interpretation class_ring: gb_ring ["op +" "op *" "op ^" 
23252  245 
"0::'a::{comm_semiring_1,recpower,number_ring}" 1 "op " "uminus"] 
246 
by unfold_locales simp_all 

247 

248 

26462  249 
declaration {* normalizer_funs @{thm class_ring.gb_ring_axioms'} *} 
23252  250 

251 
use "Tools/Groebner_Basis/normalizer.ML" 

252 

27666  253 

23252  254 
method_setup sring_norm = {* 
255 
Method.ctxt_args (fn ctxt => Method.SIMPLE_METHOD' (Normalizer.semiring_normalize_tac ctxt)) 

23458  256 
*} "semiring normalizer" 
23252  257 

258 

23327  259 
locale gb_field = gb_ring + 
260 
fixes divide :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" 

261 
and inverse:: "'a \<Rightarrow> 'a" 

262 
assumes divide: "divide x y = mul x (inverse y)" 

263 
and inverse: "inverse x = divide r1 x" 

264 
begin 

265 

26462  266 
lemmas gb_field_axioms' = 
26314  267 
gb_field_axioms [normalizer 
268 
semiring ops: semiring_ops 

269 
semiring rules: semiring_rules 

270 
ring ops: ring_ops 

271 
ring rules: ring_rules] 

23327  272 

273 
end 

274 

23458  275 

23266  276 
subsection {* Groebner Bases *} 
23252  277 

23258
9062e98fdab1
renamed locale ring/semiring to gb_ring/gb_semiring to avoid clash with Ring_and_Field versions;
wenzelm
parents:
23252
diff
changeset

278 
locale semiringb = gb_semiring + 
23252  279 
assumes add_cancel: "add (x::'a) y = add x z \<longleftrightarrow> y = z" 
280 
and add_mul_solve: "add (mul w y) (mul x z) = 

281 
add (mul w z) (mul x y) \<longleftrightarrow> w = x \<or> y = z" 

282 
begin 

283 

284 
lemma noteq_reduce: "a \<noteq> b \<and> c \<noteq> d \<longleftrightarrow> add (mul a c) (mul b d) \<noteq> add (mul a d) (mul b c)" 

285 
proof 

286 
have "a \<noteq> b \<and> c \<noteq> d \<longleftrightarrow> \<not> (a = b \<or> c = d)" by simp 

287 
also have "\<dots> \<longleftrightarrow> add (mul a c) (mul b d) \<noteq> add (mul a d) (mul b c)" 

288 
using add_mul_solve by blast 

289 
finally show "a \<noteq> b \<and> c \<noteq> d \<longleftrightarrow> add (mul a c) (mul b d) \<noteq> add (mul a d) (mul b c)" 

290 
by simp 

291 
qed 

292 

293 
lemma add_scale_eq_noteq: "\<lbrakk>r \<noteq> r0 ; (a = b) \<and> ~(c = d)\<rbrakk> 

294 
\<Longrightarrow> add a (mul r c) \<noteq> add b (mul r d)" 

295 
proof(clarify) 

296 
assume nz: "r\<noteq> r0" and cnd: "c\<noteq>d" 

297 
and eq: "add b (mul r c) = add b (mul r d)" 

298 
hence "mul r c = mul r d" using cnd add_cancel by simp 

299 
hence "add (mul r0 d) (mul r c) = add (mul r0 c) (mul r d)" 

300 
using mul_0 add_cancel by simp 

301 
thus "False" using add_mul_solve nz cnd by simp 

302 
qed 

303 

25250
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

304 
lemma add_r0_iff: " x = add x a \<longleftrightarrow> a = r0" 
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

305 
proof 
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

306 
have "a = r0 \<longleftrightarrow> add x a = add x r0" by (simp add: add_cancel) 
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

307 
thus "x = add x a \<longleftrightarrow> a = r0" by (auto simp add: add_c add_0) 
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

308 
qed 
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

309 

26462  310 
declare gb_semiring_axioms' [normalizer del] 
23252  311 

26462  312 
lemmas semiringb_axioms' = semiringb_axioms [normalizer 
23252  313 
semiring ops: semiring_ops 
314 
semiring rules: semiring_rules 

26314  315 
idom rules: noteq_reduce add_scale_eq_noteq] 
23252  316 

317 
end 

318 

25250
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

319 
locale ringb = semiringb + gb_ring + 
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

320 
assumes subr0_iff: "sub x y = r0 \<longleftrightarrow> x = y" 
23252  321 
begin 
322 

26462  323 
declare gb_ring_axioms' [normalizer del] 
23252  324 

26462  325 
lemmas ringb_axioms' = ringb_axioms [normalizer 
23252  326 
semiring ops: semiring_ops 
327 
semiring rules: semiring_rules 

328 
ring ops: ring_ops 

329 
ring rules: ring_rules 

25250
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

330 
idom rules: noteq_reduce add_scale_eq_noteq 
26314  331 
ideal rules: subr0_iff add_r0_iff] 
23252  332 

333 
end 

334 

25250
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

335 

23252  336 
lemma no_zero_divirors_neq0: 
337 
assumes az: "(a::'a::no_zero_divisors) \<noteq> 0" 

338 
and ab: "a*b = 0" shows "b = 0" 

339 
proof  

340 
{ assume bz: "b \<noteq> 0" 

341 
from no_zero_divisors [OF az bz] ab have False by blast } 

342 
thus "b = 0" by blast 

343 
qed 

344 

345 
interpretation class_ringb: ringb 

346 
["op +" "op *" "op ^" "0::'a::{idom,recpower,number_ring}" "1" "op " "uminus"] 

23477
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
nipkow
parents:
23458
diff
changeset

347 
proof(unfold_locales, simp add: ring_simps power_Suc, auto) 
23252  348 
fix w x y z ::"'a::{idom,recpower,number_ring}" 
349 
assume p: "w * y + x * z = w * z + x * y" and ynz: "y \<noteq> z" 

350 
hence ynz': "y  z \<noteq> 0" by simp 

351 
from p have "w * y + x* z  w*z  x*y = 0" by simp 

23477
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
nipkow
parents:
23458
diff
changeset

352 
hence "w* (y  z)  x * (y  z) = 0" by (simp add: ring_simps) 
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
nipkow
parents:
23458
diff
changeset

353 
hence "(y  z) * (w  x) = 0" by (simp add: ring_simps) 
23252  354 
with no_zero_divirors_neq0 [OF ynz'] 
355 
have "w  x = 0" by blast 

356 
thus "w = x" by simp 

357 
qed 

358 

26462  359 
declaration {* normalizer_funs @{thm class_ringb.ringb_axioms'} *} 
23252  360 

361 
interpretation natgb: semiringb 

362 
["op +" "op *" "op ^" "0::nat" "1"] 

23477
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
nipkow
parents:
23458
diff
changeset

363 
proof (unfold_locales, simp add: ring_simps power_Suc) 
23252  364 
fix w x y z ::"nat" 
365 
{ assume p: "w * y + x * z = w * z + x * y" and ynz: "y \<noteq> z" 

366 
hence "y < z \<or> y > z" by arith 

367 
moreover { 

368 
assume lt:"y <z" hence "\<exists>k. z = y + k \<and> k > 0" by (rule_tac x="z  y" in exI, auto) 

369 
then obtain k where kp: "k>0" and yz:"z = y + k" by blast 

23477
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
nipkow
parents:
23458
diff
changeset

370 
from p have "(w * y + x *y) + x*k = (w * y + x*y) + w*k" by (simp add: yz ring_simps) 
23252  371 
hence "x*k = w*k" by simp 
372 
hence "w = x" using kp by (simp add: mult_cancel2) } 

373 
moreover { 

374 
assume lt: "y >z" hence "\<exists>k. y = z + k \<and> k>0" by (rule_tac x="y  z" in exI, auto) 

375 
then obtain k where kp: "k>0" and yz:"y = z + k" by blast 

23477
f4b83f03cac9
tuned and renamed group_eq_simps and ring_eq_simps
nipkow
parents:
23458
diff
changeset

376 
from p have "(w * z + x *z) + w*k = (w * z + x*z) + x*k" by (simp add: yz ring_simps) 
23252  377 
hence "w*k = x*k" by simp 
378 
hence "w = x" using kp by (simp add: mult_cancel2)} 

379 
ultimately have "w=x" by blast } 

380 
thus "(w * y + x * z = w * z + x * y) = (w = x \<or> y = z)" by auto 

381 
qed 

382 

26462  383 
declaration {* normalizer_funs @{thm natgb.semiringb_axioms'} *} 
23252  384 

23327  385 
locale fieldgb = ringb + gb_field 
386 
begin 

387 

26462  388 
declare gb_field_axioms' [normalizer del] 
23327  389 

26462  390 
lemmas fieldgb_axioms' = fieldgb_axioms [normalizer 
23327  391 
semiring ops: semiring_ops 
392 
semiring rules: semiring_rules 

393 
ring ops: ring_ops 

394 
ring rules: ring_rules 

25250
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

395 
idom rules: noteq_reduce add_scale_eq_noteq 
26314  396 
ideal rules: subr0_iff add_r0_iff] 
397 

23327  398 
end 
399 

400 

23258
9062e98fdab1
renamed locale ring/semiring to gb_ring/gb_semiring to avoid clash with Ring_and_Field versions;
wenzelm
parents:
23252
diff
changeset

401 
lemmas bool_simps = simp_thms(134) 
23252  402 
lemma dnf: 
403 
"(P & (Q  R)) = ((P&Q)  (P&R))" "((Q  R) & P) = ((Q&P)  (R&P))" 

404 
"(P \<and> Q) = (Q \<and> P)" "(P \<or> Q) = (Q \<or> P)" 

405 
by blast+ 

406 

407 
lemmas weak_dnf_simps = dnf bool_simps 

408 

409 
lemma nnf_simps: 

410 
"(\<not>(P \<and> Q)) = (\<not>P \<or> \<not>Q)" "(\<not>(P \<or> Q)) = (\<not>P \<and> \<not>Q)" "(P \<longrightarrow> Q) = (\<not>P \<or> Q)" 

411 
"(P = Q) = ((P \<and> Q) \<or> (\<not>P \<and> \<not> Q))" "(\<not> \<not>(P)) = P" 

412 
by blast+ 

413 

414 
lemma PFalse: 

415 
"P \<equiv> False \<Longrightarrow> \<not> P" 

416 
"\<not> P \<Longrightarrow> (P \<equiv> False)" 

417 
by auto 

418 
use "Tools/Groebner_Basis/groebner.ML" 

419 

23332
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

420 
method_setup algebra = 
23458  421 
{* 
23332
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

422 
let 
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

423 
fun keyword k = Scan.lift (Args.$$$ k  Args.colon) >> K () 
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

424 
val addN = "add" 
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

425 
val delN = "del" 
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

426 
val any_keyword = keyword addN  keyword delN 
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

427 
val thms = Scan.repeat (Scan.unless any_keyword Attrib.multi_thm) >> flat; 
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

428 
in 
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

429 
fn src => Method.syntax 
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

430 
((Scan.optional (keyword addN  thms) [])  
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

431 
(Scan.optional (keyword delN  thms) [])) src 
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

432 
#> (fn ((add_ths, del_ths), ctxt) => 
25250
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

433 
Method.SIMPLE_METHOD' (Groebner.algebra_tac add_ths del_ths ctxt)) 
23332
b91295432e6d
algebra_tac moved to file Tools/Groebner_Basis/groebner.ML; Method now takes theorems to be added or deleted from a simpset for simplificatio *before* the core method starts
chaieb
parents:
23330
diff
changeset

434 
end 
25250
b3a485b98963
(1) added axiom to ringb and theorems to enable algebra to prove the ideal membership problem; (2) Method algebra now calls algebra_tac which first tries to solve a universal formula, then in case of failure trie to solve the ideal membership problem (see HOL/Tools/Groebner_Basis/groebner.ML)
chaieb
parents:
23573
diff
changeset

435 
*} "solve polynomial equations over (semi)rings and ideal membership problems using Groebner bases" 
27666  436 
declare dvd_def[algebra] 
437 
declare dvd_eq_mod_eq_0[symmetric, algebra] 

438 
declare nat_mod_div_trivial[algebra] 

439 
declare nat_mod_mod_trivial[algebra] 

440 
declare conjunct1[OF DIVISION_BY_ZERO, algebra] 

441 
declare conjunct2[OF DIVISION_BY_ZERO, algebra] 

442 
declare zmod_zdiv_equality[symmetric,algebra] 

443 
declare zdiv_zmod_equality[symmetric, algebra] 

444 
declare zdiv_zminus_zminus[algebra] 

445 
declare zmod_zminus_zminus[algebra] 

446 
declare zdiv_zminus2[algebra] 

447 
declare zmod_zminus2[algebra] 

448 
declare zdiv_zero[algebra] 

449 
declare zmod_zero[algebra] 

450 
declare zmod_1[algebra] 

451 
declare zdiv_1[algebra] 

452 
declare zmod_minus1_right[algebra] 

453 
declare zdiv_minus1_right[algebra] 

454 
declare mod_div_trivial[algebra] 

455 
declare mod_mod_trivial[algebra] 

456 
declare zmod_zmult_self1[algebra] 

457 
declare zmod_zmult_self2[algebra] 

458 
declare zmod_eq_0_iff[algebra] 

459 
declare zdvd_0_left[algebra] 

460 
declare zdvd1_eq[algebra] 

461 
declare zmod_eq_dvd_iff[algebra] 

462 
declare nat_mod_eq_iff[algebra] 

23252  463 

464 
end 