Zulip Chat Archive

Stream: maths

Topic: too big for `ring`


Kevin Buzzard (Jul 14 2020 at 11:46):

(y * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - (3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) * (x * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - ((3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) ^ 2 + E.a1 * (3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) * (2 * y + E.a1 * x + E.a3) - E.a2 * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - 2 * x * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3)))) ^ 2 + (2 * y + E.a1 * x + E.a3) * E.a1 * ((3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) ^ 2 + E.a1 * (3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) * (2 * y + E.a1 * x + E.a3) - E.a2 * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - 2 * x * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3)) * (y * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - (3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) * (x * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - ((3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) ^ 2 + E.a1 * (3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) * (2 * y + E.a1 * x + E.a3) - E.a2 * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - 2 * x * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3)))) + (2 * y + E.a1 * x + E.a3) ^ 3 * E.a3 * (y * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - (3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) * (x * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - ((3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) ^ 2 + E.a1 * (3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) * (2 * y + E.a1 * x + E.a3) - E.a2 * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - 2 * x * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3)))) - (((3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) ^ 2 + E.a1 * (3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) * (2 * y + E.a1 * x + E.a3) - E.a2 * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - 2 * x * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3)) ^ 3 + (2 * y + E.a1 * x + E.a3) ^ 2 * E.a2 * ((3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) ^ 2 + E.a1 * (3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) * (2 * y + E.a1 * x + E.a3) - E.a2 * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - 2 * x * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3)) ^ 2 + (2 * y + E.a1 * x + E.a3) ^ 4 * E.a4 * ((3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) ^ 2 + E.a1 * (3 * x ^ 2 + 2 * E.a2 * x + E.a4 - E.a1 * y) * (2 * y + E.a1 * x + E.a3) - E.a2 * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3) - 2 * x * (2 * y + E.a1 * x + E.a3) * (2 * y + E.a1 * x + E.a3)) + (2 * y + E.a1 * x + E.a3) ^ 6 * E.a6) = (y ^ 2 + E.a1 * x * y + E.a3 * y - (x ^ 3 + E.a2 * x ^ 2 + E.a4 * x + E.a6)) * (64 * y ^ 6 + (192 * E.a1 * x + 192 * E.a3) * y ^ 5 + (240 * E.a1 ^ 2 * x ^ 2 + 480 * E.a1 * E.a3 * x + 240 * E.a3 ^ 2) * y ^ 4 + (160 * E.a1 ^ 3 * x ^ 3 + 480 * E.a1 ^ 2 * E.a3 * x ^ 2 + 480 * E.a1 * E.a3 ^ 2 * x + 160 * E.a3 ^ 3) * y ^ 3 + (60 * E.a1 ^ 4 * x ^ 4 + 240 * E.a1 ^ 3 * E.a3 * x ^ 3 + 360 * E.a1 ^ 2 * E.a3 ^ 2 * x ^ 2 + 240 * E.a1 * E.a3 ^ 3 * x + 60 * E.a3 ^ 4) * y ^ 2 + (12 * E.a1 ^ 5 * x ^ 5 + 60 * E.a1 ^ 4 * E.a3 * x ^ 4 + 120 * E.a1 ^ 3 * E.a3 ^ 2 * x ^ 3 + 120 * E.a1 ^ 2 * E.a3 ^ 3 * x ^ 2 + 60 * E.a1 * E.a3 ^ 4 * x + 12 * E.a3 ^ 5) * y + E.a1 ^ 6 * x ^ 6 + 6 * E.a1 ^ 5 * E.a3 * x ^ 5 + 15 * E.a1 ^ 4 * E.a3 ^ 2 * x ^ 4 + 20 * E.a1 ^ 3 * E.a3 ^ 3 * x ^ 3 + 15 * E.a1 ^ 2 * E.a3 ^ 4 * x ^ 2 + 6 * E.a1 * E.a3 ^ 5 * x + E.a3 ^ 6)

This says X = Y; an identity in a ring (here k is a field and x,y, E.a1, E.a2, E.a3, E.a4, E.a6 are elements of k and ring in theory solves it). But ring times out. This is the assertion that if P is a point on an elliptic curve, then 2P is also on the curve. Any tips?

