1
(************************************************************************)
2
(* v * The Coq Proof Assistant / The Coq Development Team *)
3
(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
4
(* \VV/ **************************************************************)
5
(* // * This file is distributed under the terms of the *)
6
(* * GNU Lesser General Public License Version 2.1 *)
7
(************************************************************************)
9
(* $Id: Setoid_ring_normalize.v 9370 2006-11-13 09:21:31Z herbelin $ *)
11
Require Import Setoid_ring_theory.
14
Set Implicit Arguments.
15
Unset Boxed Definitions.
17
Lemma index_eq_prop : forall n m:index, Is_true (index_eq n m) -> n = m.
19
simple induction n; simple induction m; simpl in |- *;
20
try reflexivity || contradiction.
21
intros; rewrite (H i0); trivial.
22
intros; rewrite (H i0); trivial.
28
Variable Aequiv : A -> A -> Prop.
29
Variable Aplus : A -> A -> A.
30
Variable Amult : A -> A -> A.
33
Variable Aopp : A -> A.
34
Variable Aeq : A -> A -> bool.
36
Variable S : Setoid_Theory A Aequiv.
38
Add Setoid A Aequiv S as Asetoid.
41
forall a a0:A, Aequiv a a0 ->
42
forall a1 a2:A, Aequiv a1 a2 ->
43
Aequiv (Aplus a a1) (Aplus a0 a2).
45
forall a a0:A, Aequiv a a0 ->
46
forall a1 a2:A, Aequiv a1 a2 ->
47
Aequiv (Amult a a1) (Amult a0 a2).
48
Variable opp_morph : forall a a0:A, Aequiv a a0 -> Aequiv (Aopp a) (Aopp a0).
50
Add Morphism Aplus : Aplus_ext.
51
intros; apply plus_morph; assumption.
54
Add Morphism Amult : Amult_ext.
55
intros; apply mult_morph; assumption.
58
Add Morphism Aopp : Aopp_ext.
62
Let equiv_refl := Seq_refl A Aequiv S.
63
Let equiv_sym := Seq_sym A Aequiv S.
64
Let equiv_trans := Seq_trans A Aequiv S.
66
Hint Resolve equiv_refl equiv_trans.
67
Hint Immediate equiv_sym.
69
Section semi_setoid_rings.
71
(* Section definitions. *)
74
(******************************************)
75
(* Normal abtract Polynomials *)
76
(******************************************)
78
- A varlist is a sorted product of one or more variables : x, x*y*z
79
- A monom is a constant, a varlist or the product of a constant by a varlist
80
variables. 2*x*y, x*y*z, 3 are monoms : 2*3, x*3*y, 4*x*3 are NOT.
81
- A canonical sum is either a monom or an ordered sum of monoms
82
(the order on monoms is defined later)
83
- A normal polynomial it either a constant or a canonical sum or a constant
87
(* varlist is isomorphic to (list var), but we built a special inductive
89
Inductive varlist : Type :=
91
| Cons_var : index -> varlist -> varlist.
93
Inductive canonical_sum : Type :=
94
| Nil_monom : canonical_sum
95
| Cons_monom : A -> varlist -> canonical_sum -> canonical_sum
96
| Cons_varlist : varlist -> canonical_sum -> canonical_sum.
100
(* That's the lexicographic order on varlist, extended by :
101
- A constant is less than every monom
102
- The relation between two varlist is preserved by multiplication by a
113
Fixpoint varlist_eq (x y:varlist) {struct y} : bool :=
115
| Nil_var, Nil_var => true
116
| Cons_var i xrest, Cons_var j yrest =>
117
andb (index_eq i j) (varlist_eq xrest yrest)
121
Fixpoint varlist_lt (x y:varlist) {struct y} : bool :=
123
| Nil_var, Cons_var _ _ => true
124
| Cons_var i xrest, Cons_var j yrest =>
127
else andb (index_eq i j) (varlist_lt xrest yrest)
131
(* merges two variables lists *)
132
Fixpoint varlist_merge (l1:varlist) : varlist -> varlist :=
135
(fix vm_aux (l2:varlist) : varlist :=
139
then Cons_var v1 (varlist_merge t1 l2)
140
else Cons_var v2 (vm_aux t2)
143
| Nil_var => fun l2 => l2
146
(* returns the sum of two canonical sums *)
147
Fixpoint canonical_sum_merge (s1:canonical_sum) :
148
canonical_sum -> canonical_sum :=
150
| Cons_monom c1 l1 t1 =>
151
(fix csm_aux (s2:canonical_sum) : canonical_sum :=
153
| Cons_monom c2 l2 t2 =>
155
then Cons_monom (Aplus c1 c2) l1 (canonical_sum_merge t1 t2)
158
then Cons_monom c1 l1 (canonical_sum_merge t1 s2)
159
else Cons_monom c2 l2 (csm_aux t2)
160
| Cons_varlist l2 t2 =>
162
then Cons_monom (Aplus c1 Aone) l1 (canonical_sum_merge t1 t2)
165
then Cons_monom c1 l1 (canonical_sum_merge t1 s2)
166
else Cons_varlist l2 (csm_aux t2)
169
| Cons_varlist l1 t1 =>
170
(fix csm_aux2 (s2:canonical_sum) : canonical_sum :=
172
| Cons_monom c2 l2 t2 =>
174
then Cons_monom (Aplus Aone c2) l1 (canonical_sum_merge t1 t2)
177
then Cons_varlist l1 (canonical_sum_merge t1 s2)
178
else Cons_monom c2 l2 (csm_aux2 t2)
179
| Cons_varlist l2 t2 =>
181
then Cons_monom (Aplus Aone Aone) l1 (canonical_sum_merge t1 t2)
184
then Cons_varlist l1 (canonical_sum_merge t1 s2)
185
else Cons_varlist l2 (csm_aux2 t2)
188
| Nil_monom => fun s2 => s2
191
(* Insertion of a monom in a canonical sum *)
192
Fixpoint monom_insert (c1:A) (l1:varlist) (s2:canonical_sum) {struct s2} :
195
| Cons_monom c2 l2 t2 =>
197
then Cons_monom (Aplus c1 c2) l1 t2
200
then Cons_monom c1 l1 s2
201
else Cons_monom c2 l2 (monom_insert c1 l1 t2)
202
| Cons_varlist l2 t2 =>
204
then Cons_monom (Aplus c1 Aone) l1 t2
207
then Cons_monom c1 l1 s2
208
else Cons_varlist l2 (monom_insert c1 l1 t2)
209
| Nil_monom => Cons_monom c1 l1 Nil_monom
212
Fixpoint varlist_insert (l1:varlist) (s2:canonical_sum) {struct s2} :
215
| Cons_monom c2 l2 t2 =>
217
then Cons_monom (Aplus Aone c2) l1 t2
220
then Cons_varlist l1 s2
221
else Cons_monom c2 l2 (varlist_insert l1 t2)
222
| Cons_varlist l2 t2 =>
224
then Cons_monom (Aplus Aone Aone) l1 t2
227
then Cons_varlist l1 s2
228
else Cons_varlist l2 (varlist_insert l1 t2)
229
| Nil_monom => Cons_varlist l1 Nil_monom
233
Fixpoint canonical_sum_scalar (c0:A) (s:canonical_sum) {struct s} :
236
| Cons_monom c l t => Cons_monom (Amult c0 c) l (canonical_sum_scalar c0 t)
237
| Cons_varlist l t => Cons_monom c0 l (canonical_sum_scalar c0 t)
238
| Nil_monom => Nil_monom
242
Fixpoint canonical_sum_scalar2 (l0:varlist) (s:canonical_sum) {struct s} :
245
| Cons_monom c l t =>
246
monom_insert c (varlist_merge l0 l) (canonical_sum_scalar2 l0 t)
247
| Cons_varlist l t =>
248
varlist_insert (varlist_merge l0 l) (canonical_sum_scalar2 l0 t)
249
| Nil_monom => Nil_monom
252
(* Computes c0*l0*s *)
253
Fixpoint canonical_sum_scalar3 (c0:A) (l0:varlist)
254
(s:canonical_sum) {struct s} : canonical_sum :=
256
| Cons_monom c l t =>
257
monom_insert (Amult c0 c) (varlist_merge l0 l)
258
(canonical_sum_scalar3 c0 l0 t)
259
| Cons_varlist l t =>
260
monom_insert c0 (varlist_merge l0 l) (canonical_sum_scalar3 c0 l0 t)
261
| Nil_monom => Nil_monom
264
(* returns the product of two canonical sums *)
265
Fixpoint canonical_sum_prod (s1 s2:canonical_sum) {struct s1} :
268
| Cons_monom c1 l1 t1 =>
269
canonical_sum_merge (canonical_sum_scalar3 c1 l1 s2)
270
(canonical_sum_prod t1 s2)
271
| Cons_varlist l1 t1 =>
272
canonical_sum_merge (canonical_sum_scalar2 l1 s2)
273
(canonical_sum_prod t1 s2)
274
| Nil_monom => Nil_monom
277
(* The type to represent concrete semi-setoid-ring polynomials *)
279
Inductive setspolynomial : Type :=
280
| SetSPvar : index -> setspolynomial
281
| SetSPconst : A -> setspolynomial
282
| SetSPplus : setspolynomial -> setspolynomial -> setspolynomial
283
| SetSPmult : setspolynomial -> setspolynomial -> setspolynomial.
285
Fixpoint setspolynomial_normalize (p:setspolynomial) : canonical_sum :=
288
canonical_sum_merge (setspolynomial_normalize l)
289
(setspolynomial_normalize r)
291
canonical_sum_prod (setspolynomial_normalize l)
292
(setspolynomial_normalize r)
293
| SetSPconst c => Cons_monom c Nil_var Nil_monom
294
| SetSPvar i => Cons_varlist (Cons_var i Nil_var) Nil_monom
297
Fixpoint canonical_sum_simplify (s:canonical_sum) : canonical_sum :=
299
| Cons_monom c l t =>
301
then canonical_sum_simplify t
304
then Cons_varlist l (canonical_sum_simplify t)
305
else Cons_monom c l (canonical_sum_simplify t)
306
| Cons_varlist l t => Cons_varlist l (canonical_sum_simplify t)
307
| Nil_monom => Nil_monom
310
Definition setspolynomial_simplify (x:setspolynomial) :=
311
canonical_sum_simplify (setspolynomial_normalize x).
313
Variable vm : varmap A.
315
Definition interp_var (i:index) := varmap_find Azero i vm.
317
Definition ivl_aux :=
318
(fix ivl_aux (x:index) (t:varlist) {struct t} : A :=
320
| Nil_var => interp_var x
321
| Cons_var x' t' => Amult (interp_var x) (ivl_aux x' t')
324
Definition interp_vl (l:varlist) :=
327
| Cons_var x t => ivl_aux x t
330
Definition interp_m (c:A) (l:varlist) :=
333
| Cons_var x t => Amult c (ivl_aux x t)
336
Definition ics_aux :=
337
(fix ics_aux (a:A) (s:canonical_sum) {struct s} : A :=
340
| Cons_varlist l t => Aplus a (ics_aux (interp_vl l) t)
341
| Cons_monom c l t => Aplus a (ics_aux (interp_m c l) t)
344
Definition interp_setcs (s:canonical_sum) : A :=
347
| Cons_varlist l t => ics_aux (interp_vl l) t
348
| Cons_monom c l t => ics_aux (interp_m c l) t
351
Fixpoint interp_setsp (p:setspolynomial) : A :=
354
| SetSPvar i => interp_var i
355
| SetSPplus p1 p2 => Aplus (interp_setsp p1) (interp_setsp p2)
356
| SetSPmult p1 p2 => Amult (interp_setsp p1) (interp_setsp p2)
359
(* End interpretation. *)
361
Unset Implicit Arguments.
363
(* Section properties. *)
365
Variable T : Semi_Setoid_Ring_Theory Aequiv Aplus Amult Aone Azero Aeq.
367
Hint Resolve (SSR_plus_comm T).
368
Hint Resolve (SSR_plus_assoc T).
369
Hint Resolve (SSR_plus_assoc2 S T).
370
Hint Resolve (SSR_mult_comm T).
371
Hint Resolve (SSR_mult_assoc T).
372
Hint Resolve (SSR_mult_assoc2 S T).
373
Hint Resolve (SSR_plus_zero_left T).
374
Hint Resolve (SSR_plus_zero_left2 S T).
375
Hint Resolve (SSR_mult_one_left T).
376
Hint Resolve (SSR_mult_one_left2 S T).
377
Hint Resolve (SSR_mult_zero_left T).
378
Hint Resolve (SSR_mult_zero_left2 S T).
379
Hint Resolve (SSR_distr_left T).
380
Hint Resolve (SSR_distr_left2 S T).
381
Hint Resolve (SSR_plus_reg_left T).
382
Hint Resolve (SSR_plus_permute S plus_morph T).
383
Hint Resolve (SSR_mult_permute S mult_morph T).
384
Hint Resolve (SSR_distr_right S plus_morph T).
385
Hint Resolve (SSR_distr_right2 S plus_morph T).
386
Hint Resolve (SSR_mult_zero_right S T).
387
Hint Resolve (SSR_mult_zero_right2 S T).
388
Hint Resolve (SSR_plus_zero_right S T).
389
Hint Resolve (SSR_plus_zero_right2 S T).
390
Hint Resolve (SSR_mult_one_right S T).
391
Hint Resolve (SSR_mult_one_right2 S T).
392
Hint Resolve (SSR_plus_reg_right S T).
393
Hint Resolve refl_equal sym_equal trans_equal.
394
(*Hints Resolve refl_eqT sym_eqT trans_eqT.*)
397
Lemma varlist_eq_prop : forall x y:varlist, Is_true (varlist_eq x y) -> x = y.
399
simple induction x; simple induction y; contradiction || (try reflexivity).
400
simpl in |- *; intros.
401
generalize (andb_prop2 _ _ H1); intros; elim H2; intros.
402
rewrite (index_eq_prop _ _ H3); rewrite (H v0 H4); reflexivity.
406
forall (v:varlist) (i:index),
407
Aequiv (ivl_aux i v) (Amult (interp_var i) (interp_vl v)).
409
simple induction v; simpl in |- *; intros.
411
rewrite (H i); trivial.
414
Lemma varlist_merge_ok :
416
Aequiv (interp_vl (varlist_merge x y)) (Amult (interp_vl x) (interp_vl y)).
419
simpl in |- *; trivial.
421
simpl in |- *; trivial.
422
simpl in |- *; intros.
423
elim (index_lt i i0); simpl in |- *; intros.
425
rewrite (ivl_aux_ok v i).
426
rewrite (ivl_aux_ok v0 i0).
427
rewrite (ivl_aux_ok (varlist_merge v (Cons_var i0 v0)) i).
428
rewrite (H (Cons_var i0 v0)).
430
rewrite (ivl_aux_ok v0 i0).
433
rewrite (ivl_aux_ok v i).
434
rewrite (ivl_aux_ok v0 i0).
437
((fix vm_aux (l2:varlist) : varlist :=
439
| Nil_var => Cons_var i v
442
then Cons_var i (varlist_merge v l2)
443
else Cons_var v2 (vm_aux t2)
446
rewrite (ivl_aux_ok v i).
451
forall (x:A) (s:canonical_sum),
452
Aequiv (ics_aux x s) (Aplus x (interp_setcs s)).
454
simple induction s; simpl in |- *; intros; trivial.
458
forall (x:A) (l:varlist), Aequiv (interp_m x l) (Amult x (interp_vl l)).
460
destruct l as [| i v]; trivial.
463
Hint Resolve ivl_aux_ok.
464
Hint Resolve ics_aux_ok.
465
Hint Resolve interp_m_ok.
467
(* Hints Resolve ivl_aux_ok ics_aux_ok interp_m_ok. *)
469
Lemma canonical_sum_merge_ok :
470
forall x y:canonical_sum,
471
Aequiv (interp_setcs (canonical_sum_merge x y))
472
(Aplus (interp_setcs x) (interp_setcs y)).
474
simple induction x; simpl in |- *.
477
simple induction y; simpl in |- *; intros.
480
generalize (varlist_eq_prop v v0).
481
elim (varlist_eq v v0).
482
intros; rewrite (H1 I).
484
rewrite (ics_aux_ok (interp_m a v0) c).
485
rewrite (ics_aux_ok (interp_m a0 v0) c0).
486
rewrite (ics_aux_ok (interp_m (Aplus a a0) v0) (canonical_sum_merge c c0)).
488
rewrite (interp_m_ok (Aplus a a0) v0).
489
rewrite (interp_m_ok a v0).
490
rewrite (interp_m_ok a0 v0).
491
setoid_replace (Amult (Aplus a a0) (interp_vl v0)) with
492
(Aplus (Amult a (interp_vl v0)) (Amult a0 (interp_vl v0)));
495
(Aplus (Aplus (Amult a (interp_vl v0)) (Amult a0 (interp_vl v0)))
496
(Aplus (interp_setcs c) (interp_setcs c0))) with
497
(Aplus (Amult a (interp_vl v0))
498
(Aplus (Amult a0 (interp_vl v0))
499
(Aplus (interp_setcs c) (interp_setcs c0))));
502
(Aplus (Aplus (Amult a (interp_vl v0)) (interp_setcs c))
503
(Aplus (Amult a0 (interp_vl v0)) (interp_setcs c0))) with
504
(Aplus (Amult a (interp_vl v0))
505
(Aplus (interp_setcs c)
506
(Aplus (Amult a0 (interp_vl v0)) (interp_setcs c0))));
510
elim (varlist_lt v v0); simpl in |- *.
513
(ics_aux_ok (interp_m a v) (canonical_sum_merge c (Cons_monom a0 v0 c0)))
515
rewrite (ics_aux_ok (interp_m a v) c).
516
rewrite (ics_aux_ok (interp_m a0 v0) c0).
517
rewrite (H (Cons_monom a0 v0 c0)); simpl in |- *.
518
rewrite (ics_aux_ok (interp_m a0 v0) c0); auto.
522
(ics_aux_ok (interp_m a0 v0)
523
((fix csm_aux (s2:canonical_sum) : canonical_sum :=
525
| Nil_monom => Cons_monom a v c
526
| Cons_monom c2 l2 t2 =>
528
then Cons_monom (Aplus a c2) v (canonical_sum_merge c t2)
531
then Cons_monom a v (canonical_sum_merge c s2)
532
else Cons_monom c2 l2 (csm_aux t2)
533
| Cons_varlist l2 t2 =>
535
then Cons_monom (Aplus a Aone) v (canonical_sum_merge c t2)
538
then Cons_monom a v (canonical_sum_merge c s2)
539
else Cons_varlist l2 (csm_aux t2)
542
rewrite (ics_aux_ok (interp_m a v) c);
543
rewrite (ics_aux_ok (interp_m a0 v0) c0); simpl in |- *;
546
generalize (varlist_eq_prop v v0).
547
elim (varlist_eq v v0).
548
intros; rewrite (H1 I).
550
rewrite (ics_aux_ok (interp_m (Aplus a Aone) v0) (canonical_sum_merge c c0));
551
rewrite (ics_aux_ok (interp_m a v0) c);
552
rewrite (ics_aux_ok (interp_vl v0) c0).
554
rewrite (interp_m_ok (Aplus a Aone) v0).
555
rewrite (interp_m_ok a v0).
556
setoid_replace (Amult (Aplus a Aone) (interp_vl v0)) with
557
(Aplus (Amult a (interp_vl v0)) (Amult Aone (interp_vl v0)));
560
(Aplus (Aplus (Amult a (interp_vl v0)) (Amult Aone (interp_vl v0)))
561
(Aplus (interp_setcs c) (interp_setcs c0))) with
562
(Aplus (Amult a (interp_vl v0))
563
(Aplus (Amult Aone (interp_vl v0))
564
(Aplus (interp_setcs c) (interp_setcs c0))));
567
(Aplus (Aplus (Amult a (interp_vl v0)) (interp_setcs c))
568
(Aplus (interp_vl v0) (interp_setcs c0))) with
569
(Aplus (Amult a (interp_vl v0))
570
(Aplus (interp_setcs c) (Aplus (interp_vl v0) (interp_setcs c0))));
572
setoid_replace (Amult Aone (interp_vl v0)) with (interp_vl v0);
576
elim (varlist_lt v v0); simpl in |- *.
579
(ics_aux_ok (interp_m a v) (canonical_sum_merge c (Cons_varlist v0 c0)))
580
; rewrite (ics_aux_ok (interp_m a v) c);
581
rewrite (ics_aux_ok (interp_vl v0) c0).
582
rewrite (H (Cons_varlist v0 c0)); simpl in |- *.
583
rewrite (ics_aux_ok (interp_vl v0) c0).
588
(ics_aux_ok (interp_vl v0)
589
((fix csm_aux (s2:canonical_sum) : canonical_sum :=
591
| Nil_monom => Cons_monom a v c
592
| Cons_monom c2 l2 t2 =>
594
then Cons_monom (Aplus a c2) v (canonical_sum_merge c t2)
597
then Cons_monom a v (canonical_sum_merge c s2)
598
else Cons_monom c2 l2 (csm_aux t2)
599
| Cons_varlist l2 t2 =>
601
then Cons_monom (Aplus a Aone) v (canonical_sum_merge c t2)
604
then Cons_monom a v (canonical_sum_merge c s2)
605
else Cons_varlist l2 (csm_aux t2)
606
end) c0)); rewrite H0.
607
rewrite (ics_aux_ok (interp_m a v) c); rewrite (ics_aux_ok (interp_vl v0) c0);
611
simple induction y; simpl in |- *; intros.
614
generalize (varlist_eq_prop v v0).
615
elim (varlist_eq v v0).
616
intros; rewrite (H1 I).
618
rewrite (ics_aux_ok (interp_m (Aplus Aone a) v0) (canonical_sum_merge c c0));
619
rewrite (ics_aux_ok (interp_vl v0) c);
620
rewrite (ics_aux_ok (interp_m a v0) c0); rewrite (H c0).
621
rewrite (interp_m_ok (Aplus Aone a) v0); rewrite (interp_m_ok a v0).
622
setoid_replace (Amult (Aplus Aone a) (interp_vl v0)) with
623
(Aplus (Amult Aone (interp_vl v0)) (Amult a (interp_vl v0)));
626
(Aplus (Aplus (Amult Aone (interp_vl v0)) (Amult a (interp_vl v0)))
627
(Aplus (interp_setcs c) (interp_setcs c0))) with
628
(Aplus (Amult Aone (interp_vl v0))
629
(Aplus (Amult a (interp_vl v0))
630
(Aplus (interp_setcs c) (interp_setcs c0))));
633
(Aplus (Aplus (interp_vl v0) (interp_setcs c))
634
(Aplus (Amult a (interp_vl v0)) (interp_setcs c0))) with
635
(Aplus (interp_vl v0)
636
(Aplus (interp_setcs c)
637
(Aplus (Amult a (interp_vl v0)) (interp_setcs c0))));
641
elim (varlist_lt v v0); simpl in |- *; intros.
643
(ics_aux_ok (interp_vl v) (canonical_sum_merge c (Cons_monom a v0 c0)))
644
; rewrite (ics_aux_ok (interp_vl v) c);
645
rewrite (ics_aux_ok (interp_m a v0) c0).
646
rewrite (H (Cons_monom a v0 c0)); simpl in |- *.
647
rewrite (ics_aux_ok (interp_m a v0) c0); auto.
650
(ics_aux_ok (interp_m a v0)
651
((fix csm_aux2 (s2:canonical_sum) : canonical_sum :=
653
| Nil_monom => Cons_varlist v c
654
| Cons_monom c2 l2 t2 =>
656
then Cons_monom (Aplus Aone c2) v (canonical_sum_merge c t2)
659
then Cons_varlist v (canonical_sum_merge c s2)
660
else Cons_monom c2 l2 (csm_aux2 t2)
661
| Cons_varlist l2 t2 =>
663
then Cons_monom (Aplus Aone Aone) v (canonical_sum_merge c t2)
666
then Cons_varlist v (canonical_sum_merge c s2)
667
else Cons_varlist l2 (csm_aux2 t2)
668
end) c0)); rewrite H0.
669
rewrite (ics_aux_ok (interp_vl v) c); rewrite (ics_aux_ok (interp_m a v0) c0);
672
generalize (varlist_eq_prop v v0).
673
elim (varlist_eq v v0); intros.
674
rewrite (H1 I); simpl in |- *.
676
(ics_aux_ok (interp_m (Aplus Aone Aone) v0) (canonical_sum_merge c c0))
677
; rewrite (ics_aux_ok (interp_vl v0) c);
678
rewrite (ics_aux_ok (interp_vl v0) c0); rewrite (H c0).
679
rewrite (interp_m_ok (Aplus Aone Aone) v0).
680
setoid_replace (Amult (Aplus Aone Aone) (interp_vl v0)) with
681
(Aplus (Amult Aone (interp_vl v0)) (Amult Aone (interp_vl v0)));
684
(Aplus (Aplus (Amult Aone (interp_vl v0)) (Amult Aone (interp_vl v0)))
685
(Aplus (interp_setcs c) (interp_setcs c0))) with
686
(Aplus (Amult Aone (interp_vl v0))
687
(Aplus (Amult Aone (interp_vl v0))
688
(Aplus (interp_setcs c) (interp_setcs c0))));
691
(Aplus (Aplus (interp_vl v0) (interp_setcs c))
692
(Aplus (interp_vl v0) (interp_setcs c0))) with
693
(Aplus (interp_vl v0)
694
(Aplus (interp_setcs c) (Aplus (interp_vl v0) (interp_setcs c0))));
696
setoid_replace (Amult Aone (interp_vl v0)) with (interp_vl v0); auto.
698
elim (varlist_lt v v0); simpl in |- *.
700
(ics_aux_ok (interp_vl v) (canonical_sum_merge c (Cons_varlist v0 c0)))
701
; rewrite (ics_aux_ok (interp_vl v) c);
702
rewrite (ics_aux_ok (interp_vl v0) c0); rewrite (H (Cons_varlist v0 c0));
704
rewrite (ics_aux_ok (interp_vl v0) c0); auto.
707
(ics_aux_ok (interp_vl v0)
708
((fix csm_aux2 (s2:canonical_sum) : canonical_sum :=
710
| Nil_monom => Cons_varlist v c
711
| Cons_monom c2 l2 t2 =>
713
then Cons_monom (Aplus Aone c2) v (canonical_sum_merge c t2)
716
then Cons_varlist v (canonical_sum_merge c s2)
717
else Cons_monom c2 l2 (csm_aux2 t2)
718
| Cons_varlist l2 t2 =>
720
then Cons_monom (Aplus Aone Aone) v (canonical_sum_merge c t2)
723
then Cons_varlist v (canonical_sum_merge c s2)
724
else Cons_varlist l2 (csm_aux2 t2)
725
end) c0)); rewrite H0.
726
rewrite (ics_aux_ok (interp_vl v) c); rewrite (ics_aux_ok (interp_vl v0) c0);
730
Lemma monom_insert_ok :
731
forall (a:A) (l:varlist) (s:canonical_sum),
732
Aequiv (interp_setcs (monom_insert a l s))
733
(Aplus (Amult a (interp_vl l)) (interp_setcs s)).
735
simple induction s; intros.
736
simpl in |- *; rewrite (interp_m_ok a l); trivial.
738
simpl in |- *; generalize (varlist_eq_prop l v); elim (varlist_eq l v).
739
intro Hr; rewrite (Hr I); simpl in |- *.
740
rewrite (ics_aux_ok (interp_m (Aplus a a0) v) c);
741
rewrite (ics_aux_ok (interp_m a0 v) c).
742
rewrite (interp_m_ok (Aplus a a0) v); rewrite (interp_m_ok a0 v).
743
setoid_replace (Amult (Aplus a a0) (interp_vl v)) with
744
(Aplus (Amult a (interp_vl v)) (Amult a0 (interp_vl v)));
748
elim (varlist_lt l v); simpl in |- *; intros.
749
rewrite (ics_aux_ok (interp_m a0 v) c).
750
rewrite (interp_m_ok a0 v); rewrite (interp_m_ok a l).
753
rewrite (ics_aux_ok (interp_m a0 v) (monom_insert a l c));
754
rewrite (ics_aux_ok (interp_m a0 v) c); rewrite H.
758
generalize (varlist_eq_prop l v); elim (varlist_eq l v).
759
intro Hr; rewrite (Hr I); simpl in |- *.
760
rewrite (ics_aux_ok (interp_m (Aplus a Aone) v) c);
761
rewrite (ics_aux_ok (interp_vl v) c).
762
rewrite (interp_m_ok (Aplus a Aone) v).
763
setoid_replace (Amult (Aplus a Aone) (interp_vl v)) with
764
(Aplus (Amult a (interp_vl v)) (Amult Aone (interp_vl v)));
766
setoid_replace (Amult Aone (interp_vl v)) with (interp_vl v);
770
elim (varlist_lt l v); simpl in |- *; intros; auto.
771
rewrite (ics_aux_ok (interp_vl v) (monom_insert a l c)); rewrite H.
772
rewrite (ics_aux_ok (interp_vl v) c); auto.
775
Lemma varlist_insert_ok :
776
forall (l:varlist) (s:canonical_sum),
777
Aequiv (interp_setcs (varlist_insert l s))
778
(Aplus (interp_vl l) (interp_setcs s)).
780
simple induction s; simpl in |- *; intros.
783
generalize (varlist_eq_prop l v); elim (varlist_eq l v).
784
intro Hr; rewrite (Hr I); simpl in |- *.
785
rewrite (ics_aux_ok (interp_m (Aplus Aone a) v) c);
786
rewrite (ics_aux_ok (interp_m a v) c).
787
rewrite (interp_m_ok (Aplus Aone a) v); rewrite (interp_m_ok a v).
788
setoid_replace (Amult (Aplus Aone a) (interp_vl v)) with
789
(Aplus (Amult Aone (interp_vl v)) (Amult a (interp_vl v)));
791
setoid_replace (Amult Aone (interp_vl v)) with (interp_vl v); auto.
793
elim (varlist_lt l v); simpl in |- *; intros; auto.
794
rewrite (ics_aux_ok (interp_m a v) (varlist_insert l c));
795
rewrite (ics_aux_ok (interp_m a v) c).
796
rewrite (interp_m_ok a v).
799
generalize (varlist_eq_prop l v); elim (varlist_eq l v).
800
intro Hr; rewrite (Hr I); simpl in |- *.
801
rewrite (ics_aux_ok (interp_m (Aplus Aone Aone) v) c);
802
rewrite (ics_aux_ok (interp_vl v) c).
803
rewrite (interp_m_ok (Aplus Aone Aone) v).
804
setoid_replace (Amult (Aplus Aone Aone) (interp_vl v)) with
805
(Aplus (Amult Aone (interp_vl v)) (Amult Aone (interp_vl v)));
807
setoid_replace (Amult Aone (interp_vl v)) with (interp_vl v); auto.
809
elim (varlist_lt l v); simpl in |- *; intros; auto.
810
rewrite (ics_aux_ok (interp_vl v) (varlist_insert l c)).
812
rewrite (ics_aux_ok (interp_vl v) c); auto.
815
Lemma canonical_sum_scalar_ok :
816
forall (a:A) (s:canonical_sum),
817
Aequiv (interp_setcs (canonical_sum_scalar a s))
818
(Amult a (interp_setcs s)).
820
simple induction s; simpl in |- *; intros.
823
rewrite (ics_aux_ok (interp_m (Amult a a0) v) (canonical_sum_scalar a c));
824
rewrite (ics_aux_ok (interp_m a0 v) c).
825
rewrite (interp_m_ok (Amult a a0) v); rewrite (interp_m_ok a0 v).
827
setoid_replace (Amult a (Aplus (Amult a0 (interp_vl v)) (interp_setcs c)))
828
with (Aplus (Amult a (Amult a0 (interp_vl v))) (Amult a (interp_setcs c)));
832
rewrite (ics_aux_ok (interp_m a v) (canonical_sum_scalar a c));
833
rewrite (ics_aux_ok (interp_vl v) c); rewrite H.
834
rewrite (interp_m_ok a v).
838
Lemma canonical_sum_scalar2_ok :
839
forall (l:varlist) (s:canonical_sum),
840
Aequiv (interp_setcs (canonical_sum_scalar2 l s))
841
(Amult (interp_vl l) (interp_setcs s)).
843
simple induction s; simpl in |- *; intros; auto.
844
rewrite (monom_insert_ok a (varlist_merge l v) (canonical_sum_scalar2 l c)).
845
rewrite (ics_aux_ok (interp_m a v) c).
846
rewrite (interp_m_ok a v).
848
rewrite (varlist_merge_ok l v).
850
(Amult (interp_vl l) (Aplus (Amult a (interp_vl v)) (interp_setcs c))) with
851
(Aplus (Amult (interp_vl l) (Amult a (interp_vl v)))
852
(Amult (interp_vl l) (interp_setcs c)));
856
rewrite (varlist_insert_ok (varlist_merge l v) (canonical_sum_scalar2 l c)).
857
rewrite (ics_aux_ok (interp_vl v) c).
859
rewrite (varlist_merge_ok l v).
863
Lemma canonical_sum_scalar3_ok :
864
forall (c:A) (l:varlist) (s:canonical_sum),
865
Aequiv (interp_setcs (canonical_sum_scalar3 c l s))
866
(Amult c (Amult (interp_vl l) (interp_setcs s))).
868
simple induction s; simpl in |- *; intros.
869
rewrite (SSR_mult_zero_right S T (interp_vl l)).
873
(monom_insert_ok (Amult c a) (varlist_merge l v)
874
(canonical_sum_scalar3 c l c0)).
875
rewrite (ics_aux_ok (interp_m a v) c0).
876
rewrite (interp_m_ok a v).
878
rewrite (varlist_merge_ok l v).
880
(Amult (interp_vl l) (Aplus (Amult a (interp_vl v)) (interp_setcs c0))) with
881
(Aplus (Amult (interp_vl l) (Amult a (interp_vl v)))
882
(Amult (interp_vl l) (interp_setcs c0)));
886
(Aplus (Amult (interp_vl l) (Amult a (interp_vl v)))
887
(Amult (interp_vl l) (interp_setcs c0)))) with
888
(Aplus (Amult c (Amult (interp_vl l) (Amult a (interp_vl v))))
889
(Amult c (Amult (interp_vl l) (interp_setcs c0))));
891
setoid_replace (Amult (Amult c a) (Amult (interp_vl l) (interp_vl v))) with
892
(Amult c (Amult a (Amult (interp_vl l) (interp_vl v))));
897
(monom_insert_ok c (varlist_merge l v) (canonical_sum_scalar3 c l c0))
899
rewrite (ics_aux_ok (interp_vl v) c0).
901
rewrite (varlist_merge_ok l v).
903
(Aplus (Amult c (Amult (interp_vl l) (interp_vl v)))
904
(Amult c (Amult (interp_vl l) (interp_setcs c0)))) with
906
(Aplus (Amult (interp_vl l) (interp_vl v))
907
(Amult (interp_vl l) (interp_setcs c0))));
912
Lemma canonical_sum_prod_ok :
913
forall x y:canonical_sum,
914
Aequiv (interp_setcs (canonical_sum_prod x y))
915
(Amult (interp_setcs x) (interp_setcs y)).
917
simple induction x; simpl in |- *; intros.
921
(canonical_sum_merge_ok (canonical_sum_scalar3 a v y)
922
(canonical_sum_prod c y)).
923
rewrite (canonical_sum_scalar3_ok a v y).
924
rewrite (ics_aux_ok (interp_m a v) c).
925
rewrite (interp_m_ok a v).
927
setoid_replace (Amult a (Amult (interp_vl v) (interp_setcs y))) with
928
(Amult (Amult a (interp_vl v)) (interp_setcs y));
931
(Amult (Aplus (Amult a (interp_vl v)) (interp_setcs c)) (interp_setcs y))
933
(Aplus (Amult (Amult a (interp_vl v)) (interp_setcs y))
934
(Amult (interp_setcs c) (interp_setcs y)));
939
(canonical_sum_merge_ok (canonical_sum_scalar2 v y) (canonical_sum_prod c y))
941
rewrite (canonical_sum_scalar2_ok v y).
942
rewrite (ics_aux_ok (interp_vl v) c).
947
Theorem setspolynomial_normalize_ok :
948
forall p:setspolynomial,
949
Aequiv (interp_setcs (setspolynomial_normalize p)) (interp_setsp p).
951
simple induction p; simpl in |- *; intros; trivial.
953
(canonical_sum_merge_ok (setspolynomial_normalize s)
954
(setspolynomial_normalize s0)).
955
rewrite H; rewrite H0; trivial.
958
(canonical_sum_prod_ok (setspolynomial_normalize s)
959
(setspolynomial_normalize s0)).
960
rewrite H; rewrite H0; trivial.
963
Lemma canonical_sum_simplify_ok :
964
forall s:canonical_sum,
965
Aequiv (interp_setcs (canonical_sum_simplify s)) (interp_setcs s).
967
simple induction s; simpl in |- *; intros.
970
generalize (SSR_eq_prop T a Azero).
974
rewrite (ics_aux_ok (interp_m a v) c).
975
rewrite (interp_m_ok a v).
977
setoid_replace (Amult Azero (interp_vl v)) with Azero;
982
intros; simpl in |- *.
983
generalize (SSR_eq_prop T a Aone).
986
rewrite (ics_aux_ok (interp_m a v) c).
987
rewrite (interp_m_ok a v).
990
rewrite (ics_aux_ok (interp_vl v) (canonical_sum_simplify c)).
996
rewrite (ics_aux_ok (interp_m a v) (canonical_sum_simplify c)).
997
rewrite (ics_aux_ok (interp_m a v) c).
1000
rewrite (ics_aux_ok (interp_vl v) (canonical_sum_simplify c)).
1005
Theorem setspolynomial_simplify_ok :
1006
forall p:setspolynomial,
1007
Aequiv (interp_setcs (setspolynomial_simplify p)) (interp_setsp p).
1010
unfold setspolynomial_simplify in |- *.
1011
rewrite (canonical_sum_simplify_ok (setspolynomial_normalize p)).
1012
exact (setspolynomial_normalize_ok p).
1015
End semi_setoid_rings.
1017
Implicit Arguments Cons_varlist.
1018
Implicit Arguments Cons_monom.
1019
Implicit Arguments SetSPconst.
1020
Implicit Arguments SetSPplus.
1021
Implicit Arguments SetSPmult.
1025
Section setoid_rings.
1027
Set Implicit Arguments.
1029
Variable vm : varmap A.
1030
Variable T : Setoid_Ring_Theory Aequiv Aplus Amult Aone Azero Aopp Aeq.
1032
Hint Resolve (STh_plus_comm T).
1033
Hint Resolve (STh_plus_assoc T).
1034
Hint Resolve (STh_plus_assoc2 S T).
1035
Hint Resolve (STh_mult_comm T).
1036
Hint Resolve (STh_mult_assoc T).
1037
Hint Resolve (STh_mult_assoc2 S T).
1038
Hint Resolve (STh_plus_zero_left T).
1039
Hint Resolve (STh_plus_zero_left2 S T).
1040
Hint Resolve (STh_mult_one_left T).
1041
Hint Resolve (STh_mult_one_left2 S T).
1042
Hint Resolve (STh_mult_zero_left S plus_morph mult_morph T).
1043
Hint Resolve (STh_mult_zero_left2 S plus_morph mult_morph T).
1044
Hint Resolve (STh_distr_left T).
1045
Hint Resolve (STh_distr_left2 S T).
1046
Hint Resolve (STh_plus_reg_left S plus_morph T).
1047
Hint Resolve (STh_plus_permute S plus_morph T).
1048
Hint Resolve (STh_mult_permute S mult_morph T).
1049
Hint Resolve (STh_distr_right S plus_morph T).
1050
Hint Resolve (STh_distr_right2 S plus_morph T).
1051
Hint Resolve (STh_mult_zero_right S plus_morph mult_morph T).
1052
Hint Resolve (STh_mult_zero_right2 S plus_morph mult_morph T).
1053
Hint Resolve (STh_plus_zero_right S T).
1054
Hint Resolve (STh_plus_zero_right2 S T).
1055
Hint Resolve (STh_mult_one_right S T).
1056
Hint Resolve (STh_mult_one_right2 S T).
1057
Hint Resolve (STh_plus_reg_right S plus_morph T).
1058
Hint Resolve refl_equal sym_equal trans_equal.
1059
(*Hints Resolve refl_eqT sym_eqT trans_eqT.*)
1065
Inductive setpolynomial : Type :=
1066
| SetPvar : index -> setpolynomial
1067
| SetPconst : A -> setpolynomial
1068
| SetPplus : setpolynomial -> setpolynomial -> setpolynomial
1069
| SetPmult : setpolynomial -> setpolynomial -> setpolynomial
1070
| SetPopp : setpolynomial -> setpolynomial.
1072
Fixpoint setpolynomial_normalize (x:setpolynomial) : canonical_sum :=
1075
canonical_sum_merge (setpolynomial_normalize l)
1076
(setpolynomial_normalize r)
1078
canonical_sum_prod (setpolynomial_normalize l)
1079
(setpolynomial_normalize r)
1080
| SetPconst c => Cons_monom c Nil_var Nil_monom
1081
| SetPvar i => Cons_varlist (Cons_var i Nil_var) Nil_monom
1083
canonical_sum_scalar3 (Aopp Aone) Nil_var (setpolynomial_normalize p)
1086
Definition setpolynomial_simplify (x:setpolynomial) :=
1087
canonical_sum_simplify (setpolynomial_normalize x).
1089
Fixpoint setspolynomial_of (x:setpolynomial) : setspolynomial :=
1091
| SetPplus l r => SetSPplus (setspolynomial_of l) (setspolynomial_of r)
1092
| SetPmult l r => SetSPmult (setspolynomial_of l) (setspolynomial_of r)
1093
| SetPconst c => SetSPconst c
1094
| SetPvar i => SetSPvar i
1095
| SetPopp p => SetSPmult (SetSPconst (Aopp Aone)) (setspolynomial_of p)
1098
(*** Interpretation *)
1100
Fixpoint interp_setp (p:setpolynomial) : A :=
1103
| SetPvar i => varmap_find Azero i vm
1104
| SetPplus p1 p2 => Aplus (interp_setp p1) (interp_setp p2)
1105
| SetPmult p1 p2 => Amult (interp_setp p1) (interp_setp p2)
1106
| SetPopp p1 => Aopp (interp_setp p1)
1111
Unset Implicit Arguments.
1113
Lemma setspolynomial_of_ok :
1114
forall p:setpolynomial,
1115
Aequiv (interp_setp p) (interp_setsp vm (setspolynomial_of p)).
1116
simple induction p; trivial; simpl in |- *; intros.
1117
rewrite H; rewrite H0; trivial.
1118
rewrite H; rewrite H0; trivial.
1121
(STh_opp_mult_left2 S plus_morph mult_morph T Aone
1122
(interp_setsp vm (setspolynomial_of s))).
1123
rewrite (STh_mult_one_left T (interp_setsp vm (setspolynomial_of s))).
1127
Theorem setpolynomial_normalize_ok :
1128
forall p:setpolynomial,
1129
setpolynomial_normalize p = setspolynomial_normalize (setspolynomial_of p).
1130
simple induction p; trivial; simpl in |- *; intros.
1131
rewrite H; rewrite H0; reflexivity.
1132
rewrite H; rewrite H0; reflexivity.
1133
rewrite H; simpl in |- *.
1135
(canonical_sum_scalar3 (Aopp Aone) Nil_var
1136
(setspolynomial_normalize (setspolynomial_of s)));
1138
| simpl in |- *; intros; rewrite H0; reflexivity
1139
| simpl in |- *; intros; rewrite H0; reflexivity ].
1142
Theorem setpolynomial_simplify_ok :
1143
forall p:setpolynomial,
1144
Aequiv (interp_setcs vm (setpolynomial_simplify p)) (interp_setp p).
1146
unfold setpolynomial_simplify in |- *.
1147
rewrite (setspolynomial_of_ok p).
1148
rewrite setpolynomial_normalize_ok.
1150
(canonical_sum_simplify_ok vm
1151
(Semi_Setoid_Ring_Theory_of A Aequiv S Aplus Amult Aone Azero Aopp Aeq
1152
plus_morph mult_morph T)
1153
(setspolynomial_normalize (setspolynomial_of p)))
1156
(setspolynomial_normalize_ok vm
1157
(Semi_Setoid_Ring_Theory_of A Aequiv S Aplus Amult Aone Azero Aopp Aeq
1158
plus_morph mult_morph T) (setspolynomial_of p))