Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit a5fa162

Browse files
kim-emChrisHughes24
authored andcommitted
chore(data/mv_polynomial): use classical logic (#1391)
* refactor(linear_algebra/lc): use families not sets * refactor(linear_algebra/lc): merge lc into finsupp * refactor(linear_algebra/lc): localize decidability * refactor(linear_algebra/lc): finsupp instances * refactor(linear_algebra/lc): use families instead of sets * refactor(linear_algebra/lc): remove set argument in lin_indep * refactor(linear_algebra/lc): clean up * refactor(linear_algebra/lc): more clean up * refactor(linear_algebra/lc): set_option in section * refactor(linear_algebra/lc): decidability proof * refactor(linear_algebra/lc): arrow precedence * refactor(linear_algebra/lc): more cleanup * make data.finsupp classical * trouble with data/polynomial * ... * more classical * merge * merge * merge * fix * removing more * minor * ? * progress, using convert * working? * remove some unnecessary converts * fixes * err * oops * various * various * fix free_comm_ring * remove test lines * fix linear_algebra/matrix.lean * Fix errors in power_series.lean * trying to turn instances back on * restore some instances * no joy * fix mv_polynomial errors * another convert
1 parent 1a0ed80 commit a5fa162

18 files changed

+318
-284
lines changed

src/algebra/CommRing/adjunctions.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def free : Type u ⥤ CommRing.{u} :=
3636
def hom_equiv (α : Type u) (R : CommRing.{u}) : (free.obj α ⟶ R) ≃ (α ⟶ forget.obj R) :=
3737
{ to_fun := λ f, f ∘ X,
3838
inv_fun := λ f, ⟨eval₂ (λ n : ℤ, (n : R)) f, by { unfold_coes, apply_instance }⟩,
39-
left_inv := λ f, bundled.hom_ext (@eval₂_hom_X _ _ _ _ _ _ f.val _),
39+
left_inv := λ f, bundled.hom_ext (@eval₂_hom_X _ _ _ _ _ f.val _),
4040
right_inv := λ x, by { ext1, unfold_coes, simp only [function.comp_app, eval₂_X] } }
4141

4242
def adj : free ⊣ (forget : CommRing ⥤ Type u) :=

src/data/finsupp.lean

Lines changed: 73 additions & 88 deletions
Large diffs are not rendered by default.

src/data/mv_polynomial.lean

Lines changed: 42 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ Multivariate Polynomial
88
import algebra.ring
99
import data.finsupp data.polynomial data.equiv.algebra
1010

11+
noncomputable theory
12+
local attribute [instance, priority 100] classical.prop_decidable
13+
1114
open set function finsupp lattice
1215

1316
universes u v w x
@@ -20,12 +23,10 @@ def mv_polynomial (σ : Type*) (α : Type*) [comm_semiring α] := (σ →₀ ℕ
2023
namespace mv_polynomial
2124
variables {σ : Type*} {a a' a₁ a₂ : α} {e : ℕ} {n m : σ} {s : σ →₀ ℕ}
2225

23-
variables [decidable_eq σ] [decidable_eq α]
24-
2526
section comm_semiring
2627
variables [comm_semiring α] {p q : mv_polynomial σ α}
2728

28-
instance : decidable_eq (mv_polynomial σ α) := finsupp.decidable_eq
29+
instance decidable_eq_mv_polynomial [decidable_eq σ] [decidable_eq α] : decidable_eq (mv_polynomial σ α) := finsupp.decidable_eq
2930
instance : has_zero (mv_polynomial σ α) := finsupp.has_zero
3031
instance : has_one (mv_polynomial σ α) := finsupp.has_one
3132
instance : has_add (mv_polynomial σ α) := finsupp.has_add
@@ -80,21 +81,21 @@ by rw [X_pow_eq_single, monomial, monomial, monomial, single_mul_single]; simp
8081

8182
lemma monomial_eq : monomial s a = C a * (s.prod $ λn e, X n ^ e : mv_polynomial σ α) :=
8283
begin
83-
apply @finsupp.induction σ ℕ _ _ _ _ s,
84+
apply @finsupp.induction σ ℕ _ _ s,
8485
{ simp [C, prod_zero_index]; exact (mul_one _).symm },
8586
{ assume n e s hns he ih,
8687
simp [prod_add_index, prod_single_index, pow_zero, pow_add, (mul_assoc _ _ _).symm, ih.symm,
8788
monomial_add_single] }
8889
end
8990

90-
@[recursor 7]
91+
@[recursor 5]
9192
lemma induction_on {M : mv_polynomial σ α → Prop} (p : mv_polynomial σ α)
9293
(h_C : ∀a, M (C a)) (h_add : ∀p q, M p → M q → M (p + q)) (h_X : ∀p n, M p → M (p * X n)) :
9394
M p :=
9495
have ∀s a, M (monomial s a),
9596
begin
9697
assume s a,
97-
apply @finsupp.induction σ ℕ _ _ _ _ s,
98+
apply @finsupp.induction σ ℕ _ _ s,
9899
{ show M (monomial 0 a), from h_C a, },
99100
{ assume n e p hpn he ih,
100101
have : ∀e:ℕ, M (monomial p a * X n ^ e),
@@ -142,7 +143,8 @@ lemma ext_iff (p q : mv_polynomial σ α) :
142143
@[simp] lemma coeff_zero (m : σ →₀ ℕ) :
143144
coeff m (0 : mv_polynomial σ α) = 0 := rfl
144145

145-
@[simp] lemma coeff_zero_X (i : σ) : coeff 0 (X i : mv_polynomial σ α) = 0 := rfl
146+
@[simp] lemma coeff_zero_X (i : σ) : coeff 0 (X i : mv_polynomial σ α) = 0 :=
147+
single_eq_of_ne (λ h, by cases single_eq_zero.1 h)
146148

147149
instance coeff.is_add_monoid_hom (m : σ →₀ ℕ) :
148150
is_add_monoid_hom (coeff m : mv_polynomial σ α → α) :=
@@ -158,17 +160,17 @@ by simp [monomial_eq]
158160

159161
@[simp] lemma coeff_monomial (m n) (a) :
160162
coeff m (monomial n a : mv_polynomial σ α) = if n = m then a else 0 :=
161-
single_apply
163+
by convert single_apply
162164

163165
@[simp] lemma coeff_C (m) (a) :
164166
coeff m (C a : mv_polynomial σ α) = if 0 = m then a else 0 :=
165-
single_apply
167+
by convert single_apply
166168

167169
lemma coeff_X_pow (i : σ) (m) (k : ℕ) :
168170
coeff m (X i ^ k : mv_polynomial σ α) = if single i k = m then 1 else 0 :=
169171
begin
170172
have := coeff_monomial m (finsupp.single i k) (1:α),
171-
rwa [@monomial_eq _ _ (1:α) (finsupp.single i k) _ _ _,
173+
rwa [@monomial_eq _ _ (1:α) (finsupp.single i k) _,
172174
C_1, one_mul, finsupp.prod_single_index] at this,
173175
exact pow_zero _
174176
end
@@ -202,7 +204,7 @@ begin
202204
convert this.symm using 1; clear this,
203205
{ rw [coeff],
204206
repeat {rw sum_apply, apply finset.sum_congr rfl, intros, dsimp only},
205-
exact single_apply },
207+
convert single_apply },
206208
{ have : (antidiagonal n).support.filter (λ x, x.1 ∈ p.support ∧ x.2 ∈ q.support) ⊆
207209
(antidiagonal n).support := finset.filter_subset _,
208210
rw [← finset.sum_sdiff this, finset.sum_eq_zero, zero_add], swap,
@@ -354,17 +356,17 @@ begin
354356
rwa finsupp.mem_support_iff at hc
355357
end
356358

357-
@[simp] lemma eval₂_prod [decidable_eq γ] (s : finset γ) (p : γ → mv_polynomial σ α) :
359+
@[simp] lemma eval₂_prod (s : finset γ) (p : γ → mv_polynomial σ α) :
358360
eval₂ f g (s.prod p) = s.prod (λ x, eval₂ f g $ p x) :=
359361
(finset.prod_hom _).symm
360362

361-
@[simp] lemma eval₂_sum [decidable_eq γ] (s : finset γ) (p : γ → mv_polynomial σ α) :
363+
@[simp] lemma eval₂_sum (s : finset γ) (p : γ → mv_polynomial σ α) :
362364
eval₂ f g (s.sum p) = s.sum (λ x, eval₂ f g $ p x) :=
363365
(finset.sum_hom _).symm
364366

365367
attribute [to_additive] eval₂_prod
366368

367-
lemma eval₂_assoc [decidable_eq γ] (q : γ → mv_polynomial σ α) (p : mv_polynomial γ α) :
369+
lemma eval₂_assoc (q : γ → mv_polynomial σ α) (p : mv_polynomial γ α) :
368370
eval₂ f (λ t, eval₂ f g (q t)) p = eval₂ f g (eval₂ C q p) :=
369371
by { rw eval₂_comp_left (eval₂ f g), congr, funext, simp }
370372

@@ -392,7 +394,7 @@ eval₂_monomial _ _
392394
instance eval.is_semiring_hom : is_semiring_hom (eval f) :=
393395
eval₂.is_semiring_hom _ _
394396

395-
theorem eval_assoc {τ} [decidable_eq τ]
397+
theorem eval_assoc {τ}
396398
(f : σ → mv_polynomial τ α) (g : τ → α)
397399
(p : mv_polynomial σ α) :
398400
p.eval (eval g ∘ f) = (eval₂ C f p).eval g :=
@@ -404,7 +406,7 @@ end
404406
end eval
405407

406408
section map
407-
variables [comm_semiring β] [decidable_eq β]
409+
variables [comm_semiring β]
408410
variables (f : α → β) [is_semiring_hom f]
409411

410412
/-- `map f p` maps a polynomial `p` across a ring hom `f` -/
@@ -434,7 +436,7 @@ eval₂.is_semiring_hom _ _
434436

435437
theorem map_id : ∀ (p : mv_polynomial σ α), map id p = p := eval₂_eta
436438

437-
theorem map_map [comm_semiring γ] [decidable_eq γ]
439+
theorem map_map [comm_semiring γ]
438440
(g : β → γ) [is_semiring_hom g]
439441
(p : mv_polynomial σ α) :
440442
map g (map f p) = map (g ∘ f) p :=
@@ -461,8 +463,7 @@ begin
461463
rw [eval₂_mul, is_semiring_hom.map_mul k, map_mul, eval₂_mul, map_X, hp, eval₂_X, eval₂_X] }
462464
end
463465

464-
lemma map_eval₂ [decidable_eq γ] [decidable_eq δ]
465-
(f : α → β) [is_semiring_hom f] (g : γ → mv_polynomial δ α) (p : mv_polynomial γ α) :
466+
lemma map_eval₂ (f : α → β) [is_semiring_hom f] (g : γ → mv_polynomial δ α) (p : mv_polynomial γ α) :
466467
map f (eval₂ C g p) = eval₂ C (map f ∘ g) (map f p) :=
467468
begin
468469
apply mv_polynomial.induction_on p,
@@ -522,19 +523,21 @@ multiset.le_zero.1 $ degrees_monomial _ _
522523
lemma degrees_X (n : σ) : degrees (X n : mv_polynomial σ α) ≤ {n} :=
523524
le_trans (degrees_monomial _ _) $ le_of_eq $ to_multiset_single _ _
524525

525-
lemma degrees_zero : degrees (0 : mv_polynomial σ α) = 0 := degrees_C 0
526+
lemma degrees_zero : degrees (0 : mv_polynomial σ α) = 0 :=
527+
by { rw ← C_0, exact degrees_C 0 }
526528

527529
lemma degrees_one : degrees (1 : mv_polynomial σ α) = 0 := degrees_C 1
528530

529531
lemma degrees_add (p q : mv_polynomial σ α) : (p + q).degrees ≤ p.degrees ⊔ q.degrees :=
530532
begin
531533
refine finset.sup_le (assume b hb, _),
532-
cases finset.mem_union.1 (finsupp.support_add hb),
533-
{ exact le_sup_left_of_le (finset.le_sup h) },
534-
{ exact le_sup_right_of_le (finset.le_sup h) },
534+
have := finsupp.support_add hb, rw finset.mem_union at this,
535+
cases this,
536+
{ exact le_sup_left_of_le (finset.le_sup this) },
537+
{ exact le_sup_right_of_le (finset.le_sup this) },
535538
end
536539

537-
lemma degrees_sum {ι : Type*} [decidable_eq ι] (s : finset ι) (f : ι → mv_polynomial σ α) :
540+
lemma degrees_sum {ι : Type*} (s : finset ι) (f : ι → mv_polynomial σ α) :
538541
(s.sum f).degrees ≤ s.sup (λi, (f i).degrees) :=
539542
begin
540543
refine s.induction _ _,
@@ -554,7 +557,7 @@ begin
554557
exact add_le_add (finset.le_sup h₁) (finset.le_sup h₂)
555558
end
556559

557-
lemma degrees_prod {ι : Type*} [decidable_eq ι] (s : finset ι) (f : ι → mv_polynomial σ α) :
560+
lemma degrees_prod {ι : Type*} (s : finset ι) (f : ι → mv_polynomial σ α) :
558561
(s.prod f).degrees ≤ s.sum (λi, (f i).degrees) :=
559562
begin
560563
refine s.induction _ _,
@@ -638,9 +641,10 @@ lemma total_degree_add (a b : mv_polynomial σ α) :
638641
finset.sup_le $ assume n hn,
639642
have _ := finsupp.support_add hn,
640643
begin
641-
rcases finset.mem_union.1 this,
642-
{ exact le_max_left_of_le (finset.le_sup h) },
643-
{ exact le_max_right_of_le (finset.le_sup h) }
644+
rw finset.mem_union at this,
645+
cases this,
646+
{ exact le_max_left_of_le (finset.le_sup this) },
647+
{ exact le_max_right_of_le (finset.le_sup this) }
644648
end
645649

646650
lemma total_degree_mul (a b : mv_polynomial σ α) :
@@ -763,7 +767,7 @@ congr_fun (int.eq_cast' (f ∘ C)) n
763767

764768
/-- A ring homomorphism f : Z[X_1, X_2, ...] → R
765769
is determined by the evaluations f(X_1), f(X_2), ... -/
766-
@[simp] lemma eval₂_hom_X {α : Type u} [decidable_eq α] (c : ℤ → β) [is_ring_hom c]
770+
@[simp] lemma eval₂_hom_X {α : Type u} (c : ℤ → β) [is_ring_hom c]
767771
(f : mv_polynomial α ℤ → β) [is_ring_hom f] (x : mv_polynomial α ℤ) :
768772
eval₂ c (f ∘ X) x = f x :=
769773
mv_polynomial.induction_on x
@@ -787,7 +791,7 @@ end eval
787791

788792
section map
789793

790-
variables [decidable_eq β] [comm_ring β]
794+
variables [comm_ring β]
791795
variables (f : α → β) [is_ring_hom f]
792796

793797
instance map.is_ring_hom : is_ring_hom (map f : mv_polynomial σ α → mv_polynomial σ β) :=
@@ -802,7 +806,7 @@ end map
802806
end comm_ring
803807

804808
section rename
805-
variables {α} [comm_semiring α] [decidable_eq α] [decidable_eq β] [decidable_eq γ] [decidable_eq δ]
809+
variables {α} [comm_semiring α]
806810

807811
def rename (f : β → γ) : mv_polynomial β α → mv_polynomial γ α :=
808812
eval₂ C (X ∘ f)
@@ -829,7 +833,7 @@ eval₂_one _ _
829833
rename f (p + q) = rename f p + rename f q :=
830834
eval₂_add _ _
831835

832-
@[simp] lemma rename_sub {α} [comm_ring α] [decidable_eq α]
836+
@[simp] lemma rename_sub {α} [comm_ring α]
833837
(f : β → γ) (p q : mv_polynomial β α) :
834838
rename f (p - q) = rename f p - rename f q :=
835839
eval₂_sub _ _ _
@@ -895,7 +899,8 @@ finset.sup_le $ assume b,
895899
assume h,
896900
rw rename_eq at h,
897901
have h' := finsupp.map_domain_support h,
898-
rcases finset.mem_image.1 h' with ⟨s, hs, rfl⟩,
902+
rw finset.mem_image at h',
903+
rcases h' with ⟨s, hs, rfl⟩,
899904
rw finsupp.sum_map_domain_index,
900905
exact le_trans (le_refl _) (finset.le_sup hs),
901906
exact assume _, rfl,
@@ -929,7 +934,7 @@ end
929934

930935
end rename
931936

932-
lemma eval₂_cast_comp {β : Type u} {γ : Type v} [decidable_eq β] [decidable_eq γ] (f : γ → β)
937+
lemma eval₂_cast_comp {β : Type u} {γ : Type v} (f : γ → β)
933938
{α : Type w} [comm_ring α] (c : ℤ → α) [is_ring_hom c] (g : β → α) (x : mv_polynomial γ ℤ) :
934939
eval₂ c (g ∘ f) x = eval₂ c g (rename f x) :=
935940
mv_polynomial.induction_on x
@@ -938,15 +943,14 @@ mv_polynomial.induction_on x
938943
(λ p n hp, by simp only [hp, rename, eval₂_X, eval₂_mul])
939944

940945
instance rename.is_ring_hom
941-
{α} [comm_ring α] [decidable_eq α] [decidable_eq β] [decidable_eq γ] (f : β → γ) :
946+
{α} [comm_ring α] (f : β → γ) :
942947
is_ring_hom (rename f : mv_polynomial β α → mv_polynomial γ α) :=
943948
@is_ring_hom.of_semiring (mv_polynomial β α) (mv_polynomial γ α) _ _ (rename f)
944949
(rename.is_semiring_hom f)
945950

946951
section equiv
947952

948953
variables (α) [comm_ring α]
949-
variables [decidable_eq β] [decidable_eq γ] [decidable_eq δ]
950954

951955
set_option class.instance_max_depth 40
952956

@@ -1054,10 +1058,10 @@ def mv_polynomial_equiv_mv_polynomial [comm_ring δ]
10541058

10551059
def sum_ring_equiv : mv_polynomial (β ⊕ γ) α ≃r mv_polynomial β (mv_polynomial γ α) :=
10561060
begin
1057-
apply @mv_polynomial_equiv_mv_polynomial α (β ⊕ γ) _ _ _ _ _ _ _ _
1061+
apply @mv_polynomial_equiv_mv_polynomial α (β ⊕ γ) _ _ _ _
10581062
(sum_to_iter α β γ) _ (iter_to_sum α β γ) _,
10591063
{ assume p,
1060-
apply @hom_eq_hom _ _ _ _ _ _ _ _ _ _ _ _ _ p,
1064+
apply hom_eq_hom _ _ _ _ _ _ p,
10611065
apply_instance,
10621066
{ apply @is_semiring_hom.comp _ _ _ _ _ _ _ _ _ _,
10631067
apply_instance,

0 commit comments

Comments
 (0)