Skip to content

Commit 6bedd18

Browse files
committed
WIP
1 parent 4a25ad9 commit 6bedd18

File tree

1 file changed

+60
-85
lines changed

1 file changed

+60
-85
lines changed

src/monalg.v

Lines changed: 60 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,10 @@ Qed.
437437
Lemma fgscaleA c1 c2 g : c1 *:g (c2 *:g g) = (c1 * c2) *:g g.
438438
Proof. 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.
441444
Proof. by apply/malgP=> k; rewrite !fgscaleE mul1r. Qed.
442445

443446
Lemma 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.
446449
Lemma fgscaleDl g c1 c2: (c1 + c2) *:g g = c1 *:g g + c2 *:g g.
447450
Proof. 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

462455
Lemma malgZ_def c g : c *: g = fgscale c g.
463456
Proof. by []. Qed.
464457

465458
Lemma mcoeffZ c g k : (c *: g)@_k = c * g@_k.
466459
Proof. 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

473465
Lemma msuppZ_le c g : msupp (c *: g) `<=` msupp g.
474466
Proof.
475467
apply/fsubsetP=> k; rewrite -!mcoeff_neq0 mcoeffZ.
476468
by apply/contraTneq=> ->; rewrite mulr0 negbK.
477469
Qed.
478470

479-
End MalgRingTheory.
471+
End MalgSemiRingTheory.
480472

481473
(* -------------------------------------------------------------------- *)
482474
Section MalgLmodTheoryIntegralDomain.
@@ -539,7 +531,7 @@ Qed.
539531
End MalgMonomTheory.
540532

541533
(* -------------------------------------------------------------------- *)
542-
Section MalgSemiRingType.
534+
Section MalgSemiRingTheory.
543535