Sebastien Gouezel (Jul 14 2020 at 11:47):

#mwe? :)

Kevin Buzzard (Jul 14 2020 at 11:47):

0=0

Sebastien Gouezel (Jul 14 2020 at 11:48):

If you give a self-contained example that Mario can cut and paste, he will find the performance bottleneck in ring for you and solve it in three minutes. If you don't give the self-contained example, you're on your own :-)

Kevin Buzzard (Jul 14 2020 at 11:49):

aargh

Kevin Buzzard (Jul 14 2020 at 11:49):

I made a MWE and Lean solves it!

Kenny Lau (Jul 14 2020 at 11:50):

then why can't you just use the extracted lemma?

Kevin Buzzard (Jul 14 2020 at 11:50):

no, it's 50-50

import tactic


variables (k : Type) [field k] (a1 a2 a3 a4 a6 x y : k)

example : (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) ^ 2 + (2 * y + a1 * x + a3) * a1 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) * (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) + (2 * y + a1 * x + a3) ^ 3 * a3 * (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) - (((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) ^ 3 + (2 * y + a1 * x + a3) ^ 2 * a2 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) ^ 2 + (2 * y + a1 * x + a3) ^ 4 * a4 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) + (2 * y + a1 * x + a3) ^ 6 * a6) = (y ^ 2 + a1 * x * y + a3 * y - (x ^ 3 + a2 * x ^ 2 + a4 * x + a6)) * (64 * y ^ 6 + (192 * a1 * x + 192 * a3) * y ^ 5 + (240 * a1 ^ 2 * x ^ 2 + 480 * a1 * a3 * x + 240 * a3 ^ 2) * y ^ 4 + (160 * a1 ^ 3 * x ^ 3 + 480 * a1 ^ 2 * a3 * x ^ 2 + 480 * a1 * a3 ^ 2 * x + 160 * a3 ^ 3) * y ^ 3 + (60 * a1 ^ 4 * x ^ 4 + 240 * a1 ^ 3 * a3 * x ^ 3 + 360 * a1 ^ 2 * a3 ^ 2 * x ^ 2 + 240 * a1 * a3 ^ 3 * x + 60 * a3 ^ 4) * y ^ 2 + (12 * a1 ^ 5 * x ^ 5 + 60 * a1 ^ 4 * a3 * x ^ 4 + 120 * a1 ^ 3 * a3 ^ 2 * x ^ 3 + 120 * a1 ^ 2 * a3 ^ 3 * x ^ 2 + 60 * a1 * a3 ^ 4 * x + 12 * a3 ^ 5) * y + a1 ^ 6 * x ^ 6 + 6 * a1 ^ 5 * a3 * x ^ 5 + 15 * a1 ^ 4 * a3 ^ 2 * x ^ 4 + 20 * a1 ^ 3 * a3 ^ 3 * x ^ 3 + 15 * a1 ^ 2 * a3 ^ 4 * x ^ 2 + 6 * a1 * a3 ^ 5 * x + a3 ^ 6)
:= begin
  ring,
end

Rob Lewis (Jul 14 2020 at 11:50):

I should point out #2672 in case Mario takes a look at this. It could be that in disguise here.

Rob Lewis (Jul 14 2020 at 11:50):

(I forgot about the issue myself and never looked into it.)

Kevin Buzzard (Jul 14 2020 at 11:52):

OK so if I cut and paste the above, I get a pretty much guaranteed deterministic time-out. However if I replace ring by sorry and then add ring above, I get "tactic failed: there are no goals to be solved" on the sorry

Kevin Buzzard (Jul 14 2020 at 11:53):

Deleting the sorry of course makes it time out again :rolling_on_the_floor_laughing:

Reid Barton (Jul 14 2020 at 11:54):

does that mean ring succeeds but the kernel is timing out typechecking the resulting term?

Kevin Buzzard (Jul 14 2020 at 11:54):

import tactic


variables (k : Type) [field k] (a1 a2 a3 a4 a6 x y : k)

