Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into adomani/uncdot_mathlib
Browse files Browse the repository at this point in the history
  • Loading branch information
adomani committed May 9, 2024
2 parents 8616399 + fa33d89 commit 7e8a9aa
Show file tree
Hide file tree
Showing 366 changed files with 6,394 additions and 4,242 deletions.
2 changes: 1 addition & 1 deletion Archive/Imo/Imo2013Q5.lean
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ theorem imo2013_q5 (f : ℚ → ℝ) (H1 : ∀ x y, 0 < x → 0 < y → f (x * y
-- we need the top of the fraction to be strictly greater than 1 in order
-- to apply `fixed_point_of_gt_1`.
intro x hx
have H₀ : x * x.den = x.num := Rat.mul_den_eq_num
have H₀ : x * x.den = x.num := x.mul_den_eq_num
have H : x * (↑(2 * x.den) : ℚ) = (↑(2 * x.num) : ℚ) := by push_cast; linear_combination 2 * H₀
set x2denom := 2 * x.den
set x2num := 2 * x.num
Expand Down
2 changes: 1 addition & 1 deletion Archive/Wiedijk100Theorems/FriendshipGraphs.lean
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ end Nonempty
theorem adjMatrix_sq_mul_const_one_of_regular (hd : G.IsRegularOfDegree d) :
G.adjMatrix R * of (fun _ _ => 1) = of (fun _ _ => (d : R)) := by
ext x
simp only [← hd x, degree, adjMatrix_mul_apply, sum_const, Nat.smul_one_eq_coe,
simp only [← hd x, degree, adjMatrix_mul_apply, sum_const, Nat.smul_one_eq_cast,
of_apply]
#align theorems_100.friendship.adj_matrix_sq_mul_const_one_of_regular Theorems100.Friendship.adjMatrix_sq_mul_const_one_of_regular

Expand Down
2 changes: 1 addition & 1 deletion Cache/IO.lean
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ private def CacheM.getContext : IO CacheM.Context := do
("Archive", root),
("Counterexamples", root),
("Aesop", LAKEPACKAGESDIR / "aesop"),
("Std", LAKEPACKAGESDIR / "std"),
("Batteries", LAKEPACKAGESDIR / "batteries"),
("Cli", LAKEPACKAGESDIR / "Cli"),
("ProofWidgets", LAKEPACKAGESDIR / "proofwidgets"),
("Qq", LAKEPACKAGESDIR / "Qq"),
Expand Down
13 changes: 11 additions & 2 deletions Mathlib.lean
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ import Mathlib.Algebra.Category.ModuleCat.Monoidal.Basic
import Mathlib.Algebra.Category.ModuleCat.Monoidal.Closed
import Mathlib.Algebra.Category.ModuleCat.Monoidal.Symmetric
import Mathlib.Algebra.Category.ModuleCat.Presheaf
import Mathlib.Algebra.Category.ModuleCat.Presheaf.Colimits
import Mathlib.Algebra.Category.ModuleCat.Presheaf.Limits
import Mathlib.Algebra.Category.ModuleCat.Products
import Mathlib.Algebra.Category.ModuleCat.Projective
Expand Down Expand Up @@ -200,7 +201,6 @@ import Mathlib.Algebra.Group.Embedding
import Mathlib.Algebra.Group.Equiv.Basic
import Mathlib.Algebra.Group.Equiv.TypeTags
import Mathlib.Algebra.Group.Ext
import Mathlib.Algebra.Group.Freiman
import Mathlib.Algebra.Group.Hom.Basic
import Mathlib.Algebra.Group.Hom.CompTypeclasses
import Mathlib.Algebra.Group.Hom.Defs
Expand Down Expand Up @@ -368,10 +368,12 @@ import Mathlib.Algebra.Lie.Solvable
import Mathlib.Algebra.Lie.Subalgebra
import Mathlib.Algebra.Lie.Submodule
import Mathlib.Algebra.Lie.TensorProduct
import Mathlib.Algebra.Lie.TraceForm
import Mathlib.Algebra.Lie.UniversalEnveloping
import Mathlib.Algebra.Lie.Weights.Basic
import Mathlib.Algebra.Lie.Weights.Cartan
import Mathlib.Algebra.Lie.Weights.Chain
import Mathlib.Algebra.Lie.Weights.Killing
import Mathlib.Algebra.Lie.Weights.Linear
import Mathlib.Algebra.LinearRecurrence
import Mathlib.Algebra.ModEq
Expand Down Expand Up @@ -466,6 +468,7 @@ import Mathlib.Algebra.Order.Field.Power
import Mathlib.Algebra.Order.Field.Subfield
import Mathlib.Algebra.Order.Floor
import Mathlib.Algebra.Order.Floor.Div
import Mathlib.Algebra.Order.Floor.Prime
import Mathlib.Algebra.Order.Group.Abs
import Mathlib.Algebra.Order.Group.Action
import Mathlib.Algebra.Order.Group.Bounds
Expand Down Expand Up @@ -609,6 +612,7 @@ import Mathlib.Algebra.Ring.Defs
import Mathlib.Algebra.Ring.Divisibility.Basic
import Mathlib.Algebra.Ring.Divisibility.Lemmas
import Mathlib.Algebra.Ring.Equiv
import Mathlib.Algebra.Ring.Ext
import Mathlib.Algebra.Ring.Fin
import Mathlib.Algebra.Ring.Hom.Basic
import Mathlib.Algebra.Ring.Hom.Defs
Expand Down Expand Up @@ -841,6 +845,7 @@ import Mathlib.Analysis.Complex.CauchyIntegral
import Mathlib.Analysis.Complex.Circle
import Mathlib.Analysis.Complex.Conformal
import Mathlib.Analysis.Complex.Convex
import Mathlib.Analysis.Complex.Hadamard
import Mathlib.Analysis.Complex.HalfPlane
import Mathlib.Analysis.Complex.Isometry
import Mathlib.Analysis.Complex.Liouville
Expand Down Expand Up @@ -1437,6 +1442,7 @@ import Mathlib.CategoryTheory.Monoidal.Category
import Mathlib.CategoryTheory.Monoidal.Center
import Mathlib.CategoryTheory.Monoidal.CoherenceLemmas
import Mathlib.CategoryTheory.Monoidal.CommMon_
import Mathlib.CategoryTheory.Monoidal.Comon_
import Mathlib.CategoryTheory.Monoidal.Discrete
import Mathlib.CategoryTheory.Monoidal.End
import Mathlib.CategoryTheory.Monoidal.Free.Basic
Expand Down Expand Up @@ -1600,6 +1606,7 @@ import Mathlib.Combinatorics.Additive.AP.Three.Behrend
import Mathlib.Combinatorics.Additive.AP.Three.Defs
import Mathlib.Combinatorics.Additive.ETransform
import Mathlib.Combinatorics.Additive.Energy
import Mathlib.Combinatorics.Additive.FreimanHom
import Mathlib.Combinatorics.Additive.PluenneckeRuzsa
import Mathlib.Combinatorics.Additive.RuzsaCovering
import Mathlib.Combinatorics.Colex
Expand Down Expand Up @@ -3682,7 +3689,7 @@ import Mathlib.Tactic.FunProp.Mor
import Mathlib.Tactic.FunProp.RefinedDiscrTree
import Mathlib.Tactic.FunProp.StateList
import Mathlib.Tactic.FunProp.Theorems
import Mathlib.Tactic.FunProp.ToStd
import Mathlib.Tactic.FunProp.ToBatteries
import Mathlib.Tactic.FunProp.Types
import Mathlib.Tactic.GCongr
import Mathlib.Tactic.GCongr.Core
Expand Down Expand Up @@ -3898,6 +3905,7 @@ import Mathlib.Topology.Bases
import Mathlib.Topology.Basic
import Mathlib.Topology.Bornology.Absorbs
import Mathlib.Topology.Bornology.Basic
import Mathlib.Topology.Bornology.BoundedOperation
import Mathlib.Topology.Bornology.Constructions
import Mathlib.Topology.Bornology.Hom
import Mathlib.Topology.Category.Born
Expand All @@ -3908,6 +3916,7 @@ import Mathlib.Topology.Category.CompHaus.Projective
import Mathlib.Topology.Category.Compactum
import Mathlib.Topology.Category.LightProfinite.Basic
import Mathlib.Topology.Category.LightProfinite.IsLight
import Mathlib.Topology.Category.LightProfinite.Limits
import Mathlib.Topology.Category.Locale
import Mathlib.Topology.Category.Profinite.AsLimit
import Mathlib.Topology.Category.Profinite.Basic
Expand Down
2 changes: 1 addition & 1 deletion Mathlib/Algebra/Algebra/Equiv.lean
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ nonrec theorem map_sum {ι : Type*} (f : ι → A₁) (s : Finset ι) :

theorem map_finsupp_sum {α : Type*} [Zero α] {ι : Type*} (f : ι →₀ α) (g : ι → α → A₁) :
e (f.sum g) = f.sum fun i b => e (g i b) :=
e.map_sum _ _
_root_.map_sum e _ _
#align alg_equiv.map_finsupp_sum AlgEquiv.map_finsupp_sum

-- Porting note: Added [coe] attribute
Expand Down
18 changes: 18 additions & 0 deletions Mathlib/Algebra/Associated.lean
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,9 @@ protected theorem refl [Monoid α] (x : α) : x ~ᵤ x :=
1, by simp⟩
#align associated.refl Associated.refl

protected theorem rfl [Monoid α] {x : α} : x ~ᵤ x :=
.refl x

instance [Monoid α] : IsRefl α Associated :=
⟨Associated.refl⟩

Expand Down Expand Up @@ -561,6 +564,9 @@ protected theorem Associated.dvd [Monoid α] {a b : α} : a ~ᵤ b → a ∣ b :
⟨u, hu.symm⟩
#align associated.dvd Associated.dvd

protected theorem Associated.dvd' [Monoid α] {a b : α} (h : a ~ᵤ b) : b ∣ a :=
h.symm.dvd

protected theorem Associated.dvd_dvd [Monoid α] {a b : α} (h : a ~ᵤ b) : a ∣ b ∧ b ∣ a :=
⟨h.dvd, h.symm.dvd⟩
#align associated.dvd_dvd Associated.dvd_dvd
Expand Down Expand Up @@ -608,6 +614,18 @@ theorem Associated.ne_zero_iff [MonoidWithZero α] {a b : α} (h : a ~ᵤ b) : a
not_congr h.eq_zero_iff
#align associated.ne_zero_iff Associated.ne_zero_iff

theorem Associated.neg_left [Monoid α] [HasDistribNeg α] {a b : α} (h : Associated a b) :
Associated (-a) b :=
let ⟨u, hu⟩ := h; ⟨-u, by simp [hu]⟩

theorem Associated.neg_right [Monoid α] [HasDistribNeg α] {a b : α} (h : Associated a b) :
Associated a (-b) :=
h.symm.neg_left.symm

theorem Associated.neg_neg [Monoid α] [HasDistribNeg α] {a b : α} (h : Associated a b) :
Associated (-a) (-b) :=
h.neg_left.neg_right

protected theorem Associated.prime [CommMonoidWithZero α] {p q : α} (h : p ~ᵤ q) (hp : Prime p) :
Prime q :=
⟨h.ne_zero_iff.1 hp.ne_zero,
Expand Down
2 changes: 1 addition & 1 deletion Mathlib/Algebra/BigOperators/List/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ If desired, we could add a class stating that `default = 0`.

/-- This relies on `default ℕ = 0`. -/
theorem headI_add_tail_sum (L : List ℕ) : L.headI + L.tail.sum = L.sum := by
cases L <;> simp; rfl
cases L <;> simp
#align list.head_add_tail_sum List.headI_add_tail_sum

/-- This relies on `default ℕ = 0`. -/
Expand Down
3 changes: 1 addition & 2 deletions Mathlib/Algebra/Category/AlgebraCat/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -190,8 +190,7 @@ def adj : free.{u} R ⊣ forget (AlgebraCat.{u} R) :=
rfl }
#align Algebra.adj AlgebraCat.adj

instance : IsRightAdjoint (forget (AlgebraCat.{u} R)) :=
⟨_, adj R⟩
instance : (forget (AlgebraCat.{u} R)).IsRightAdjoint := (adj R).isRightAdjoint

end AlgebraCat

Expand Down
16 changes: 8 additions & 8 deletions Mathlib/Algebra/Category/GroupCat/Adjunctions.lean
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ def adj : free ⊣ forget AddCommGroupCat.{u} :=
apply FreeAbelianGroup.lift_comp }
#align AddCommGroup.adj AddCommGroupCat.adj

instance : IsRightAdjoint (forget AddCommGroupCat.{u}) :=
⟨_, adj⟩
instance : (forget AddCommGroupCat.{u}).IsRightAdjoint :=
⟨_, adj

/-- As an example, we now give a high-powered proof that
the monomorphisms in `AddCommGroup` are just the injective functions.
Expand Down Expand Up @@ -127,8 +127,8 @@ def adj : free ⊣ forget GroupCat.{u} :=
apply FreeGroup.lift.of }
#align Group.adj GroupCat.adj

