Zulip Chat Archive
Stream: general
Topic: implicit arguments, and `ring`
Scott Morrison (Sep 29 2018 at 11:13):
Hi @Mario Carneiro, I noticed an unfortunate feature of ring
.
Scott Morrison (Sep 29 2018 at 11:13):
I'd got stuck doing this:
example (x y : ℕ) (h : x ^ 2 + 3 * y ^ 2 = 4) : false := begin ring at h, simp at h, ring at h, simp at h, -- ... end
Scott Morrison (Sep 29 2018 at 11:14):
where it looks like the goal isn't changing.
Scott Morrison (Sep 29 2018 at 11:14):
It just says
x y : ℕ, h : x ^ 2 + 3 * y ^ 2 = 4 ⊢ false
Scott Morrison (Sep 29 2018 at 11:14):
but with pp.all true, you can see if flipping back and forth:
Mario Carneiro (Sep 29 2018 at 11:14):
You shouldn't use ring
nonterminally
Mario Carneiro (Sep 29 2018 at 11:14):
at least not automatically (i.e. in tidy
)
Mario Carneiro (Sep 29 2018 at 11:15):
if it doesn't close the goal, assume it failed
Scott Morrison (Sep 29 2018 at 11:15):
Yes, I know, but I want to for a moment anyway. :-)
Scott Morrison (Sep 29 2018 at 11:15):
Ah, okay. :-)
Scott Morrison (Sep 29 2018 at 11:15):
But that takes all the fun out of it.
Mario Carneiro (Sep 29 2018 at 11:15):
ring
rewrites the goal into sum-of-products form for ease of reading when it fails
Scott Morrison (Sep 29 2018 at 11:15):
Because sometimes ring at *, exfalso, linarith
can get stuff done.
Mario Carneiro (Sep 29 2018 at 11:15):
this form disagrees with simp normal form in some places
Scott Morrison (Sep 29 2018 at 11:16):
The problem I was having here is actually just in the implicit arguments flipping back and forth.
Scott Morrison (Sep 29 2018 at 11:16):
The expression "itself" is not being changed by either simp
or ring
.
Mario Carneiro (Sep 29 2018 at 11:16):
wait, maybe I don't understand then
Mario Carneiro (Sep 29 2018 at 11:16):
what is changing?
Scott Morrison (Sep 29 2018 at 11:17):
With usual pretty printing, neither simp
nor ring
do anything, and the goal just looks like
x y : ℕ, h : x ^ 2 + 3 * y ^ 2 = 4 ⊢ false
Scott Morrison (Sep 29 2018 at 11:17):
but with pp.all we get:
Scott Morrison (Sep 29 2018 at 11:17):
x y : nat, h : @eq.{1} nat (@has_add.add.{0} nat nat.has_add (@has_pow.pow.{0 0} nat nat nat.has_pow x (@bit0.{0} nat nat.has_add (@has_one.one.{0} nat nat.has_one))) (@has_mul.mul.{0} nat (@mul_zero_class.to_has_mul.{0} nat (@semiring.to_mul_zero_class.{0} nat (@comm_semiring.to_semiring.{0} nat (@canonically_ordered_comm_semiring.to_comm_semiring.{0} nat nat.canonically_ordered_comm_semiring)))) (@bit1.{0} nat nat.has_one nat.has_add (@has_one.one.{0} nat nat.has_one)) (@has_pow.pow.{0 0} nat nat nat.has_pow y (@bit0.{0} nat nat.has_add (@has_one.one.{0} nat nat.has_one))))) (@bit0.{0} nat nat.has_add (@bit0.{0} nat nat.has_add (@has_one.one.{0} nat nat.has_one))) ⊢ false
Scott Morrison (Sep 29 2018 at 11:17):
after the simp
Mario Carneiro (Sep 29 2018 at 11:17):
oh, it's nat.pow isn't it
Scott Morrison (Sep 29 2018 at 11:17):
and then
Scott Morrison (Sep 29 2018 at 11:17):
x y : nat, h : @eq.{1} nat (@has_add.add.{0} nat nat.has_add (@has_pow.pow.{0 0} nat nat (@monoid.has_pow.{0} nat (@semiring.to_monoid.{0} nat (@comm_semiring.to_semiring.{0} nat (@canonically_ordered_comm_semiring.to_comm_semiring.{0} nat nat.canonically_ordered_comm_semiring)))) x (@bit0.{0} nat nat.has_add (@has_one.one.{0} nat nat.has_one))) (@has_mul.mul.{0} nat (@mul_zero_class.to_has_mul.{0} nat (@semiring.to_mul_zero_class.{0} nat (@comm_semiring.to_semiring.{0} nat (@canonically_ordered_comm_semiring.to_comm_semiring.{0} nat nat.canonically_ordered_comm_semiring)))) (@bit1.{0} nat nat.has_one nat.has_add (@has_one.one.{0} nat nat.has_one)) (@has_pow.pow.{0 0} nat nat (@monoid.has_pow.{0} nat (@semiring.to_monoid.{0} nat (@comm_semiring.to_semiring.{0} nat (@canonically_ordered_comm_semiring.to_comm_semiring.{0} nat nat.canonically_ordered_comm_semiring)))) y (@bit0.{0} nat nat.has_add (@has_one.one.{0} nat nat.has_one))))) (@bit0.{0} nat nat.has_add (@bit0.{0} nat nat.has_add (@has_one.one.{0} nat nat.has_one))) ⊢ false
Scott Morrison (Sep 29 2018 at 11:17):
after the ring
Mario Carneiro (Sep 29 2018 at 11:18):
right, ring
prefers monoid powers but that's not simp normal form
Scott Morrison (Sep 29 2018 at 11:18):
Okay, I see.
Scott Morrison (Sep 29 2018 at 11:18):
Nothing to be done, then!
Mario Carneiro (Sep 29 2018 at 11:19):
ring
doesn't make any attempt to be in simp normal form; if you need that you should just call ring, simp
Mario Carneiro (Sep 29 2018 at 11:20):
but even better is to just ignore the pretty failure mode
Kenny Lau (Sep 29 2018 at 11:26):
it's a feature!
Last updated: Dec 20 2023 at 11:08 UTC