544536
Context (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.
569561
Proof.
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.
575566
Qed.
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.
579570
Proof. by move=> le_d1 le_d2; rewrite (fgmullw le_d1 le_d2) exchange_big. Qed.
580571

581572
Definition 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.
593584
Lemma fgmulUg c k g :
594585
fgmul << c *g k >> g = \sum_(k' <- msupp g) << c * g@_k' *g k * k' >>.
595586
Proof.
596-
rewrite (fgmullw msuppU_le (fsubset_refl _)) big_seq_fset1.
587+
rewrite (fgmullwl msuppU_le) big_seq_fset1.
597588
by apply/eq_bigr => k' _; rewrite mcoeffUU.
598589
Qed.
599590

600591
Lemma fgmulgU c k g :
601592
fgmul g << c *g k >> = \sum_(k' <- msupp g) << g@_k' * c *g k' * k >>.
602593
Proof.
603-
rewrite (fgmulrw (fsubset_refl _) msuppU_le) big_seq_fset1.
594+
rewrite (fgmulrwl msuppU_le) big_seq_fset1.
604595
by apply/eq_bigr=> k' _; rewrite mcoeffUU.
605596
Qed.
606597

@@ -646,9 +637,16 @@ rewrite -big_split /=; apply/eq_bigr => k2 _.
646637
by rewrite mcoeffD mulrDr monalgUD.
647638
Qed.
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+
649645
Lemma fgmulA : associative fgmul.
650646
Proof.
651647
move=> g1 g2 g3.
648+
(* FIXME: big_morph below should be replaced with raddf_sum once we fix the *)
649+
(* instance above *)
652650
rewrite [RHS](big_morph (fgmul^~ _) (fun _ _ => fgmulgDl _ _ _) (fgmul0g _)).
653651
rewrite fgmulEl1; apply/eq_bigr=> k1 _.
654652
rewrite [LHS](big_morph (fgmul _) (fun _ _ => fgmulgDr _ _ _) (fgmulg0 _)).
@@ -664,17 +662,20 @@ Proof. by apply/eqP/malgP=> /(_ 1%M) /eqP; rewrite !mcoeffsE oner_eq0. Qed.
664662
HB.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

679680
Lemma mcoeffU1 k k' : (<< k >> : {malg R[K]})@_k' = (k == k')%:R.
680681
Proof. by rewrite mcoeffU. Qed.
@@ -768,7 +769,7 @@ Lemma mpolyC1E : 1%:MP = 1 :> {malg R[K]}.
768769
Proof. exact: rmorph1. Qed.
769770

770771
Lemma 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

773774
Lemma mpolyCM : {morph @malgC K R : p q / p * q}.
774775
Proof. exact: rmorphM. Qed.
@@ -788,44 +789,19 @@ by rewrite mcoeffU mul1m (negbTE ne1_k).
788789
Qed.
789790

790791
HB.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

794795
End 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

830806
Lemma fgmulC : @commutative {malg R[K]} _ *%R.
831807
Proof.
@@ -834,12 +810,20 @@ apply/eq_bigr=> /= k1 _; apply/eq_bigr=> /= k2 _.
834810
by rewrite mulrC [X in X==k]mulmC.
835811
Qed.
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
(* -------------------------------------------------------------------- *)
845829
Section MalgMorphism.
@@ -904,10 +888,9 @@ Lemma mmapMNn n : {morph mmap f h: x / x *- n} . Proof. exact: raddfMNn. Qed.
904888

905889
End Additive.
906890

907-
(* TODO: generalize following sections to semirings *)
908891
Section CommrMultiplicative.
909892

910-
Context {K : monomType} {R : ringType} {S : ringType}.
893+
Context {K : monomType} {R S : semiRingType}.
911894
Context (f : {rmorphism R -> S}) (h : {mmorphism K -> S}).
912895

913896
Implicit Types (c : R) (g : {malg R[K]}).
@@ -939,7 +922,7 @@ End CommrMultiplicative.
939922
(* -------------------------------------------------------------------- *)
940923
Section Multiplicative.
941924

942-
Context {K : monomType} {R : ringType} {S : comRingType}.
925+
Context {K : monomType} {R : semiRingType} {S : comSemiRingType}.
943926
Context (f : {rmorphism R -> S}) (h : {mmorphism K -> S}).
944927

945928
Lemma mmap_is_multiplicative : multiplicative (mmap f h).
@@ -954,7 +937,7 @@ End Multiplicative.
954937
(* -------------------------------------------------------------------- *)
955938
Section Linear.
956939

957-
Context {K : monomType} {R : comRingType} (h : {mmorphism K -> R}).
940+
Context {K : monomType} {R : comSemiRingType} (h : {mmorphism K -> R}).
958941

959942
Lemma mmap_is_linear : scalable_for *%R (mmap idfun h).
960943
Proof. by move=> /= c g; rewrite -mul_malgC rmorphM /= mmapC. Qed.
@@ -964,7 +947,6 @@ HB.instance Definition _ :=
964947
mmap_is_linear.
965948

966949
End Linear.
967-
(* /TODO *)
968950
End MalgMorphism.
969951

970952
(* -------------------------------------------------------------------- *)
@@ -1053,10 +1035,9 @@ HB.instance Definition _ := GRing.isOppClosed.Build _ (monalgOver_pred zmodS)
10531035
End MonalgOverOpp.
10541036

10551037
(* -------------------------------------------------------------------- *)
1056-
(* TODO: generalize to R : semiRingType *)
10571038
Section MonalgOverSemiring.
10581039

1059-
Context (K : monomType) (R : ringType) (S : semiringClosed R).
1040+
Context (K : monomType) (R : semiRingType) (S : semiringClosed R).
10601041

10611042
Local Notation monalgOver := (@monalgOver K R).
10621043

@@ -1094,12 +1075,6 @@ by move=> /= k; rewrite rpredM.
10941075
Qed.
10951076

10961077
End 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

11041079
End MonalgOver.
11051080
Arguments monalgOver_pred _ _ _ _ /.

0 commit comments

Comments
 (0)