Skip to content

Commit b31bd54

Browse files
committed
[WIP] replace the infrastructure of mpoly with monalg
1 parent d36d264 commit b31bd54

2 files changed

Lines changed: 88 additions & 158 deletions

File tree

src/monalg.v

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ Reserved Notation "<< k >>" (format "<< k >>").
4444
Reserved Notation "g @_ k"
4545
(at level 3, k at level 2, left associativity, format "g @_ k").
4646
Reserved Notation "c %:MP" (format "c %:MP").
47-
Reserved Notation "''X_{1..' n '}'".
47+
Reserved Notation "''X_{1..' n '}'" (n at level 2).
4848
Reserved Notation "'U_(' n )" (format "'U_(' n )").
4949
Reserved Notation "x ^[ f , g ]" (at level 1, format "x ^[ f , g ]").
5050

@@ -72,9 +72,9 @@ Bind Scope type_scope with monomType.
7272
Notation mone := one.
7373
Notation mmul := mul.
7474

75-
Local Notation "1" := (@mone _) : monom_scope.
76-
Local Notation "*%M" := (@mmul _) : function_scope.
77-
Local Notation "x * y" := (mmul x y) : monom_scope.
75+
Notation "1" := (@mone _) : monom_scope.
76+
Notation "*%M" := (@mmul _) : function_scope.
77+
Notation "x * y" := (mmul x y) : monom_scope.
7878

