THE CONTROLLED TACTIC TABLE
same goal, ten tactics, axioms recorded per cell
Every observational measure in this program has the same weakness: a theorem's classical dependence can come from what it says or from how it was proved, and a census cannot tell you which. This is the intervention that can. The goal is held fixed, the tactic varies, and anything that changes between cells is the tactic's doing.
The result is a boundary rather than a gradient. norm_num introduces the axiom of choice on all 15 order goals (≤, <, ≥ over Nat and Int) and on none of the 12 equality and divisibility goals. On the same 27 goals decide, omega and trivial introduce it nowhere, so no goal here ever required it.
Measured with gonzalgo · Lean 4.32.1 with Mathlib v4.32.1 · 9 goal families × 3 goals × 10 tactics = 270 cells, every cell a separate theorem with its own #print axioms
| goal | shape | tactic | closed | classical | axioms |
|---|---|---|---|---|---|
| (3 : Nat) ∣ 12 | equality/divisibility | aesop | yes | no | propext Quot.sound |
| (3 : Nat) ∣ 12 | equality/divisibility | decide | yes | no | propext |
| (3 : Nat) ∣ 12 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (3 : Nat) ∣ 12 | equality/divisibility | linarith | no | no | sorryAx |
| (3 : Nat) ∣ 12 | equality/divisibility | norm_num | yes | no | propext |
| (3 : Nat) ∣ 12 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (3 : Nat) ∣ 12 | equality/divisibility | positivity | no | no | sorryAx |
| (3 : Nat) ∣ 12 | equality/divisibility | rfl | no | no | sorryAx |
| (3 : Nat) ∣ 12 | equality/divisibility | simp | yes | no | propext Quot.sound |
| (3 : Nat) ∣ 12 | equality/divisibility | trivial | yes | no | propext |
| (5 : Nat) ∣ 40 | equality/divisibility | aesop | yes | no | propext Quot.sound |
| (5 : Nat) ∣ 40 | equality/divisibility | decide | yes | no | propext |
| (5 : Nat) ∣ 40 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (5 : Nat) ∣ 40 | equality/divisibility | linarith | no | no | sorryAx |
| (5 : Nat) ∣ 40 | equality/divisibility | norm_num | yes | no | propext |
| (5 : Nat) ∣ 40 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (5 : Nat) ∣ 40 | equality/divisibility | positivity | no | no | sorryAx |
| (5 : Nat) ∣ 40 | equality/divisibility | rfl | no | no | sorryAx |
| (5 : Nat) ∣ 40 | equality/divisibility | simp | yes | no | propext Quot.sound |
| (5 : Nat) ∣ 40 | equality/divisibility | trivial | yes | no | propext |
| (1 : Nat) ∣ 7 | equality/divisibility | aesop | yes | no | propext |
| (1 : Nat) ∣ 7 | equality/divisibility | decide | yes | no | propext |
| (1 : Nat) ∣ 7 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (1 : Nat) ∣ 7 | equality/divisibility | linarith | no | no | sorryAx |
| (1 : Nat) ∣ 7 | equality/divisibility | norm_num | yes | no | propext |
| (1 : Nat) ∣ 7 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (1 : Nat) ∣ 7 | equality/divisibility | positivity | no | no | sorryAx |
| (1 : Nat) ∣ 7 | equality/divisibility | rfl | no | no | sorryAx |
| (1 : Nat) ∣ 7 | equality/divisibility | simp | yes | no | propext |
| (1 : Nat) ∣ 7 | equality/divisibility | trivial | yes | no | propext |
| (2 : Int) + 3 = 5 | equality/divisibility | aesop | yes | no | propext |
| (2 : Int) + 3 = 5 | equality/divisibility | decide | yes | no | (none) |
| (2 : Int) + 3 = 5 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (2 : Int) + 3 = 5 | equality/divisibility | linarith | yes | yes | propext Classical.choice Quot.sound |
| (2 : Int) + 3 = 5 | equality/divisibility | norm_num | yes | no | propext |
| (2 : Int) + 3 = 5 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (2 : Int) + 3 = 5 | equality/divisibility | positivity | no | no | sorryAx |
| (2 : Int) + 3 = 5 | equality/divisibility | rfl | yes | no | (none) |
| (2 : Int) + 3 = 5 | equality/divisibility | simp | yes | no | propext |
| (2 : Int) + 3 = 5 | equality/divisibility | trivial | yes | no | (none) |
| (6 : Int) * 7 = 42 | equality/divisibility | aesop | yes | no | propext |
| (6 : Int) * 7 = 42 | equality/divisibility | decide | yes | no | (none) |
| (6 : Int) * 7 = 42 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (6 : Int) * 7 = 42 | equality/divisibility | linarith | yes | yes | propext Classical.choice Quot.sound |
| (6 : Int) * 7 = 42 | equality/divisibility | norm_num | yes | no | propext |
| (6 : Int) * 7 = 42 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (6 : Int) * 7 = 42 | equality/divisibility | positivity | no | no | sorryAx |
| (6 : Int) * 7 = 42 | equality/divisibility | rfl | yes | no | (none) |
| (6 : Int) * 7 = 42 | equality/divisibility | simp | yes | no | propext |
| (6 : Int) * 7 = 42 | equality/divisibility | trivial | yes | no | (none) |
| (2 : Int) - 9 = -7 | equality/divisibility | aesop | yes | no | propext |
| (2 : Int) - 9 = -7 | equality/divisibility | decide | yes | no | (none) |
| (2 : Int) - 9 = -7 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (2 : Int) - 9 = -7 | equality/divisibility | linarith | yes | yes | propext Classical.choice Quot.sound |
| (2 : Int) - 9 = -7 | equality/divisibility | norm_num | yes | no | propext |
| (2 : Int) - 9 = -7 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (2 : Int) - 9 = -7 | equality/divisibility | positivity | no | no | sorryAx |
| (2 : Int) - 9 = -7 | equality/divisibility | rfl | yes | no | (none) |
| (2 : Int) - 9 = -7 | equality/divisibility | simp | yes | no | propext |
| (2 : Int) - 9 = -7 | equality/divisibility | trivial | yes | no | (none) |
| (2 : Nat) + 3 = 5 | equality/divisibility | aesop | yes | no | propext |
| (2 : Nat) + 3 = 5 | equality/divisibility | decide | yes | no | (none) |
| (2 : Nat) + 3 = 5 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (2 : Nat) + 3 = 5 | equality/divisibility | linarith | yes | yes | propext Classical.choice Quot.sound |
| (2 : Nat) + 3 = 5 | equality/divisibility | norm_num | yes | no | propext |
| (2 : Nat) + 3 = 5 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (2 : Nat) + 3 = 5 | equality/divisibility | positivity | no | no | sorryAx |
| (2 : Nat) + 3 = 5 | equality/divisibility | rfl | yes | no | (none) |
| (2 : Nat) + 3 = 5 | equality/divisibility | simp | yes | no | propext |
| (2 : Nat) + 3 = 5 | equality/divisibility | trivial | yes | no | (none) |
| (6 : Nat) * 7 = 42 | equality/divisibility | aesop | yes | no | propext |
| (6 : Nat) * 7 = 42 | equality/divisibility | decide | yes | no | (none) |
| (6 : Nat) * 7 = 42 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (6 : Nat) * 7 = 42 | equality/divisibility | linarith | yes | yes | propext Classical.choice Quot.sound |
| (6 : Nat) * 7 = 42 | equality/divisibility | norm_num | yes | no | propext |
| (6 : Nat) * 7 = 42 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (6 : Nat) * 7 = 42 | equality/divisibility | positivity | no | no | sorryAx |
| (6 : Nat) * 7 = 42 | equality/divisibility | rfl | yes | no | (none) |
| (6 : Nat) * 7 = 42 | equality/divisibility | simp | yes | no | propext |
| (6 : Nat) * 7 = 42 | equality/divisibility | trivial | yes | no | (none) |
| (10 : Nat) - 4 = 6 | equality/divisibility | aesop | yes | no | propext |
| (10 : Nat) - 4 = 6 | equality/divisibility | decide | yes | no | (none) |
| (10 : Nat) - 4 = 6 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (10 : Nat) - 4 = 6 | equality/divisibility | linarith | yes | yes | propext Classical.choice Quot.sound |
| (10 : Nat) - 4 = 6 | equality/divisibility | norm_num | yes | no | propext |
| (10 : Nat) - 4 = 6 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (10 : Nat) - 4 = 6 | equality/divisibility | positivity | no | no | sorryAx |
| (10 : Nat) - 4 = 6 | equality/divisibility | rfl | yes | no | (none) |
| (10 : Nat) - 4 = 6 | equality/divisibility | simp | yes | no | propext |
| (10 : Nat) - 4 = 6 | equality/divisibility | trivial | yes | no | (none) |
| (5 : Nat) ≥ 3 | order | aesop | yes | no | propext |
| (5 : Nat) ≥ 3 | order | decide | yes | no | (none) |
| (5 : Nat) ≥ 3 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (5 : Nat) ≥ 3 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (5 : Nat) ≥ 3 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (5 : Nat) ≥ 3 | order | omega | yes | no | propext Quot.sound |
| (5 : Nat) ≥ 3 | order | positivity | no | no | sorryAx |
| (5 : Nat) ≥ 3 | order | rfl | no | no | sorryAx |
| (5 : Nat) ≥ 3 | order | simp | yes | no | propext |
| (5 : Nat) ≥ 3 | order | trivial | yes | no | (none) |
| (40 : Nat) ≥ 12 | order | aesop | yes | no | propext |
| (40 : Nat) ≥ 12 | order | decide | yes | no | (none) |
| (40 : Nat) ≥ 12 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (40 : Nat) ≥ 12 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (40 : Nat) ≥ 12 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (40 : Nat) ≥ 12 | order | omega | yes | no | propext Quot.sound |
| (40 : Nat) ≥ 12 | order | positivity | no | no | sorryAx |
| (40 : Nat) ≥ 12 | order | rfl | no | no | sorryAx |
| (40 : Nat) ≥ 12 | order | simp | yes | no | propext |
| (40 : Nat) ≥ 12 | order | trivial | yes | no | (none) |
| (7 : Nat) ≥ 0 | order | aesop | yes | no | propext |
| (7 : Nat) ≥ 0 | order | decide | yes | no | (none) |
| (7 : Nat) ≥ 0 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (7 : Nat) ≥ 0 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (7 : Nat) ≥ 0 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (7 : Nat) ≥ 0 | order | omega | yes | no | propext Quot.sound |
| (7 : Nat) ≥ 0 | order | positivity | yes | yes | propext Classical.choice Quot.sound |
| (7 : Nat) ≥ 0 | order | rfl | no | no | sorryAx |
| (7 : Nat) ≥ 0 | order | simp | yes | no | propext |
| (7 : Nat) ≥ 0 | order | trivial | yes | no | (none) |
| (3 : Int) ≤ 5 | order | aesop | yes | no | propext |
| (3 : Int) ≤ 5 | order | decide | yes | no | (none) |
| (3 : Int) ≤ 5 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (3 : Int) ≤ 5 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (3 : Int) ≤ 5 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (3 : Int) ≤ 5 | order | omega | yes | no | propext Quot.sound |
| (3 : Int) ≤ 5 | order | positivity | no | no | sorryAx |
| (3 : Int) ≤ 5 | order | rfl | no | no | sorryAx |
| (3 : Int) ≤ 5 | order | simp | yes | no | propext |
| (3 : Int) ≤ 5 | order | trivial | yes | no | (none) |
| (-4 : Int) ≤ 2 | order | aesop | yes | no | propext |
| (-4 : Int) ≤ 2 | order | decide | yes | no | (none) |
| (-4 : Int) ≤ 2 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (-4 : Int) ≤ 2 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (-4 : Int) ≤ 2 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (-4 : Int) ≤ 2 | order | omega | yes | no | propext Quot.sound |
| (-4 : Int) ≤ 2 | order | positivity | no | no | sorryAx |
| (-4 : Int) ≤ 2 | order | rfl | no | no | sorryAx |
| (-4 : Int) ≤ 2 | order | simp | yes | no | propext |
| (-4 : Int) ≤ 2 | order | trivial | yes | no | (none) |
| (0 : Int) ≤ 7 | order | aesop | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) ≤ 7 | order | decide | yes | no | (none) |
| (0 : Int) ≤ 7 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) ≤ 7 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) ≤ 7 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) ≤ 7 | order | omega | yes | no | propext Quot.sound |
| (0 : Int) ≤ 7 | order | positivity | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) ≤ 7 | order | rfl | no | no | sorryAx |
| (0 : Int) ≤ 7 | order | simp | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) ≤ 7 | order | trivial | yes | no | (none) |
| (3 : Nat) ≤ 5 | order | aesop | yes | no | propext |
| (3 : Nat) ≤ 5 | order | decide | yes | no | (none) |
| (3 : Nat) ≤ 5 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (3 : Nat) ≤ 5 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (3 : Nat) ≤ 5 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (3 : Nat) ≤ 5 | order | omega | yes | no | propext Quot.sound |
| (3 : Nat) ≤ 5 | order | positivity | no | no | sorryAx |
| (3 : Nat) ≤ 5 | order | rfl | no | no | sorryAx |
| (3 : Nat) ≤ 5 | order | simp | yes | no | propext |
| (3 : Nat) ≤ 5 | order | trivial | yes | no | (none) |
| (12 : Nat) ≤ 40 | order | aesop | yes | no | propext |
| (12 : Nat) ≤ 40 | order | decide | yes | no | (none) |
| (12 : Nat) ≤ 40 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (12 : Nat) ≤ 40 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (12 : Nat) ≤ 40 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (12 : Nat) ≤ 40 | order | omega | yes | no | propext Quot.sound |
| (12 : Nat) ≤ 40 | order | positivity | no | no | sorryAx |
| (12 : Nat) ≤ 40 | order | rfl | no | no | sorryAx |
| (12 : Nat) ≤ 40 | order | simp | yes | no | propext |
| (12 : Nat) ≤ 40 | order | trivial | yes | no | (none) |
| (0 : Nat) ≤ 7 | order | aesop | yes | no | propext |
| (0 : Nat) ≤ 7 | order | decide | yes | no | (none) |
| (0 : Nat) ≤ 7 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (0 : Nat) ≤ 7 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (0 : Nat) ≤ 7 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (0 : Nat) ≤ 7 | order | omega | yes | no | propext Quot.sound |
| (0 : Nat) ≤ 7 | order | positivity | yes | yes | propext Classical.choice Quot.sound |
| (0 : Nat) ≤ 7 | order | rfl | no | no | sorryAx |
| (0 : Nat) ≤ 7 | order | simp | yes | no | propext |
| (0 : Nat) ≤ 7 | order | trivial | yes | no | (none) |
| (3 : Int) < 5 | order | aesop | yes | no | propext |
| (3 : Int) < 5 | order | decide | yes | no | (none) |
| (3 : Int) < 5 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (3 : Int) < 5 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (3 : Int) < 5 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (3 : Int) < 5 | order | omega | yes | no | propext Quot.sound |
| (3 : Int) < 5 | order | positivity | no | no | sorryAx |
| (3 : Int) < 5 | order | rfl | no | no | sorryAx |
| (3 : Int) < 5 | order | simp | yes | no | propext |
| (3 : Int) < 5 | order | trivial | yes | no | (none) |
| (-4 : Int) < 2 | order | aesop | yes | yes | propext Classical.choice Quot.sound |
| (-4 : Int) < 2 | order | decide | yes | no | (none) |
| (-4 : Int) < 2 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (-4 : Int) < 2 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (-4 : Int) < 2 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (-4 : Int) < 2 | order | omega | yes | no | propext Quot.sound |
| (-4 : Int) < 2 | order | positivity | no | no | sorryAx |
| (-4 : Int) < 2 | order | rfl | no | no | sorryAx |
| (-4 : Int) < 2 | order | simp | yes | yes | propext Classical.choice Quot.sound |
| (-4 : Int) < 2 | order | trivial | yes | no | (none) |
| (0 : Int) < 7 | order | aesop | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) < 7 | order | decide | yes | no | (none) |
| (0 : Int) < 7 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) < 7 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) < 7 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) < 7 | order | omega | yes | no | propext Quot.sound |
| (0 : Int) < 7 | order | positivity | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) < 7 | order | rfl | no | no | sorryAx |
| (0 : Int) < 7 | order | simp | yes | yes | propext Classical.choice Quot.sound |
| (0 : Int) < 7 | order | trivial | yes | no | (none) |
| (3 : Nat) < 5 | order | aesop | yes | no | propext |
| (3 : Nat) < 5 | order | decide | yes | no | (none) |
| (3 : Nat) < 5 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (3 : Nat) < 5 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (3 : Nat) < 5 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (3 : Nat) < 5 | order | omega | yes | no | propext Quot.sound |
| (3 : Nat) < 5 | order | positivity | no | no | sorryAx |
| (3 : Nat) < 5 | order | rfl | no | no | sorryAx |
| (3 : Nat) < 5 | order | simp | yes | no | propext |
| (3 : Nat) < 5 | order | trivial | yes | no | (none) |
| (12 : Nat) < 40 | order | aesop | yes | no | propext |
| (12 : Nat) < 40 | order | decide | yes | no | (none) |
| (12 : Nat) < 40 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (12 : Nat) < 40 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (12 : Nat) < 40 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (12 : Nat) < 40 | order | omega | yes | no | propext Quot.sound |
| (12 : Nat) < 40 | order | positivity | no | no | sorryAx |
| (12 : Nat) < 40 | order | rfl | no | no | sorryAx |
| (12 : Nat) < 40 | order | simp | yes | no | propext |
| (12 : Nat) < 40 | order | trivial | yes | no | (none) |
| (0 : Nat) < 7 | order | aesop | yes | yes | propext Classical.choice Quot.sound |
| (0 : Nat) < 7 | order | decide | yes | no | (none) |
| (0 : Nat) < 7 | order | grind | yes | yes | propext Classical.choice Quot.sound |
| (0 : Nat) < 7 | order | linarith | yes | yes | propext Classical.choice Quot.sound |
| (0 : Nat) < 7 | order | norm_num | yes | yes | propext Classical.choice Quot.sound |
| (0 : Nat) < 7 | order | omega | yes | no | propext Quot.sound |
| (0 : Nat) < 7 | order | positivity | yes | yes | propext Classical.choice Quot.sound |
| (0 : Nat) < 7 | order | rfl | no | no | sorryAx |
| (0 : Nat) < 7 | order | simp | yes | yes | propext Classical.choice Quot.sound |
| (0 : Nat) < 7 | order | trivial | yes | no | (none) |
| (3 : Nat) ≠ 5 | equality/divisibility | aesop | yes | no | propext |
| (3 : Nat) ≠ 5 | equality/divisibility | decide | yes | no | (none) |
| (3 : Nat) ≠ 5 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (3 : Nat) ≠ 5 | equality/divisibility | linarith | yes | yes | propext Classical.choice Quot.sound |
| (3 : Nat) ≠ 5 | equality/divisibility | norm_num | yes | no | propext |
| (3 : Nat) ≠ 5 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (3 : Nat) ≠ 5 | equality/divisibility | positivity | no | no | sorryAx |
| (3 : Nat) ≠ 5 | equality/divisibility | rfl | no | no | sorryAx |
| (3 : Nat) ≠ 5 | equality/divisibility | simp | yes | no | propext |
| (3 : Nat) ≠ 5 | equality/divisibility | trivial | yes | no | (none) |
| (12 : Nat) ≠ 40 | equality/divisibility | aesop | yes | no | propext |
| (12 : Nat) ≠ 40 | equality/divisibility | decide | yes | no | (none) |
| (12 : Nat) ≠ 40 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (12 : Nat) ≠ 40 | equality/divisibility | linarith | yes | yes | propext Classical.choice Quot.sound |
| (12 : Nat) ≠ 40 | equality/divisibility | norm_num | yes | no | propext |
| (12 : Nat) ≠ 40 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (12 : Nat) ≠ 40 | equality/divisibility | positivity | no | no | sorryAx |
| (12 : Nat) ≠ 40 | equality/divisibility | rfl | no | no | sorryAx |
| (12 : Nat) ≠ 40 | equality/divisibility | simp | yes | no | propext |
| (12 : Nat) ≠ 40 | equality/divisibility | trivial | yes | no | (none) |
| (1 : Nat) ≠ 0 | equality/divisibility | aesop | yes | no | propext |
| (1 : Nat) ≠ 0 | equality/divisibility | decide | yes | no | (none) |
| (1 : Nat) ≠ 0 | equality/divisibility | grind | yes | yes | propext Classical.choice Quot.sound |
| (1 : Nat) ≠ 0 | equality/divisibility | linarith | yes | yes | propext Classical.choice Quot.sound |
| (1 : Nat) ≠ 0 | equality/divisibility | norm_num | yes | no | propext |
| (1 : Nat) ≠ 0 | equality/divisibility | omega | yes | no | propext Quot.sound |
| (1 : Nat) ≠ 0 | equality/divisibility | positivity | yes | yes | propext Classical.choice Quot.sound |
| (1 : Nat) ≠ 0 | equality/divisibility | rfl | no | no | sorryAx |
| (1 : Nat) ≠ 0 | equality/divisibility | simp | yes | no | propext |
| (1 : Nat) ≠ 0 | equality/divisibility | trivial | yes | no | (none) |
closed is false where the tactic did not prove the goal. Lean records those as depending on sorryAx, which is the tactic failing rather than a proof resting on something unfinished, so they are excluded from every rate below — a tactic that never ran cannot have introduced an axiom. classical means Classical.choice appears in the cell's axiom set.
Get the data
controlled-tactics.json · controlled-tactics.csv · CC-BY-4.0 · version 2026-08-12
One of the gonzalgo indexes — standing measurements of what formal libraries rest on, remeasured as the libraries move.
Reproduce it
lake env lean -D maxErrors=4000 lean/Controlled.lean
set_option maxErrors inside the file is ignored; only the command-line flag works, and without it Lean halts at 100 errors long before the last theorem. The generator and the raw output are in 10.5281/zenodo.21883963.
Rates, over goals each tactic actually closed
| tactic | goals closed | classical | rate |
|---|---|---|---|
aesop | 27 | 4 | 15% |
decide | 27 | 0 | 0% |
grind | 27 | 27 | 100% |
linarith | 24 | 24 | 100% |
norm_num | 27 | 15 | 56% |
omega | 27 | 0 | 0% |
positivity | 6 | 6 | 100% |
rfl | 6 | 0 | 0% |
simp | 27 | 4 | 15% |
trivial | 27 | 0 | 0% |
What the boundary means
norm_num's dependence is not a property of the arithmetic. The same numbers, stated as an equality, come out choice-free from the same tactic. It is the order goals specifically, and on Nat and Int the constructive decidability instance exists and is axiom-free, so the classical route was taken where a free one was available.
grind is classical on every goal it closes and that is not a defect: it is architecturally classical. Reporting it beside norm_num without that distinction is exactly the error the attribution paper is about — a rate cannot separate a tactic that is designed classical from one that reached for choice unnecessarily.
aesop and simp agree on all 27 goals, cell for cell. aesop's classical cells are simp's classical cells. A search procedure built over a simp set inherits that set's axiom behaviour rather than adding to it.
Why this is worth more than the census
Per-tactic rates measured across a library vary as much within a library as between them — 5.8–28.2% in Mathlib, 45–100% in Lean core — because eligibility is a property of the theorem while the defect is a property of the proof term. Fixing the goal removes that confound entirely. Every difference in this table is attributable, because nothing else was allowed to vary.