example : (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) ^ 2 + (2 * y + a1 * x + a3) * a1 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) * (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) + (2 * y + a1 * x + a3) ^ 3 * a3 * (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) - (((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) ^ 3 + (2 * y + a1 * x + a3) ^ 2 * a2 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) ^ 2 + (2 * y + a1 * x + a3) ^ 4 * a4 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) + (2 * y + a1 * x + a3) ^ 6 * a6) = (y ^ 2 + a1 * x * y + a3 * y - (x ^ 3 + a2 * x ^ 2 + a4 * x + a6)) * (64 * y ^ 6 + (192 * a1 * x + 192 * a3) * y ^ 5 + (240 * a1 ^ 2 * x ^ 2 + 480 * a1 * a3 * x + 240 * a3 ^ 2) * y ^ 4 + (160 * a1 ^ 3 * x ^ 3 + 480 * a1 ^ 2 * a3 * x ^ 2 + 480 * a1 * a3 ^ 2 * x + 160 * a3 ^ 3) * y ^ 3 + (60 * a1 ^ 4 * x ^ 4 + 240 * a1 ^ 3 * a3 * x ^ 3 + 360 * a1 ^ 2 * a3 ^ 2 * x ^ 2 + 240 * a1 * a3 ^ 3 * x + 60 * a3 ^ 4) * y ^ 2 + (12 * a1 ^ 5 * x ^ 5 + 60 * a1 ^ 4 * a3 * x ^ 4 + 120 * a1 ^ 3 * a3 ^ 2 * x ^ 3 + 120 * a1 ^ 2 * a3 ^ 3 * x ^ 2 + 60 * a1 * a3 ^ 4 * x + 12 * a3 ^ 5) * y + a1 ^ 6 * x ^ 6 + 6 * a1 ^ 5 * a3 * x ^ 5 + 15 * a1 ^ 4 * a3 ^ 2 * x ^ 4 + 20 * a1 ^ 3 * a3 ^ 3 * x ^ 3 + 15 * a1 ^ 2 * a3 ^ 4 * x ^ 2 + 6 * a1 * a3 ^ 5 * x + a3 ^ 6)
:= begin
  ring,
  sorry, -- tactic failed, there are no goals to be solved
end

Lean challenge -- remove the sorry

Sebastien Gouezel (Jul 14 2020 at 12:03):

It works on my computer. More precisely,

import tactic

set_option profiler true

variables (k : Type) [field k] (a1 a2 a3 a4 a6 x y : k)

lemma foo :
  (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) ^ 2 + (2 * y + a1 * x + a3) * a1 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) * (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) + (2 * y + a1 * x + a3) ^ 3 * a3 * (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) - (((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) ^ 3 + (2 * y + a1 * x + a3) ^ 2 * a2 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) ^ 2 + (2 * y + a1 * x + a3) ^ 4 * a4 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) + (2 * y + a1 * x + a3) ^ 6 * a6) = (y ^ 2 + a1 * x * y + a3 * y - (x ^ 3 + a2 * x ^ 2 + a4 * x + a6)) * (64 * y ^ 6 + (192 * a1 * x + 192 * a3) * y ^ 5 + (240 * a1 ^ 2 * x ^ 2 + 480 * a1 * a3 * x + 240 * a3 ^ 2) * y ^ 4 + (160 * a1 ^ 3 * x ^ 3 + 480 * a1 ^ 2 * a3 * x ^ 2 + 480 * a1 * a3 ^ 2 * x + 160 * a3 ^ 3) * y ^ 3 + (60 * a1 ^ 4 * x ^ 4 + 240 * a1 ^ 3 * a3 * x ^ 3 + 360 * a1 ^ 2 * a3 ^ 2 * x ^ 2 + 240 * a1 * a3 ^ 3 * x + 60 * a3 ^ 4) * y ^ 2 + (12 * a1 ^ 5 * x ^ 5 + 60 * a1 ^ 4 * a3 * x ^ 4 + 120 * a1 ^ 3 * a3 ^ 2 * x ^ 3 + 120 * a1 ^ 2 * a3 ^ 3 * x ^ 2 + 60 * a1 * a3 ^ 4 * x + 12 * a3 ^ 5) * y + a1 ^ 6 * x ^ 6 + 6 * a1 ^ 5 * a3 * x ^ 5 + 15 * a1 ^ 4 * a3 ^ 2 * x ^ 4 + 20 * a1 ^ 3 * a3 ^ 3 * x ^ 3 + 15 * a1 ^ 2 * a3 ^ 4 * x ^ 2 + 6 * a1 * a3 ^ 5 * x + a3 ^ 6)
