Zulip Chat Archive

Stream: maths

Topic: nonlinarith


Kevin Buzzard (Jan 28 2019 at 23:15):

import data.real.basic

example (a b c d A B C D : ) (ha : 0  a) (hb : 0  b) (hc : 0  c) (hd : 0  d)
(hA : a  A) (hB : b  B) (hC : c  C) (hD : d  D) :
a * b + c * d  A * B + C * D := sorry

How am I supposed to be solving goals like this? Is there a tactic that Coq has which can just do this? I think that if I were to ask an undergrad they'd say it was "obvious".

Kevin Buzzard (Jan 28 2019 at 23:16):

[in my use case a,b,c,d are all of the form |x|]

Kevin Buzzard (Jan 28 2019 at 23:16):

import data.real.basic

example (a b c d A B C D : ) (ha : 0  a) (hb : 0  b) (hc : 0  c) (hd : 0  d)
(hA : a  A) (hB : b  B) (hC : c  C) (hD : d  D) :
a * b + c * d  A * B + C * D :=
calc
a * b + c * d  A * b + c * d : add_le_add_right (mul_le_mul_of_nonneg_right hA hb) _
...            A * B + c * d : add_le_add_right (mul_le_mul_of_nonneg_left hB (le_trans ha hA)) _
...            A * B + C * d : add_le_add_left (mul_le_mul_of_nonneg_right hC hd) _
...            A * B + C * D : add_le_add_left (mul_le_mul_of_nonneg_left hD (le_trans hc hC)) _

I'm assuming this is golfable...

Kevin Buzzard (Jan 28 2019 at 23:17):

I just tried goofing around with apply_rules but I'm a first-timer.

Kevin Buzzard (Jan 28 2019 at 23:18):

Does mono help?

Reid Barton (Jan 28 2019 at 23:28):

by mono* with [0 ≤ A, 0 ≤ C]; linarith

Reid Barton (Jan 28 2019 at 23:29):

actually it works even without the with part

Reid Barton (Jan 28 2019 at 23:30):

Kind of weird that mono can't deduce 0 ≤ A from 0 ≤ a and a ≤ A itself

Kevin Buzzard (Jan 28 2019 at 23:32):

Right -- I was trying

attribute [mono_rules] add_le_add_right add_le_add_left
mul_le_mul_of_nonneg_right mul_le_mul_of_nonneg_left le_trans

and then by apply_rules mono_rules but the le_trans makes it loop, and without it it can't do it.

Kevin Buzzard (Jan 28 2019 at 23:35):

example (a b c d A B C D : )
(hA : abs a  A) (hB : abs b  B) (hC : abs c  C) (hD : abs d  D) :
abs a * abs b + abs c * abs d  A * B + C * D := sorry

Maybe this one is harder. How do I insert the abs into the picture? Note abs_nonneg : ∀ (a : ?M_1), abs a ≥ 0

Kevin Buzzard (Jan 28 2019 at 23:39):

import data.real.basic tactic.linarith

example (a b c d A B C D : )
(hA : abs a  A) (hB : abs b  B) (hC : abs c  C) (hD : abs d  D) :
abs a * abs b + abs c * abs d  A * B + C * D := begin
  have : abs a  0 := abs_nonneg _,
  have : abs b  0 := abs_nonneg _,
  have : abs c  0 := abs_nonneg _,
  have : abs d  0 := abs_nonneg _,
  mono*;linarith
end

Is there a better way of inserting abs_nonneg into the picture?

Reid Barton (Jan 28 2019 at 23:39):

That's basically what I was about to write except with have := abs_nonneg a, etc.

Kevin Buzzard (Jan 28 2019 at 23:40):

Still, this is much better than what I had!

Reid Barton (Jan 28 2019 at 23:40):

I don't know if we have enough smarts to figure out to prove 0 <= A from the assumption abs a <= A and the lemma 0 <= abs a

Kevin Buzzard (Jan 28 2019 at 23:40):

by undergrad

Kevin Buzzard (Jan 28 2019 at 23:42):

Thanks Reid, by the way! The more my code looks like how a maths undergraduate thinks, the better it is. I don't think they're thinking about mul_le_mul_of_nonneg_right, at least not explicitly.

Kevin Buzzard (Jan 28 2019 at 23:42):

It's just "obvious".

Reid Barton (Jan 28 2019 at 23:42):

I had never tried out mono before so this was also enlightening for me

Kevin Buzzard (Jan 28 2019 at 23:42):

Well thanks @Patrick Massot too.

Kevin Buzzard (Jan 28 2019 at 23:44):

https://leanprover.zulipchat.com/#narrow/stream/116395-maths/topic/linarith.20failure/near/157061326

Johan Commelin (Jan 29 2019 at 07:24):

@Kevin Buzzard Can't you ask some former IMO participant to write a tactic that solves IMO-style inequalities? There are probably some among Imperial's first and second year students...
It would be cool if we have all the mean inequalities, and Chebyshev, Jensen, etc...

Kevin Buzzard (Jan 29 2019 at 07:44):

Yeah, we should tell Rob to add them to linarith :-) I am not sure how far you can get knowing all of those standard "IMO syllabus" inequalities, it always seemed to me that even if you knew them all you still needed more ideas to prove a random IMO inequality.


Last updated: Dec 20 2023 at 11:08 UTC