instance : IsRightAdjoint (forget GroupCat.{u}) :=
⟨_, adj⟩
instance : (forget GroupCat.{u}).IsRightAdjoint :=
⟨_, adj

end GroupCat

Expand Down Expand Up @@ -196,8 +196,8 @@ def GroupCat.forget₂MonAdj : forget₂ GroupCat MonCat ⊣ MonCat.units.{u} wh
homEquiv_counit := MonoidHom.ext fun _ => rfl
#align Group.forget₂_Mon_adj GroupCat.forget₂MonAdj

instance : IsRightAdjoint MonCat.units.{u} :=
⟨_, GroupCat.forget₂MonAdj⟩
instance : MonCat.units.{u}.IsRightAdjoint :=
⟨_, GroupCat.forget₂MonAdj

/-- The functor taking a monoid to its subgroup of units. -/
@[simps]
Expand Down Expand Up @@ -225,5 +225,5 @@ def CommGroupCat.forget₂CommMonAdj : forget₂ CommGroupCat CommMonCat ⊣ Com
homEquiv_counit := MonoidHom.ext fun _ => rfl
#align CommGroup.forget₂_CommMon_adj CommGroupCat.forget₂CommMonAdj

instance : IsRightAdjoint CommMonCat.units.{u} :=
⟨_, CommGroupCat.forget₂CommMonAdj⟩
instance : CommMonCat.units.{u}.IsRightAdjoint :=
⟨_, CommGroupCat.forget₂CommMonAdj
3 changes: 1 addition & 2 deletions Mathlib/Algebra/Category/GroupCat/ZModuleEquivalence.lean
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ set_option linter.uppercaseLean3 false in
#align Module.forget₂_AddCommGroup_ess_surj ModuleCat.forget₂_addCommGroupCat_essSurj