:= begin
  ring,
end

works, and the profiler says

parsing took 10.3ms
local_homeomorph.lean:16:6
type checking of foo took 0.565ms
local_homeomorph.lean:16:6
decl post-processing of foo took 0.0029ms
local_homeomorph.lean:16:6
elaboration of foo took 9.51s

but once the profiler message appears, there are still 40s more before the orange bar disappears.

Kevin Buzzard (Jul 14 2020 at 12:03):

Oh maybe I need to change my timeoutometer

Sebastien Gouezel (Jul 14 2020 at 12:04):

The timeout is set in my vscode to 300000.

Kevin Buzzard (Jul 14 2020 at 12:04):

mine to 100000

Mario Carneiro (Jul 14 2020 at 12:08):

you know there are line length limits ;P

Mario Carneiro (Jul 14 2020 at 12:09):

it would be great if this example was minimized

Sebastien Gouezel (Jul 14 2020 at 12:10):

Don't you think it's just the size of the question that it problematic, and that this will be hard to minimize without killing the issue?

Mario Carneiro (Jul 14 2020 at 12:11):

Unlikely. The time to run ring should be the majority of the time, if all goes well

Sebastien Gouezel (Jul 14 2020 at 12:14):

The output of #print foo is very cute, but unfortunately it's too long so it's truncated and I can't try to feed it directly as a proof term, to see if the problem comes from the kernel checking the term. Is there a way to get the untruncated term?

Rob Lewis (Jul 14 2020 at 12:16):

It is indeed something going wrong at QED time. The following works fine, using ring to prove the goal and confirming that the proof type checks.

import tactic

open tactic
meta def type_check_proof : tactic unit :=
do t  target,
   (_, pf)  solve_aux t `[ring],
    type_check pf,
   trace "good"

variables (k : Type) [field k] (a1 a2 a3 a4 a6 x y : k)


lemma foo :
  (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) ^ 2 + (2 * y + a1 * x + a3) * a1 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) * (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) + (2 * y + a1 * x + a3) ^ 3 * a3 * (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) - (((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) ^ 3 + (2 * y + a1 * x + a3) ^ 2 * a2 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) ^ 2 + (2 * y + a1 * x + a3) ^ 4 * a4 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) + (2 * y + a1 * x + a3) ^ 6 * a6) = (y ^ 2 + a1 * x * y + a3 * y - (x ^ 3 + a2 * x ^ 2 + a4 * x + a6)) * (64 * y ^ 6 + (192 * a1 * x + 192 * a3) * y ^ 5 + (240 * a1 ^ 2 * x ^ 2 + 480 * a1 * a3 * x + 240 * a3 ^ 2) * y ^ 4 + (160 * a1 ^ 3 * x ^ 3 + 480 * a1 ^ 2 * a3 * x ^ 2 + 480 * a1 * a3 ^ 2 * x + 160 * a3 ^ 3) * y ^ 3 + (60 * a1 ^ 4 * x ^ 4 + 240 * a1 ^ 3 * a3 * x ^ 3 + 360 * a1 ^ 2 * a3 ^ 2 * x ^ 2 + 240 * a1 * a3 ^ 3 * x + 60 * a3 ^ 4) * y ^ 2 + (12 * a1 ^ 5 * x ^ 5 + 60 * a1 ^ 4 * a3 * x ^ 4 + 120 * a1 ^ 3 * a3 ^ 2 * x ^ 3 + 120 * a1 ^ 2 * a3 ^ 3 * x ^ 2 + 60 * a1 * a3 ^ 4 * x + 12 * a3 ^ 5) * y + a1 ^ 6 * x ^ 6 + 6 * a1 ^ 5 * a3 * x ^ 5 + 15 * a1 ^ 4 * a3 ^ 2 * x ^ 4 + 20 * a1 ^ 3 * a3 ^ 3 * x ^ 3 + 15 * a1 ^ 2 * a3 ^ 4 * x ^ 2 + 6 * a1 * a3 ^ 5 * x + a3 ^ 6)
:= begin
   type_check_proof,
end

Mario Carneiro (Jul 14 2020 at 12:17):

does it work if you try to create an auxiliary definition using the term that ring creates (e.g. using abstract)?

Rob Lewis (Jul 14 2020 at 12:17):

@Sebastien Gouezel you can trace pf in the code I wrote above to see the full proof term.

Rob Lewis (Jul 14 2020 at 12:20):

Indeed, this works (slowly).

import tactic

open tactic
meta def type_check_proof : tactic unit :=
do t  target,
   (_, pf)  solve_aux t `[ring],
    type_check pf,
    tp  infer_type pf,
    trace tp,
    is_def_eq tp t,
   abstract (exact pf),
   trace "good"