7979
(* -------------------------------------------------------------------- *)
8080
HB.mixin Record MonomialDef_isConomialDef V of MonomialDef V := {

src/mpoly.v

Lines changed: 84 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ From mathcomp Require Import order fingroup perm ssralg zmodp poly ssrint.
8484
From mathcomp Require Import matrix vector.
8585
From mathcomp Require Import bigenough.
8686

87-
Require Import ssrcomplements freeg.
87+
Require Import xfinmap monalg.
8888

8989
Set Implicit Arguments.
9090
Unset Strict Implicit.
@@ -94,12 +94,6 @@ Import Order.Theory GRing.Theory BigEnough.
9494

9595
Local Open Scope ring_scope.
9696

97-
Declare Scope mpoly_scope.
98-
Declare Scope multi_scope.
99-
100-
Delimit Scope mpoly_scope with MP.
101-
Delimit Scope multi_scope with MM.
102-
10397
Local Notation simpm := Monoid.simpm.
10498

10599
Local Infix "@@" := (allpairs pair) (at level 60, right associativity).
@@ -111,14 +105,12 @@ Import Order.DefaultSeqLexiOrder.
111105
Import Order.DefaultTupleLexiOrder.
112106

113107
(* -------------------------------------------------------------------- *)
114-
Reserved Notation "''X_{1..' n '}'" (n at level 2).
115108
Reserved Notation "''X_{1..' n < b '}'" (n, b at level 2).
116109
Reserved Notation "''X_{1..' n < b1 , b2 '}'" (b1, b2 at level 2).
117110
Reserved Notation "[ 'multinom' s ]" (format "[ 'multinom' s ]").
118111
Reserved Notation "[ 'multinom' 'of' s ]" (format "[ 'multinom' 'of' s ]").
119112
Reserved Notation "[ 'multinom' F | i < n ]"
120-
(i at level 0,
121-
format "[ '[hv' 'multinom' F '/' | i < n ] ']'").
113+
(i at level 0, format "[ '[hv' 'multinom' F '/' | i < n ] ']'").
122114
Reserved Notation "'U_(' n )" (format "'U_(' n )").
123115
Reserved Notation "{ 'mpoly' T [ n ] }"
124116
(T at level 2, format "{ 'mpoly' T [ n ] }").
@@ -127,8 +119,7 @@ Reserved Notation "{ 'ipoly' T [ n ] }"
127119
(T at level 2, format "{ 'ipoly' T [ n ] }").
128120
Reserved Notation "{ 'ipoly' T [ n ] }^p"
129121
(T at level 2, format "{ 'ipoly' T [ n ] }^p").
130-
Reserved Notation "''X_' i"
131-
(at level 8, i at level 2, format "''X_' i").
122+
Reserved Notation "''X_' i" (at level 8, i at level 2, format "''X_' i").
132123
Reserved Notation "''X_[' i ]" (format "''X_[' i ]").
133124
Reserved Notation "''X_[' R , i ]" (format "''X_[' R , i ]").
134125
Reserved Notation "c %:MP" (format "c %:MP").
@@ -141,218 +132,157 @@ Reserved Notation "e .@[< x >]" (format "e .@[< x >]").
141132
Reserved Notation "p \mPo q" (at level 50).
142133
Reserved Notation "x ^[ f ]" (format "x ^[ f ]").
143134
Reserved Notation "x ^[ f , g ]" (format "x ^[ f , g ]").
144-
Reserved Notation "p ^`M ( m )"
145-
(at level 8, format "p ^`M ( m )").
146-
Reserved Notation "p ^`M ( m , n )"
147-
(at level 8, format "p ^`M ( m , n )").
148-
Reserved Notation "p ^`M [ m ]"
149-
(at level 8, format "p ^`M [ m ]").
150-
Reserved Notation "''s_' k"
151-
(at level 8, k at level 2, format "''s_' k").
135+
Reserved Notation "p ^`M ( m )" (at level 8, format "p ^`M ( m )").
136+
Reserved Notation "p ^`M ( m , n )" (at level 8, format "p ^`M ( m , n )").
137+
Reserved Notation "p ^`M [ m ]" (at level 8, format "p ^`M [ m ]").
138+
Reserved Notation "''s_' k" (at level 8, k at level 2, format "''s_' k").
152139
Reserved Notation "''s_(' n , k )" (format "''s_(' n , k )").
153140
Reserved Notation "''s_(' K , n , k )" (format "''s_(' K , n , k )").
154141
Reserved Notation "+%MM".
155142
Reserved Notation "-%MM".
156143

157144
(* -------------------------------------------------------------------- *)
158-
Section MultinomDef.
159-
Context (n : nat).
160-
161-
Record multinom : predArgType := Multinom { multinom_val :> n.-tuple nat }.
162-
163-
HB.instance Definition _ := [isNew for multinom_val].
164-
165-
Definition fun_of_multinom M := tnth (multinom_val M).
166-
167-
Coercion fun_of_multinom : multinom >-> Funclass.
168-
169-
Lemma multinomE M : Multinom M =1 tnth M.
170-
Proof. by []. Qed.
171-
172-
End MultinomDef.
173145

174-
Notation "[ 'multinom' s ]" := (@Multinom _ s) : form_scope.
175-
Notation "[ 'multinom' 'of' s ]" := [multinom [tuple of s]] : form_scope.
176146
Notation "[ 'multinom' E | i < n ]" :=
177-
[multinom [tuple E%N | i < n]] : form_scope.
147+
[cmonom E | i in [fset x in 'I_n]]%M : monom_scope.
178148
Notation "[ 'multinom' E | i < n ]" :=
179-
[multinom [tuple E%N : nat | i < n]] (only parsing) : form_scope.
149+
[cmonom E : nat | i in [fset x in 'I_n]]%M (only parsing) : monom_scope.
180150

181151
(* -------------------------------------------------------------------- *)
182-
Notation "''X_{1..' n '}'" := (multinom n) : type_scope.
183-
184-
HB.instance Definition _ n := [Countable of 'X_{1..n} by <:].
185-
186-
Bind Scope multi_scope with multinom.
187-
188-
(* -------------------------------------------------------------------- *)
189-
Definition lem n (m1 m2 : 'X_{1..n}) :=
190-
[forall i, m1%MM i <= m2%MM i].
191-
192-
Definition ltm n (m1 m2 : 'X_{1..n}) :=
193-
(m1 != m2) && (lem m1 m2).
194-
195-
(* -------------------------------------------------------------------- *)
196-
Section MultinomTheory.
197-
Context {n : nat}.
198-
Implicit Types (m : 'X_{1..n}).
152+
#[deprecated(use=mone)]
153+
Notation mnm0 := (@mone 'X_{1.._}).
154+
#[deprecated(use=ucm)]
155+
Notation mnm1 := (@ucm 'I__).
156+
#[deprecated(use=mmul)]
157+
Notation mnm_add := (@mmul 'X_{1.._}).
158+
#[deprecated(use=divcm)]
159+
Notation mnm_sub := (@divcm 'I__).
160+
#[deprecated(use=expmn)]
161+
Notation mnm_muln := (@expmn 'X_{1.._}).
199162

200-
Lemma mnm_tnth m j : m j = tnth m j.
201-
Proof. by []. Qed.
202-
203-
Lemma mnm_nth x0 m j : m j = nth x0 m j.
204-
Proof. by rewrite mnm_tnth (tnth_nth x0). Qed.
205-
206-
Lemma mnmE E j : [multinom E i | i < n] j = E j.
207-
Proof. by rewrite multinomE tnth_mktuple. Qed.
208-
209-
Lemma mnm_valK t : [multinom t] = t :> n.-tuple nat.
210-
Proof. by []. Qed.
211-
212-
Lemma mnmP m1 m2 : (m1 = m2) <-> (m1 =1 m2).
213-
Proof.
214-
case: m1 m2 => [m1] [m2] /=; split => [->//|h].
215-
by apply/val_inj/eq_from_tnth => i; rewrite -!multinomE.
216-
Qed.
217-
218-
End MultinomTheory.
219-
220-
(* -------------------------------------------------------------------- *)
221163
Section MultinomMonoid.
222164
Context {n : nat}.
223165
Implicit Types (m : 'X_{1..n}).
224166

225-
Definition mnm0 := [multinom 0 | _ < n].
226-
Definition mnm1 (c : 'I_n) := [multinom c == i | i < n].
227-
Definition mnm_add m1 m2 := [multinom m1 i + m2 i | i < n].
228-
Definition mnm_sub m1 m2 := [multinom m1 i - m2 i | i < n].
229-
Definition mnm_muln m i := iterop i mnm_add m mnm0.
167+
Definition lem m1 m2 := [forall i, m1 i <= m2 i].
168+
Definition ltm m1 m2 := (m1 != m2) && (lem m1 m2).
169+
170+
Local Notation "*%M" := (@mmul 'X_{1..n}) : function_scope.
171+
Local Notation "/%M" := (@divcm 'I_n) : function_scope.
230172

231-
Arguments mnm_muln : simpl never.
173+
Local Notation "1" := (@mone 'X_{1..n}) : monom_scope.
174+
Local Notation "'U_(' i )" := (@ucm 'I_n i) : monom_scope.
175+
Local Notation "m1 * m2" := ( *%M m1 m2) : monom_scope.
176+
Local Notation "m1 / m2" := (/%M m1 m2) : monom_scope.
177+
Local Notation "x ^+ m" := (@expmn 'X_{1..n} x m) : monom_scope.
232178

233-
Local Notation "0" := mnm0 : multi_scope.
234-
Local Notation "'U_(' n )" := (mnm1 n) : multi_scope.
235-
Local Notation "m1 + m2" := (mnm_add m1 m2) : multi_scope.
236-
Local Notation "m1 - m2" := (mnm_sub m1 m2) : multi_scope.
237-
Local Notation "x *+ n" := (mnm_muln x n) : multi_scope.
179+
Local Notation "m1 <= m2" := (lem m1 m2) : monom_scope.
180+
Local Notation "m1 < m2" := (ltm m1 m2) : monom_scope.
238181

239-
Local Notation "+%MM" := (@mnm_add) : function_scope.
240-
Local Notation "-%MM" := (@mnm_sub) : function_scope.
182+
Lemma mnmE (E : 'I_n -> nat) (j : 'I_n) : [multinom E i | i < n]%M j = E j.
183+
Proof. by rewrite cmE fsfunE inE. Qed.
241184

242-
Local Notation "m1 <= m2" := (lem m1 m2) : multi_scope.
243-
Local Notation "m1 < m2" := (ltm m1 m2) : multi_scope.
185+
Lemma mnmP (m1 m2 : 'X_{1..n}) : (m1 = m2) <-> (m1 =1 m2).
186+
Proof. by split => [->|/fsfunP/val_inj]. Qed.
244187

245-
Lemma mnm0E i : 0%MM i = 0%N. Proof. exact/mnmE. Qed.
188+
Lemma mnm0E i : 1%M i = 0%N. Proof. exact: cm1. Qed.
246189

247-
Lemma mnmDE i m1 m2 : (m1 + m2)%MM i = (m1 i + m2 i)%N. Proof. exact/mnmE. Qed.
190+
Lemma mnmDE i m1 m2 : (m1 * m2)%M i = (m1 i + m2 i)%N. Proof. exact: cmM. Qed.
248191

249-
Lemma mnmBE i m1 m2 : (m1 - m2)%MM i = (m1 i - m2 i)%N. Proof. exact/mnmE. Qed.
192+
Lemma mnmBE i m1 m2 : (m1 / m2)%M i = (m1 i - m2 i)%N.
193+
Proof. exact: divcmE. Qed.
250194

251195
Lemma mnm_sumE (I : Type) i (r : seq I) P F :
252-
(\big[+%MM/0%MM]_(x <- r | P x) (F x)) i = (\sum_(x <- r | P x) (F x i))%N.
253-
Proof. by apply/(big_morph (fun m => m i)) => [x y|]; rewrite mnmE. Qed.
196+
(\big[*%M/1%M]_(x <- r | P x) (F x)) i = (\sum_(x <- r | P x) (F x i))%N.
197+
Proof. exact/(big_morph (fun m => m i))/cm1/cmM. Qed.
198+
199+
Lemma mnm1E i j : U_(i)%M j = (i == j). Proof. exact: ucmE. Qed.
254200

255201
(*-------------------------------------------------------------------- *)
256-
Lemma mnm_lepP {m1 m2} : reflect (forall i, m1 i <= m2 i) (m1 <= m2)%MM.
202+
Lemma mnm_lepP {m1 m2} : reflect (forall i, m1 i <= m2 i) (m1 <= m2)%M.
257203
Proof. exact: (iffP forallP). Qed.
258204

259-
Lemma lepm_refl m : (m <= m)%MM. Proof. exact/mnm_lepP. Qed.
205+
Lemma lepm_refl m : (m <= m)%M. Proof. exact/mnm_lepP. Qed.
260206

261-
Lemma lepm_trans m3 m1 m2 : (m1 <= m2 -> m2 <= m3 -> m1 <= m3)%MM.
207+
Lemma lepm_trans m3 m1 m2 : (m1 <= m2 -> m2 <= m3 -> m1 <= m3)%M.
262208
Proof.
263209
move=> h1 h2; apply/mnm_lepP => i.
264210
exact: leq_trans (mnm_lepP h1 i) (mnm_lepP h2 i).
265211
Qed.
266212

267-
Lemma addmC : commutative +%MM.
268-
Proof. by move=> m1 m2; apply/mnmP=> i; rewrite !mnmE addnC. Qed.
269-
270-
Lemma addmA : associative +%MM.
271-
Proof. by move=> m1 m2 m3; apply/mnmP=> i; rewrite !mnmE addnA. Qed.
213+
Lemma addmC : commutative *%M. Proof. exact: mulmC. Qed.
272214

273-
Lemma add0m : left_id 0%MM +%MM.
274-
Proof. by move=> m; apply/mnmP=> i; rewrite !mnmE add0n. Qed.
215+
Lemma addmA : associative *%M. Proof. exact: mulmA. Qed.
275216

276-
Lemma addm0 : right_id 0%MM +%MM.
277-
Proof. by move=> m; rewrite addmC add0m. Qed.
217+
Lemma add0m : left_id 1%M *%M. Proof. exact: mul1m. Qed.
278218

279-
HB.instance Definition _ := Monoid.isComLaw.Build 'X_{1..n} 0%MM +%MM
280-
addmA addmC add0m.
219+
Lemma addm0 : right_id 1%M *%M. Proof. exact: mulm1. Qed.
281220

282-
Lemma subm0 m : (m - 0)%MM = m.
283-
Proof. by apply/mnmP=> i; rewrite !mnmE subn0. Qed.
221+
Lemma subm0 m : (m / 1)%M = m.
222+
Proof. by apply/mnmP=> i; rewrite divcmE cm1 subn0. Qed.
284223

285-
Lemma sub0m m : (0 - m = 0)%MM.
286-
Proof. by apply/mnmP=> i; rewrite !mnmE sub0n. Qed.
224+
Lemma sub0m m : (1 / m = 1)%M.
225+
Proof. by apply/mnmP=> i; rewrite divcmE cm1 sub0n. Qed.
287226

288-
Lemma addmK m : cancel (+%MM^~ m) (-%MM^~ m).
289-
Proof. by move=> m' /=; apply/mnmP=> i; rewrite !mnmE addnK. Qed.
227+
Lemma addmK m : cancel ( *%M^~ m) (/%M^~ m).
228+
Proof. by move=> m'; apply/mnmP=> i; rewrite divcmE cmM addnK. Qed.
290229

291-
Lemma addIm : left_injective +%MM.
292-
Proof. by move=> ? ? ? /(can_inj (@addmK _)). Qed.
230+
Lemma addIm : left_injective *%M.
231+
Proof. by move=> ? ? ? /(can_inj (addmK _)). Qed.
293232

294-
Lemma addmI : right_injective +%MM.
295-
Proof. by move=> m ? ?; rewrite ![(m + _)%MM]addmC => /addIm. Qed.
233+
Lemma addmI : right_injective *%M.
234+
Proof. by move=> m ? ?; rewrite ![mmul m _]mulmC => /addIm. Qed.
296235

297-
Lemma eqm_add2l m n1 n2 : (m + n1 == m + n2)%MM = (n1 == n2).
236+
Lemma eqm_add2l m n1 n2 : (m * n1 == m * n2)%M = (n1 == n2).
298237
Proof. exact/inj_eq/addmI. Qed.
299238

300-
Lemma eqm_add2r m n1 n2 : (n1 + m == n2 + m)%MM = (n1 == n2).
239+
Lemma eqm_add2r m n1 n2 : (n1 * m == n2 * m)%M = (n1 == n2).
301240
Proof. exact: (inj_eq (@addIm _)). Qed.
302241

303-
Lemma submK m m' : (m <= m')%MM -> (m' - m + m = m')%MM.
304-
Proof. by move/mnm_lepP=> h; apply/mnmP=> i; rewrite !mnmE subnK. Qed.
242+
Lemma submK m m' : (m <= m')%M -> (m' / m * m = m')%M.
243+
Proof. by move/mnm_lepP=> h; apply/mnmP=> i; rewrite cmM divcmE subnK. Qed.
305244

306-
Lemma addmBA m1 m2 m3 :
307-
(m3 <= m2)%MM -> (m1 + (m2 - m3))%MM = (m1 + m2 - m3)%MM.
308-
Proof. by move/mnm_lepP=> h; apply/mnmP=> i; rewrite !mnmE addnBA. Qed.
245+
Lemma addmBA m1 m2 m3 : (m3 <= m2)%M -> (m1 * (m2 / m3))%M = (m1 * m2 / m3)%M.
246+
Proof. by move/mnm_lepP=> h; apply/mnmP=> i; rewrite !(divcmE, cmM) addnBA. Qed.
309247

310-
Lemma submDA m1 m2 m3 : (m1 - m2 - m3)%MM = (m1 - (m2 + m3))%MM.
311-
Proof. by apply/mnmP=> i; rewrite !mnmE subnDA. Qed.
248+
Lemma submDA m1 m2 m3 : (m1 / m2 / m3)%M = (m1 / (m2 * m3))%M.
249+
Proof. by apply/mnmP=> i; rewrite !divcmE cmM subnDA. Qed.
312250

313-
Lemma submBA m1 m2 m3 : (m3 <= m2)%MM -> (m1 - (m2 - m3) = m1 + m3 - m2)%MM.
314-
Proof. by move/mnm_lepP=> h; apply/mnmP=> i; rewrite !mnmE subnBA. Qed.
251+
Lemma submBA m1 m2 m3 : (m3 <= m2)%M -> (m1 / (m2 / m3) = m1 * m3 / m2)%M.
252+
Proof. by move/mnm_lepP=> h; apply/mnmP=> i; rewrite !divcmE cmM subnBA. Qed.
315253

316-
Lemma lem_subr m1 m2 : (m1 - m2 <= m1)%MM.
317-
Proof. by apply/mnm_lepP=> i; rewrite !mnmE leq_subr. Qed.
254+
Lemma lem_subr m1 m2 : (m1 / m2 <= m1)%M.
255+
Proof. by apply/mnm_lepP=> i; rewrite divcmE leq_subr. Qed.
318256

319-
Lemma lem_addr m1 m2 : (m1 <= m1 + m2)%MM.
320-
Proof. by apply/mnm_lepP=> i; rewrite mnmDE leq_addr. Qed.
257+
Lemma lem_addr m1 m2 : (m1 <= m1* m2)%M.
258+
Proof. by apply/mnm_lepP=> i; rewrite cmM leq_addr. Qed.
321259

322-
Lemma lem_addl m1 m2 : (m2 <= m1 + m2)%MM.
323-
Proof. by apply/mnm_lepP=> i; rewrite mnmDE leq_addl. Qed.
260+
Lemma lem_addl m1 m2 : (m2 <= m1 * m2)%M.
261+
Proof. by apply/mnm_lepP=> i; rewrite cmM leq_addl. Qed.
324262

325263
(* -------------------------------------------------------------------- *)
326-
Lemma mulm0n m : (m *+ 0 = 0)%MM.
327-
Proof. by []. Qed.
264+
Lemma mulm0n m : (m ^+ 0 = 1)%M. Proof. by []. Qed.
328265

329-
Lemma mulm1n m : (m *+ 1 = m)%MM.
330-
Proof. by []. Qed.
266+
Lemma mulm1n m : (m ^+ 1 = m)%M. Proof. by []. Qed.
331267

332-
Lemma mulmS m i : (m *+ i.+1 = m + m *+ i)%MM.
333-
Proof. by rewrite /mnm_muln !Monoid.iteropE iterS. Qed.
268+
Lemma mulmS m i : (m ^+ i.+1 = m * m ^+ i)%M. Proof. exact: expmnS. Qed.
334269

335-
Lemma mulmSr m i : (m *+ i.+1 = m *+ i + m)%MM.
336-
Proof. by rewrite mulmS addmC. Qed.
270+
Lemma mulmSr m i : (m ^+ i.+1 = m ^+ i * m)%M. Proof. exact: expmnSr. Qed.
337271

338-
Lemma mulmnE m k i : ((m *+ k) i)%MM = (m i * k)%N.
272+
Lemma mulmnE m k i : (m ^+ k)%M i = (m i * k)%N.
339273
Proof.
340-
elim: k => [|k ih]; first by rewrite muln0 mulm0n !mnmE.
341-
by rewrite mulmS mulnS mnmDE ih.
274+
elim: k => [|k ih]; first by rewrite cm1 muln0.
275+
by rewrite mulmS cmM ih mulnS.
342276
Qed.
343277

344-
Lemma mnm1E i j : U_(i)%MM j = (i == j). Proof. exact/mnmE. Qed.
345-
346-
Lemma lep1mP i m : (U_(i) <= m)%MM = (m i != 0%N).
278+
Lemma lep1mP i m : (U_(i) <= m)%M = (m i != 0%N).
347279
Proof.
348280
apply/mnm_lepP/idP=> [/(_ i)|]; rewrite -lt0n; first by rewrite mnm1E eqxx.
349281
by move=> lt0_mi j; rewrite mnm1E; case: eqP=> // <-.
350282
Qed.
351283

352284
End MultinomMonoid.
353285

354-
Arguments mnm_muln : simpl never.
355-
356286
(* -------------------------------------------------------------------- *)
357287
Notation "+%MM" := (@mnm_add _).
358288
Notation "-%MM" := (@mnm_sub _).

0 commit comments

Comments
 (0)