noncomputable instance forget₂AddCommGroupIsEquivalence :
(forget₂ (ModuleCat ℤ) AddCommGroupCat.{u}).IsEquivalence :=
Functor.IsEquivalence.ofFullyFaithfullyEssSurj (forget₂ (ModuleCat ℤ) AddCommGroupCat)
(forget₂ (ModuleCat ℤ) AddCommGroupCat.{u}).IsEquivalence where
set_option linter.uppercaseLean3 false in
#align Module.forget₂_AddCommGroup_is_equivalence ModuleCat.forget₂AddCommGroupIsEquivalence

Expand Down
4 changes: 2 additions & 2 deletions Mathlib/Algebra/Category/ModuleCat/Adjunctions.lean
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ def adj : free R ⊣ forget (ModuleCat.{u} R) :=
(Finsupp.sum_mapDomain_index_addMonoidHom fun y => (smulAddHom R M).flip (g y)).symm }
#align Module.adj ModuleCat.adj

instance : IsRightAdjoint (forget (ModuleCat.{u} R)) :=
⟨_, adj R
instance : (forget (ModuleCat.{u} R)).IsRightAdjoint :=
(adj R).isRightAdjoint

end

Expand Down
39 changes: 29 additions & 10 deletions Mathlib/Algebra/Category/ModuleCat/ChangeOfRings.lean
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jujian Zhang
-/
import Mathlib.Algebra.Category.ModuleCat.EpiMono
import Mathlib.Algebra.Category.ModuleCat.Colimits
import Mathlib.Algebra.Category.ModuleCat.Limits
import Mathlib.RingTheory.TensorProduct.Basic

