@@ -437,7 +437,10 @@ Qed.
437437Lemma fgscaleA c1 c2 g : c1 *:g (c2 *:g g) = (c1 * c2) *:g g.
438438Proof . by apply/malgP=> x; rewrite !fgscaleE mulrA. Qed .
439439
440- Lemma fgscale1r D: 1 *:g D = D.
440+ Lemma fgscale0r g : 0 *:g g = 0.
441+ Proof . by apply/malgP=> k; rewrite fgscaleE mul0r mcoeff0. Qed .
442+
443+ Lemma fgscale1r g : 1 *:g g = g.
441444Proof . by apply/malgP=> k; rewrite !fgscaleE mul1r. Qed .
442445
443446Lemma fgscaleDr c g1 g2 : c *:g (g1 + g2) = c *:g g1 + c *:g g2.
@@ -446,37 +449,26 @@ Proof. by apply/malgP=> k; rewrite !(mcoeffD, fgscaleE) mulrDr. Qed.
446449Lemma fgscaleDl g c1 c2: (c1 + c2) *:g g = c1 *:g g + c2 *:g g.
447450Proof . by apply/malgP=> x; rewrite !(mcoeffD, fgscaleE) mulrDl. Qed .
448451
449- End MalgSemiRingTheory.
450-
451- (* -------------------------------------------------------------------- *)
452- Section MalgRingTheory.
453-
454- Context {K : choiceType} {R : ringType}.
455-
456- Implicit Types (g : {malg R[K]}).
457-
458- (* TODO: Add a semi-module structure and generalize this section *)
459- HB.instance Definition _ := GRing.Zmodule_isLmodule.Build R {malg R[K]}
460- fgscaleA fgscale1r fgscaleDr fgscaleDl.
452+ HB.instance Definition _ := GRing.Nmodule_isLSemiModule.Build R {malg R [K]}
453+ fgscaleA fgscale0r fgscale1r fgscaleDr fgscaleDl.
461454
462455Lemma malgZ_def c g : c *: g = fgscale c g.
463456Proof . by []. Qed .
464457
465458Lemma mcoeffZ c g k : (c *: g)@_k = c * g@_k.
466459Proof . exact/fgscaleE. Qed .
467460
468- (* FIXME: make the production of a LRMorphism fail below *)
469- (* HB.instance Definition _ m := *)
470- (* GRing.isLinear.Build R [lmodType R of {malg R[K]}] R *%R (mcoeff m) *)
471- (* (fun c g => mcoeffZ c g m). *)
461+ HB.instance Definition _ k :=
462+ GRing.isSemilinear.Build R {malg R[K]} R *%R (mcoeff k)
463+ (fun c g => mcoeffZ c g k, mcoeffD k).
472464
473465Lemma msuppZ_le c g : msupp (c *: g) `<=` msupp g.
474466Proof .
475467apply/fsubsetP=> k; rewrite -!mcoeff_neq0 mcoeffZ.
476468by apply/contraTneq=> ->; rewrite mulr0 negbK.
477469Qed .
478470
479- End MalgRingTheory .
471+ End MalgSemiRingTheory .
480472
481473(* -------------------------------------------------------------------- *)
482474Section MalgLmodTheoryIntegralDomain.
539531End MalgMonomTheory.
540532
541533(* -------------------------------------------------------------------- *)
542- Section MalgSemiRingType .
534+ Section MalgSemiRingTheory .
543535
544536Context (K : monomType) (R : semiRingType).
545537
@@ -567,15 +559,14 @@ Lemma fgmullw (d1 d2 : {fset K}) g1 g2 :
567559 msupp g1 `<=` d1 -> msupp g2 `<=` d2 ->
568560 fgmul g1 g2 = \sum_(k1 <- d1) \sum_(k2 <- d2) g1 *M_[k1, k2] g2.
569561Proof .
570- move=> le_d1 le_d2; rewrite fgmull (big_fset_incl _ le_d1) /=.
571- apply/eq_bigr=> k1 _; apply/big_fset_incl => // k _ /mcoeff_outdom ->.
572- by rewrite mulr0 monalgU0.
573- move=> k _ /mcoeff_outdom g1k.
574- by rewrite big1 => // k' _; rewrite g1k mul0r monalgU0.
562+ move=> le_d1 le_d2; rewrite -(big_fset_incl _ le_d1)/=; last first.
563+ by move=> k _ /mcoeff_outdom g1k; apply/big1 => ?; rewrite g1k mul0r monalgU0.
564+ apply/eq_bigr=> k1 _; apply/big_fset_incl => // k _ /mcoeff_outdom ->.
565+ by rewrite mulr0 monalgU0.
575566Qed .
576567
577- Lemma fgmulrw (d1 d2 : {fset K}) g1 g2 : msupp g1 `<=` d1 -> msupp g2 `<=` d2
578- -> fgmul g1 g2 = \sum_(k2 <- d2) \sum_(k1 <- d1) g1 *M_[k1, k2] g2.
568+ Lemma fgmulrw (d1 d2 : {fset K}) g1 g2 : msupp g1 `<=` d1 -> msupp g2 `<=` d2 ->
569+ fgmul g1 g2 = \sum_(k2 <- d2) \sum_(k1 <- d1) g1 *M_[k1, k2] g2.
579570Proof . by move=> le_d1 le_d2; rewrite (fgmullw le_d1 le_d2) exchange_big. Qed .
580571
581572Definition fgmullwl (d1 : {fset K}) {g1 g2} (le : msupp g1 `<=` d1) :=
@@ -593,14 +584,14 @@ Proof. by move=> g; rewrite fgmulr msupp0 big_seq_fset0. Qed.
593584Lemma fgmulUg c k g :
594585 fgmul << c *g k >> g = \sum_(k' <- msupp g) << c * g@_k' *g k * k' >>.
595586Proof .
596- rewrite (fgmullw msuppU_le (fsubset_refl _) ) big_seq_fset1.
587+ rewrite (fgmullwl msuppU_le) big_seq_fset1.
597588by apply/eq_bigr => k' _; rewrite mcoeffUU.
598589Qed .
599590
600591Lemma fgmulgU c k g :
601592 fgmul g << c *g k >> = \sum_(k' <- msupp g) << g@_k' * c *g k' * k >>.
602593Proof .
603- rewrite (fgmulrw (fsubset_refl _) msuppU_le) big_seq_fset1.
594+ rewrite (fgmulrwl msuppU_le) big_seq_fset1.
604595by apply/eq_bigr=> k' _; rewrite mcoeffUU.
605596Qed .
606597
@@ -646,9 +637,16 @@ rewrite -big_split /=; apply/eq_bigr => k2 _.
646637by rewrite mcoeffD mulrDr monalgUD.
647638Qed .
648639
640+ (* FIXME: the instance below is not declared as canonical, seemingly because *)
641+ (* of the #[local] attribute? *)
642+ #[local] HB.instance Definition _ g :=
643+ GRing.isSemiAdditive.Build _ _ (fgmul g) (fgmulg0 g, fgmulgDr g).
644+
649645Lemma fgmulA : associative fgmul.
650646Proof .
651647move=> g1 g2 g3.
648+ (* FIXME: big_morph below should be replaced with raddf_sum once we fix the *)
649+ (* instance above *)
652650rewrite [RHS](big_morph (fgmul^~ _) (fun _ _ => fgmulgDl _ _ _) (fgmul0g _)).
653651rewrite fgmulEl1; apply/eq_bigr=> k1 _.
654652rewrite [LHS](big_morph (fgmul _) (fun _ _ => fgmulgDr _ _ _) (fgmulg0 _)).
@@ -664,17 +662,20 @@ Proof. by apply/eqP/malgP=> /(_ 1%M) /eqP; rewrite !mcoeffsE oner_eq0. Qed.
664662HB.instance Definition _ := GRing.Nmodule_isSemiRing.Build {malg R[K]}
665663 fgmulA fgmul1g fgmulg1 fgmulgDl fgmulgDr fgmul0g fgmulg0 fgoner_eq0.
666664
667- End MalgSemiRingType.
668-
669- (* -------------------------------------------------------------------- *)
670- Section MalgSemiRingTheory.
665+ Lemma malgM_def g1 g2 : g1 * g2 = fgmul g1 g2.
666+ Proof . by []. Qed .
671667
672- Context {K : monomType} {R : semiRingType}.
668+ Lemma mul_malgC c g : c%:MP * g = c *: g.
669+ Proof .
670+ rewrite malgM_def malgZ_def fgmulUg.
671+ by apply/eq_bigr=> /= k _; rewrite mul1m.
672+ Qed .
673673
674- Implicit Types (g : {malg R[K]}) (k l : K).
674+ Lemma fgscaleAl c g1 g2 : c *: (g1 * g2) = (c *: g1) * g2.
675+ Proof . by rewrite -!mul_malgC mulrA. Qed .
675676
676- Lemma malgM_def g1 g2 : g1 * g2 = fgmul g1 g2.
677- Proof . by []. Qed .
677+ HB.instance Definition _ :=
678+ GRing.LSemiModule_isLSemiAlgebra.Build R {malg R[K]} fgscaleAl .
678679
679680Lemma mcoeffU1 k k' : (<< k >> : {malg R[K]})@_k' = (k == k')%:R.
680681Proof . by rewrite mcoeffU. Qed .
@@ -768,7 +769,7 @@ Lemma mpolyC1E : 1%:MP = 1 :> {malg R[K]}.
768769Proof . exact: rmorph1. Qed .
769770
770771Lemma mpolyC_nat (n : nat) : (n%:R)%:MP = n%:R :> {malg R[K]}.
771- Proof . by apply/malgP=> i; rewrite mcoeffC mcoeffMn mcoeffC mulrnAC . Qed .
772+ Proof . exact: rmorph_nat . Qed .
772773
773774Lemma mpolyCM : {morph @malgC K R : p q / p * q}.
774775Proof . exact: rmorphM. Qed .
@@ -788,44 +789,19 @@ by rewrite mcoeffU mul1m (negbTE ne1_k).
788789Qed .
789790
790791HB.instance Definition _ :=
791- GRing.isMultiplicative.Build {malg R[K]} R (@ mcoeff K R 1%M)
792+ GRing.isMultiplicative.Build {malg R[K]} R (mcoeff 1%M)
792793 mcoeff1g_is_multiplicative.
793794
794795End MalgSemiRingTheory.
795796
796- (* -------------------------------------------------------------------- *)
797- Section MalgRingTheory.
798-
799- Context {K : monomType} {R : ringType}.
800-
801- Implicit Types (g : {malg R[K]}) (k l : K).
802-
803- HB.instance Definition _ := GRing.SemiRing.on {malg R[K]}.
804-
805- Lemma mul_malgC c g : c%:MP * g = c *: g.
806- Proof .
807- rewrite malgM_def malgZ_def fgmulUg.
808- by apply/eq_bigr=> /= k _; rewrite mul1m.
809- Qed .
810-
811- (* FIXME: building Linear instance here so as to not trigger the creation
812- of a LRMorphism that fails on above command (but is built just below anyway) *)
813- HB.instance Definition _ m :=
814- GRing.isScalable.Build R {malg R[K]} R *%R (mcoeff m)
815- (fun c => (mcoeffZ c)^~ m).
816-
817- Lemma fgscaleAl c g1 g2 : c *: (g1 * g2) = (c *: g1) * g2.
818- Proof . by rewrite -!mul_malgC mulrA. Qed .
819-
820- HB.instance Definition _ := GRing.Lmodule_isLalgebra.Build R {malg R[K]}
821- fgscaleAl.
822-
823- End MalgRingTheory.
797+ (* FIXME: HB.saturate *)
798+ HB.instance Definition _ (K : monomType) (R : ringType) :=
799+ GRing.SemiRing.on {malg R[K]}.
824800
825801(* -------------------------------------------------------------------- *)
826- Section MalgComRingType .
802+ Section MalgComSemiRingType .
827803
828- Context {K : conomType} {R : comRingType }.
804+ Context {K : conomType} {R : comSemiRingType }.
829805
830806Lemma fgmulC : @commutative {malg R[K]} _ *%R.
831807Proof .
@@ -834,12 +810,20 @@ apply/eq_bigr=> /= k1 _; apply/eq_bigr=> /= k2 _.
834810by rewrite mulrC [X in X==k]mulmC.
835811Qed .
836812
837- HB.instance Definition _ := GRing.Ring_hasCommutativeMul.Build (malg K R)
838- fgmulC.
813+ HB.instance Definition _ :=
814+ GRing.SemiRing_hasCommutativeMul.Build {malg R[K]} fgmulC.
815+
816+ HB.instance Definition _ :=
817+ GRing.LSemiAlgebra_isComSemiAlgebra.Build R {malg R[K]}.
839818
840- HB.instance Definition _ := GRing.Lalgebra_isComAlgebra.Build R {malg R[K]} .
819+ End MalgComSemiRingType .
841820
842- End MalgComRingType.
821+ (* FIXME: HB.saturate *)
822+ HB.instance Definition _ (K : monomType) (R : ringType) :=
823+ GRing.Lmodule.on {malg R[K]}.
824+ HB.instance Definition _ (K : conomType) (R : comRingType) :=
825+ GRing.Lmodule.on {malg R[K]}.
826+ (* /FIXME *)
843827
844828(* -------------------------------------------------------------------- *)
845829Section MalgMorphism.
@@ -904,10 +888,9 @@ Lemma mmapMNn n : {morph mmap f h: x / x *- n} . Proof. exact: raddfMNn. Qed.
904888
905889End Additive.
906890
907- (* TODO: generalize following sections to semirings *)
908891Section CommrMultiplicative.
909892
910- Context {K : monomType} {R : ringType} { S : ringType }.
893+ Context {K : monomType} {R S : semiRingType }.
911894Context (f : {rmorphism R -> S}) (h : {mmorphism K -> S}).
912895
913896Implicit Types (c : R) (g : {malg R[K]}).
@@ -939,7 +922,7 @@ End CommrMultiplicative.
939922(* -------------------------------------------------------------------- *)
940923Section Multiplicative.
941924
942- Context {K : monomType} {R : ringType } {S : comRingType }.
925+ Context {K : monomType} {R : semiRingType } {S : comSemiRingType }.
943926Context (f : {rmorphism R -> S}) (h : {mmorphism K -> S}).
944927
945928Lemma mmap_is_multiplicative : multiplicative (mmap f h).
@@ -954,7 +937,7 @@ End Multiplicative.
954937(* -------------------------------------------------------------------- *)
955938Section Linear.
956939
957- Context {K : monomType} {R : comRingType } (h : {mmorphism K -> R}).
940+ Context {K : monomType} {R : comSemiRingType } (h : {mmorphism K -> R}).
958941
959942Lemma mmap_is_linear : scalable_for *%R (mmap idfun h).
960943Proof . by move=> /= c g; rewrite -mul_malgC rmorphM /= mmapC. Qed .
@@ -964,7 +947,6 @@ HB.instance Definition _ :=
964947 mmap_is_linear.
965948
966949End Linear.
967- (* /TODO *)
968950End MalgMorphism.
969951
970952(* -------------------------------------------------------------------- *)
@@ -1053,10 +1035,9 @@ HB.instance Definition _ := GRing.isOppClosed.Build _ (monalgOver_pred zmodS)
10531035End MonalgOverOpp.
10541036
10551037(* -------------------------------------------------------------------- *)
1056- (* TODO: generalize to R : semiRingType *)
10571038Section MonalgOverSemiring.
10581039
1059- Context (K : monomType) (R : ringType ) (S : semiringClosed R).
1040+ Context (K : monomType) (R : semiRingType ) (S : semiringClosed R).
10601041
10611042Local Notation monalgOver := (@monalgOver K R).
10621043
@@ -1094,12 +1075,6 @@ by move=> /= k; rewrite rpredM.
10941075Qed .
10951076
10961077End MonalgOverSemiring.
1097- (* /TODO *)
1098-
1099- HB.instance Definition _
1100- (K : monomType) (R : ringType) (ringS : subringClosed R) :=
1101- GRing.isMulClosed.Build _ (monalgOver_pred ringS)
1102- (monalgOver_mulr_closed K ringS).
11031078
11041079End MonalgOver.
11051080Arguments monalgOver_pred _ _ _ _ /.
0 commit comments