Zulip Chat Archive

Stream: mathlib4

Topic: field_simp weirdness


Michael Stoll (Dec 26 2023 at 21:52):

Compare

import Mathlib.Tactic.FieldSimp

variable {F} [Field F]

example (a b c : F) (h : c  0) (h' : a = b) : -a / c = -c⁻¹ * b := by
  field_simp -- ⊢ a = b
  sorry

with

import Mathlib.Tactic.FieldSimp
import Mathlib.Algebra.Field.Basic -- extra import

variable {F} [Field F]

example (a b c : F) (h : c  0) (h' : a = b) : -a / c = -c⁻¹ * b := by
  field_simp -- ⊢ a = b ∨ c = 0
  sorry

A possible difference: in the first case #synth NoZeroDivisors F says GroupWithZero.noZeroDivisors, but in the second case, it is IsDomain.to_noZeroDivisors F. Still, it is completely unclear to me how this difference would affect field_simp. In any case, I would think that the second behavior does not conform to specifications.

Yury G. Kudryashov (Dec 27 2023 at 01:59):

Unfortunately, field_simp generates code with lots of "aux" lemmas from other files which makes it harder to inspect it.

Mario Carneiro (Dec 27 2023 at 02:03):

those aux lemmas are from simp, they are eq versions of iff lemmas marked @[simp]

Yury G. Kudryashov (Dec 27 2023 at 02:04):

It looks like with Field.Basic, it multiplies by the denominators, then gets a * c = b * c and simplifies it to a = b ∨ c = 0.

Yury G. Kudryashov (Dec 27 2023 at 02:05):

Without Field.Basic, it goes along a different path because, e.g., docs#neg_div' is not available.

Yury G. Kudryashov (Dec 27 2023 at 02:06):

field_simp [*] solves the goal in both cases.

Michael Stoll (Dec 27 2023 at 10:28):

Maybe field_simp should check whether it "knows" that c ≠ 0 when simplifying a * c = b * c? After all, c ≠ 0 is available in the context in the example above.

Ruben Van de Velde (Dec 27 2023 at 10:34):

That's what field_simp [hc] is for

Michael Stoll (Dec 27 2023 at 10:39):

In the example, c occurs in the denominator, and field_simp uses h from the context without being specifically asked to do so to clear denominators (which is, as far as I understand, the expected behavior). So it is natural to expect that it would continue to use h in later simplification steps. (In particular seeing that it works without the extra import...)

Eric Rodriguez (Dec 27 2023 at 11:54):

I thought field_simp didn't inspect the context unless asked to?

Yury G. Kudryashov (Dec 27 2023 at 15:01):

AFAIR, field_simp uses positivity to discharge side goals.

Yury G. Kudryashov (Dec 27 2023 at 15:02):

So, if c ≠ 0 appears as a side goal, then field_simp can discharge it. However, if c = 0 appears as a part of the simplified goal, then field_simp can't use c ≠ 0 to simplify it.

Ruben Van de Velde (Dec 27 2023 at 15:35):

Aha!

Eric Rodriguez (Dec 27 2023 at 16:45):

Maybe then some lemmas that state assumptions using or should be removed from field simp's default set then!

Eric Rodriguez (Dec 27 2023 at 16:46):

I guess the issue is that sometimes they'll be resolved with or_true if its something like a term that is passed in but not findable by positivity

Eric Rodriguez (Dec 27 2023 at 16:46):

So it'll break a fair few proofs


Last updated: May 02 2025 at 03:31 UTC