variables (k : Type) [field k] (a1 a2 a3 a4 a6 x y : k)

lemma foo :
  (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) ^ 2 + (2 * y + a1 * x + a3) * a1 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) * (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) + (2 * y + a1 * x + a3) ^ 3 * a3 * (y * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)))) - (((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) ^ 3 + (2 * y + a1 * x + a3) ^ 2 * a2 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) ^ 2 + (2 * y + a1 * x + a3) ^ 4 * a4 * ((3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) ^ 2 + a1 * (3 * x ^ 2 + 2 * a2 * x + a4 - a1 * y) * (2 * y + a1 * x + a3) - a2 * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3) - 2 * x * (2 * y + a1 * x + a3) * (2 * y + a1 * x + a3)) + (2 * y + a1 * x + a3) ^ 6 * a6) = (y ^ 2 + a1 * x * y + a3 * y - (x ^ 3 + a2 * x ^ 2 + a4 * x + a6)) * (64 * y ^ 6 + (192 * a1 * x + 192 * a3) * y ^ 5 + (240 * a1 ^ 2 * x ^ 2 + 480 * a1 * a3 * x + 240 * a3 ^ 2) * y ^ 4 + (160 * a1 ^ 3 * x ^ 3 + 480 * a1 ^ 2 * a3 * x ^ 2 + 480 * a1 * a3 ^ 2 * x + 160 * a3 ^ 3) * y ^ 3 + (60 * a1 ^ 4 * x ^ 4 + 240 * a1 ^ 3 * a3 * x ^ 3 + 360 * a1 ^ 2 * a3 ^ 2 * x ^ 2 + 240 * a1 * a3 ^ 3 * x + 60 * a3 ^ 4) * y ^ 2 + (12 * a1 ^ 5 * x ^ 5 + 60 * a1 ^ 4 * a3 * x ^ 4 + 120 * a1 ^ 3 * a3 ^ 2 * x ^ 3 + 120 * a1 ^ 2 * a3 ^ 3 * x ^ 2 + 60 * a1 * a3 ^ 4 * x + 12 * a3 ^ 5) * y + a1 ^ 6 * x ^ 6 + 6 * a1 ^ 5 * a3 * x ^ 5 + 15 * a1 ^ 4 * a3 ^ 2 * x ^ 4 + 20 * a1 ^ 3 * a3 ^ 3 * x ^ 3 + 15 * a1 ^ 2 * a3 ^ 4 * x ^ 2 + 6 * a1 * a3 ^ 5 * x + a3 ^ 6)
:= begin
  type_check_proof,
end

Sebastien Gouezel (Jul 14 2020 at 12:20):

Yes, but the output I get when adding the line trace pf is truncated, ending with

           )
         y
         1
         )
      
      
      
      
      )).trans

Rob Lewis (Jul 14 2020 at 12:21):

Oh. set_option pp.max_depth 10000 or something?

Sebastien Gouezel (Jul 14 2020 at 12:31):

Thanks. It turned out to be pp.max_steps. But the term is just too big (I just got excessive memory consumption, that I hadn't seen in a long time since I have reasonable defaults)...

Mario Carneiro (Jul 14 2020 at 13:01):

So the title should be "ring too big for lean" instead?

Reid Barton (Jul 14 2020 at 13:31):

one cheap way to "minimize" is stuff like

  have : a1 = 0 := sorry,
  subst a1,
  simp only [add_zero, zero_add, mul_zero, zero_mul],
  ring,

Last updated: Dec 20 2023 at 11:08 UTC