Zulip Chat Archive
Stream: maths
Topic: mv_polynomial induction on variables
Aaron Anderson (Nov 12 2020 at 17:56):
There are a few proofs in ring_theory.polynomial.basic
that follow the same general path through several lemmas
Aaron Anderson (Nov 12 2020 at 17:56):
Proving that a property is invariant under ring isos, and then proving that P R -> P (polynomial R)
Aaron Anderson (Nov 12 2020 at 17:57):
and then concluding that P R → P (mv_polynomial σ R)
given fintype σ
.
Aaron Anderson (Nov 12 2020 at 17:58):
Is there a way that we can generalize this into a single lemma, to use on the remaining properties of that sort?
Johan Commelin (Nov 13 2020 at 06:50):
@Aaron Anderson Good question, I've also been thinking about this (but not for very long). We would want some sort of mv_polynomial.induction_on_vars
or something like that. I haven't tried actually implementing it.
Alex J. Best (Nov 13 2020 at 08:12):
I also thought about this once but never tried, I just had a go and ended up with
open polynomial
open mv_polynomial
lemma aa {R0 : Type} {σ : Type} [fintype σ] [comm_ring R0] (P : Π (R) [comm_ring R], Prop)
(hp : ∀ {R S} [comm_ring R] [comm_ring S], by resetI; exact S ≃+* R → P R → P S )
(h : ∀ (R) [h : comm_ring R], @P R h → P (by resetI; exact polynomial R)) (hR0 : P R0) :
P (mv_polynomial σ R0) :=
begin
apply hp (ring_equiv_of_equiv R0 (fintype.equiv_fin σ).out),
induction fintype.card σ,
{ apply hp (ring_equiv_of_equiv R0 fin_zero_equiv'),
apply hp (pempty_ring_equiv R0),
exact hR0, },
{ apply hp (mv_polynomial.fin_succ_equiv R0 n),
apply h,
exact ih, }
end
Alex J. Best (Nov 13 2020 at 08:28):
yeah its kinda janky with the universe levels and typeclasses lol but it semi works
instance is_noetherian_ring' (R :Type) [comm_ring R] {σ : Type} [fintype σ] [h : is_noetherian_ring R] :
is_noetherian_ring (mv_polynomial σ R) :=
begin
convert aa _ _ _ _,
swap,
{ intros, resetI,
exact is_noetherian_ring R_1, },
swap,
exact σ,
swap,
exact R,
simp,
apply_instance,
exact h,
{ simp,
intros _ _ _ _ f hh, resetI, exact is_noetherian_ring_of_ring_equiv _ f.symm, },
simp,
intros,
resetI,
exact polynomial.is_noetherian_ring,
end
Alex J. Best (Nov 13 2020 at 08:32):
It gets a bit nicer if I leave R0 and sigma explicit
Patrick Massot (Nov 13 2020 at 11:11):
These by resetI; exact S ≃+* R → P R → P S
really don't look nice. We should at least encapsulate them into some definition.
Eric Wieser (Nov 13 2020 at 13:17):
is by resetI; exact
the same as by exactI
?
Eric Wieser (Nov 13 2020 at 14:06):
#mwe version of @Alex J. Best's lemma (complete with exactI
:
import data.mv_polynomial.equiv
import data.mv_polynomial
open polynomial
open mv_polynomial
open_locale classical
lemma aa {R0 : Type} {σ : Type} [fintype σ] [comm_ring R0] (P : Π (R) [comm_ring R], Prop)
(hp : ∀ {R S} [comm_ring R] [comm_ring S], by exactI S ≃+* R → P R → P S)
(h : ∀ (R) [comm_ring R], by exactI P R → P (polynomial R)) (hR0 : P R0) :
P (mv_polynomial σ R0) :=
begin
apply hp (ring_equiv_of_equiv R0 (fintype.equiv_fin σ).out),
induction fintype.card σ,
{ apply hp (ring_equiv_of_equiv R0 fin_zero_equiv'),
apply hp (pempty_ring_equiv R0),
exact hR0, },
{ apply hp (mv_polynomial.fin_succ_equiv R0 n),
apply h,
exact ih, }
end
Johan Commelin (Nov 13 2020 at 15:32):
I think we should refactor some of the proofs in mathlib to use this lemma.
Eric Wieser (Nov 13 2020 at 15:39):
It seems to me that the input hypotheses to the lemma are overly general
Eric Wieser (Nov 13 2020 at 15:43):
Using (hp : ∀ {R S} [comm_ring R], by exactI mv_polynomial S R0 ≃+* R → P R → P (mv_polynomial S R0))
is a little more constrained (replacing S
with mv_polynomial S R0
)
Johan Commelin (Nov 13 2020 at 15:46):
True, but I can't think of an application where this difference matters.
Johan Commelin (Nov 13 2020 at 15:47):
We want to apply it to P
that are isom-invariant. And proving the isom-invariance is usually "trivial".
Aaron Anderson (Nov 13 2020 at 17:24):
FWIW, this should be able to refactor the proofs for is_integral_domain
, is_noetherian_ring
, and is_jacobson
, and then quickly provide proofs for unique_factorization_monoid
, and given a version with data, gcd_monoid
.
Aaron Anderson (Nov 13 2020 at 17:27):
I don't think the version with data will be very simple or necessarily similar...
Johan Commelin (Nov 13 2020 at 18:04):
There are some highly nonconstructive steps in this induction method.
Johan Commelin (Nov 13 2020 at 18:05):
But if there were a gcd_monoid.copy
, then we could at least use this method to get all the proofs. Might still be useful.
Aaron Anderson (Nov 22 2020 at 04:54):
Eric Wieser said:
#mwe version of Alex J. Best's lemma (complete with
exactI
:import data.mv_polynomial.equiv import data.mv_polynomial open polynomial open mv_polynomial open_locale classical lemma aa {R0 : Type} {σ : Type} [fintype σ] [comm_ring R0] (P : Π (R) [comm_ring R], Prop) (hp : ∀ {R S} [comm_ring R] [comm_ring S], by exactI S ≃+* R → P R → P S) (h : ∀ (R) [comm_ring R], by exactI P R → P (polynomial R)) (hR0 : P R0) : P (mv_polynomial σ R0) := begin apply hp (ring_equiv_of_equiv R0 (fintype.equiv_fin σ).out), induction fintype.card σ, { apply hp (ring_equiv_of_equiv R0 fin_zero_equiv'), apply hp (pempty_ring_equiv R0), exact hR0, }, { apply hp (mv_polynomial.fin_succ_equiv R0 n), apply h, exact ih, } end
Is there any way to make this work for different universes?
Mario Carneiro (Nov 22 2020 at 05:10):
why would you want to?
Mario Carneiro (Nov 22 2020 at 05:10):
all the hypotheses can be in the same universe as the inputs
Mario Carneiro (Nov 22 2020 at 05:38):
lemma aa {R0 : Type u} {σ : Type v} [fintype σ] [comm_ring R0]
(P : Π (R : Type u) [comm_ring R], Prop)
(Q : Π (R : Type (max u v)) [comm_ring R], Prop)
(hp : ∀ {R S} [comm_ring R] [comm_ring S], by exactI S ≃+* R → P R → P S)
(hq : ∀ {R S} [comm_ring R] [comm_ring S], by exactI S ≃+* R → P R → Q S)
(h : ∀ (R : Type u) [comm_ring R], by exactI P R → P (polynomial R)) (hR0 : P R0) :
Q (mv_polynomial σ R0) :=
begin
apply hq (ring_equiv_of_equiv R0 (fintype.equiv_fin σ).out),
induction fintype.card σ,
{ apply hp ((ring_equiv_of_equiv R0 fin_zero_equiv').trans (pempty_ring_equiv R0)),
exact hR0, },
{ apply hp (mv_polynomial.fin_succ_equiv R0 n),
apply h,
exact ih, }
end
Last updated: Dec 20 2023 at 11:08 UTC