Expand Down Expand Up @@ -242,8 +243,10 @@ abbrev restrictScalarsComp := restrictScalarsComp'.{v} f g _ rfl

end

instance restrictScalarsIsEquivalenceOfRingEquiv {R S} [Ring R] [Ring S] (e : R ≃+* S) :
(ModuleCat.restrictScalars e.toRingHom).IsEquivalence where
/-- The equivalence of categories `ModuleCat S ≌ ModuleCat R` induced by `e : R ≃+* S`. -/
def restrictScalarsEquivalenceOfRingEquiv {R S} [Ring R] [Ring S] (e : R ≃+* S) :
ModuleCat S ≌ ModuleCat R where
functor := ModuleCat.restrictScalars e.toRingHom
inverse := ModuleCat.restrictScalars e.symm
unitIso := NatIso.ofComponents (fun M ↦ LinearEquiv.toModuleIso'
{ __ := AddEquiv.refl M
Expand All @@ -253,6 +256,10 @@ instance restrictScalarsIsEquivalenceOfRingEquiv {R S} [Ring R] [Ring S] (e : R
map_smul' := fun r m ↦ congr_arg (· • (_ : M)) (e.left_inv r)}) (by intros; rfl)
functor_unitIso_comp := by intros; rfl

instance restrictScalars_isEquivalence_of_ringEquiv {R S} [Ring R] [Ring S] (e : R ≃+* S) :
(ModuleCat.restrictScalars e.toRingHom).IsEquivalence :=
(restrictScalarsEquivalenceOfRingEquiv e).isEquivalence_functor

open TensorProduct

variable {R : Type u₁} {S : Type u₂} [CommRing R] [CommRing S] (f : R →+* S)
Expand Down Expand Up @@ -612,12 +619,12 @@ def restrictCoextendScalarsAdj {R : Type u₁} {S : Type u₂} [Ring R] [Ring S]
#align category_theory.Module.restrict_coextend_scalars_adj ModuleCat.restrictCoextendScalarsAdj

instance {R : Type u₁} {S : Type u₂} [Ring R] [Ring S] (f : R →+* S) :
CategoryTheory.IsLeftAdjoint (restrictScalars f) :=
⟨_, restrictCoextendScalarsAdj f
(restrictScalars f).IsLeftAdjoint :=
(restrictCoextendScalarsAdj f).isLeftAdjoint

instance {R : Type u₁} {S : Type u₂} [Ring R] [Ring S] (f : R →+* S) :
CategoryTheory.IsRightAdjoint (coextendScalars f) :=
⟨_, restrictCoextendScalarsAdj f
(coextendScalars f).IsRightAdjoint :=
(restrictCoextendScalarsAdj f).isRightAdjoint

namespace ExtendRestrictScalarsAdj

Expand Down Expand Up @@ -851,12 +858,12 @@ def extendRestrictScalarsAdj {R : Type u₁} {S : Type u₂} [CommRing R] [CommR
#align category_theory.Module.extend_restrict_scalars_adj ModuleCat.extendRestrictScalarsAdj

instance {R : Type u₁} {S : Type u₂} [CommRing R] [CommRing S] (f : R →+* S) :
CategoryTheory.IsLeftAdjoint (extendScalars f) :=
⟨_, extendRestrictScalarsAdj f
(extendScalars f).IsLeftAdjoint :=
(extendRestrictScalarsAdj f).isLeftAdjoint

instance {R : Type u₁} {S : Type u₂} [CommRing R] [CommRing S] (f : R →+* S) :
CategoryTheory.IsRightAdjoint (restrictScalars f) :=
⟨_, extendRestrictScalarsAdj f
(restrictScalars f).IsRightAdjoint :=
(extendRestrictScalarsAdj f).isRightAdjoint

noncomputable instance preservesLimitRestrictScalars
{R : Type*} {S : Type*} [Ring R] [Ring S] (f : R →+* S) {J : Type*} [Category J]
Expand All @@ -867,4 +874,16 @@ noncomputable instance preservesLimitRestrictScalars
have hc' := isLimitOfPreserves (forget₂ _ AddCommGroupCat) hc
exact isLimitOfReflects (forget₂ _ AddCommGroupCat) hc'⟩

instance preservesColimitRestrictScalars {R S : Type*} [Ring R] [Ring S]
(f : R →+* S) {J : Type*} [Category J] (F : J ⥤ ModuleCat.{v} S)
[HasColimit (F ⋙ forget₂ _ AddCommGroupCat)] :
PreservesColimit F (ModuleCat.restrictScalars.{v} f) := by
have : HasColimit ((F ⋙ restrictScalars f) ⋙ forget₂ (ModuleCat R) AddCommGroupCat) :=
inferInstanceAs (HasColimit (F ⋙ forget₂ _ AddCommGroupCat))
apply preservesColimitOfPreservesColimitCocone (HasColimit.isColimitColimitCocone F)
apply isColimitOfReflects (forget₂ _ AddCommGroupCat)
apply isColimitOfPreserves (forget₂ (ModuleCat.{v} S) AddCommGroupCat.{v})
exact HasColimit.isColimitColimitCocone F


end ModuleCat
7 changes: 7 additions & 0 deletions Mathlib/Algebra/Category/ModuleCat/Colimits.lean
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,20 @@ instance : HasColimit F := ⟨_, isColimitColimitCocone F⟩
noncomputable instance : PreservesColimit F (forget₂ _ AddCommGroupCat) :=
preservesColimitOfPreservesColimitCocone (isColimitColimitCocone F) (colimit.isColimit _)

noncomputable instance reflectsColimit :
ReflectsColimit F (forget₂ (ModuleCat.{w'} R) AddCommGroupCat) :=
reflectsColimitOfReflectsIsomorphisms _ _

end HasColimit

variable (J R)

instance hasColimitsOfShape [HasColimitsOfShape J AddCommGroupCat.{w'}] :
HasColimitsOfShape J (ModuleCat.{w'} R) where

noncomputable instance reflectsColimitsOfShape [HasColimitsOfShape J AddCommGroupCat.{w'}] :
ReflectsColimitsOfShape J (forget₂ (ModuleCat.{w'} R) AddCommGroupCat) where

instance hasColimitsOfSize [HasColimitsOfSize.{v, u} AddCommGroupCat.{w'}] :
HasColimitsOfSize.{v, u} (ModuleCat.{w'} R) where

Expand Down
7 changes: 3 additions & 4 deletions Mathlib/Algebra/Category/ModuleCat/Monoidal/Closed.lean
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,15 @@ set_option linter.uppercaseLean3 false in

instance : MonoidalClosed (ModuleCat.{u} R) where
closed M :=
{ isAdj :=
{ right := (linearCoyoneda R (ModuleCat.{u} R)).obj (op M)
adj := Adjunction.mkOfHomEquiv
{ rightAdj := (linearCoyoneda R (ModuleCat.{u} R)).obj (op M)
adj := Adjunction.mkOfHomEquiv
{ homEquiv := fun N P => monoidalClosedHomEquiv M N P
-- Porting note: this proof was automatic in mathlib3
homEquiv_naturality_left_symm := by
intros
apply TensorProduct.ext'
intro m n
rfl } } }
rfl } }

theorem ihom_map_apply {M N P : ModuleCat.{u} R} (f : N ⟶ P) (g : ModuleCat.of R (M ⟶ N)) :
(ihom M).map f g = g ≫ f :=
Expand Down
Loading

0 comments on commit 7e8a9aa

Please sign in to comment.