Zulip Chat Archive

Stream: new members

Topic: Tactic strength pairs: correctness and completeness


Isak Colboubrani (Apr 08 2025 at 17:35):

Are these two claims accurate? Please help me refute them with concrete counterexamples, or let me know if you believe they are unfalsifiable.

Claim 1. In each of the following pairs, the first tactic is strictly stronger than the second. That is, any goal closed by the second tactic is also closed by the first (and not vice versa; additionally, to exclude trivial cases, both tactics in each pair must be capable of closing some goals, and both must be zero-argument).

  • (aesop, congr)
  • (aesop, simp_all)
  • (module, abel)
  • (nlinarith, linarith)
  • (tauto, itauto)
  • (trivial, assumption)
  • (trivial, contradition)
  • (trivial, decide)
  • (trivial, rfl)

Claim 2. The list is complete, meaning that no other tactic pairs exhibit this property.

Aaron Liu (Apr 08 2025 at 18:04):

Claim 1 is false, because you can poison tactics.

Aaron Liu (Apr 08 2025 at 18:04):

Here's an example where I poison trivial: #Lean for teaching > Game about finishing tactics @ 💬

Aaron Liu (Apr 08 2025 at 18:09):

Claim 2 is probably false, I found (solve_by_elim, assumption)

Aaron Liu (Apr 08 2025 at 18:12):

There's also (norm_num, norm_num1) and other similar pairs.

Aaron Liu (Apr 08 2025 at 18:14):

Also (sorry, *)

Isak Colboubrani (Apr 08 2025 at 18:18):

Hehe, I was considering adding a restriction "excluding examples resulting from Aaron's clever 'recursion depth' poisoning trick," but you beat me to it! :) Consider that restriction hereby added.

Isak Colboubrani (Apr 08 2025 at 18:37):

Another restriction to make it more interesting: "strength" achieved from using the sorryAx axiom is not counted :)

Isak Colboubrani (Apr 08 2025 at 18:43):

@Aaron Liu (solve_by_elim, assumption) is a nice addition to the list. Nice find—thank you! What pairs, or class of pairs, are you referring to that are similar to (norm_num, norm_num1)?

Aaron Liu (Apr 08 2025 at 19:09):

Isak Colboubrani said:

What pairs, or class of pairs, are you referring to that are similar to (norm_num, norm_num1)?

(abel, abel1)
(ac_nf, ac_nf0)
(rfl, eq_refl)
(norm_cast, norm_cast0)
(norm_num, norm_num1)
(ring, ring1)
(ring!, ring1!)
etc.

Aaron Liu (Apr 08 2025 at 19:10):

Now that I have these written down, I think some of these pairs don't close strictly more goals.

Isak Colboubrani (Apr 08 2025 at 19:17):

@Aaron Liu Thanks! If we omit the ones you're uncertain about, what remains?

Aaron Liu (Apr 08 2025 at 19:31):

Ok, I just checked and all of these pairs are correct.

Isak Colboubrani (Apr 09 2025 at 10:25):

Below are the updated claims, revised in light of yesterday's counterexample findings (thanks @Aaron Liu -- you're skilled!).

Are these two claims accurate? Please help me refute them with concrete counterexamples, or let me know if you believe they are unfalsifiable.

Claim 1. In each of the following pairs, the first tactic is strictly stronger than the second. That is, any goal closed by the second tactic is also closed by the first (and not vice versa):

  • (abel, abel1)
  • (ac_nf, ac_nf0)
  • (aesop, congr)
  • (aesop, simp_all)
  • (module, abel)
  • (nlinarith, linarith)
  • (norm_cast, norm_cast0)
  • (norm_num, norm_num1)
  • (rfl, eq_refl)
  • (ring, ring1)
  • (ring!, ring1!)
  • (solve_by_elim, assumption)
  • (tauto, itauto)
  • (trivial, assumption)
  • (trivial, contradition)
  • (trivial, decide)
  • (trivial, rfl)

(Restrictions to exclude the most trivial cases: 1.) both tactics in each pair must be capable of closing some goals, 2.) both tactics must be zero-argument, 3.) we exclude examples resulting from Aaron's clever "recursion depth" poisoning trick, 4.) we also forbid the use of the sorryAx axiom.)

Claim 2. The list is complete, meaning that no other tactic pairs exhibit this property.

Aaron Liu (Apr 09 2025 at 10:59):

I will add (aesop, split) and (abel!, abel1!) to that.

Robin Arnez (Apr 09 2025 at 17:46):

add (rfl, apply_rfl)

Robin Arnez (Apr 09 2025 at 17:56):

also (norm_num, simp) ideally but non-confluence might get in the way

Aaron Liu (Apr 09 2025 at 18:15):

Robin Arnez said:

also (norm_num, simp) ideally but non-confluence might get in the way

Is norm_num stronger than simp!?

Kevin Buzzard (Apr 09 2025 at 18:15):

norm_num is norm_num1 + simp

Robin Arnez (Apr 09 2025 at 18:20):

well, to be exact, norm_num is simp using norm num extensions which makes this possible which norm_num1; simp can't do:

example : (1 : ℚ) + [2][0] = 3 := by
  norm_num

Last updated: May 02 2025 at 03:31 UTC