THE TACTIC BACKGROUND TABLE

every rate, against the band that says whether it means anything

Scoring a tactic by how often its proofs carry a removable dependence on choice looks like it should find the tactics at fault. The number it produces is mostly a property of the theorems the tactic gets used on.

The calibration is the whole table. A known-negative is a tactic that cannot introduce a classical instance at all — rfl, intro, exfalso — so whatever rate it shows is the background of its population. In Mathlib that background spans 5.8–28.2% across 30 controls; in Lean core 45.0–100.0%. The variation inside one library is as large as the variation between libraries, so no threshold survives normalisation.

Measured with gonzalgo · Lean 4.32.1 with Mathlib v4.32.1 · four libraries, two attribution rules, cells with at least 20 proofs

libraryruletacticroleproofsclassicaleligibleratevs band
Batteriesloosegrindcandidate18217914983.2%above band
Batterieslooserefineknown-negative3611981.8%inside band
Batteriesloosecasesknown-negative111393076.9%inside band
Batterieslooseinductionknown-negative171685175.0%inside band
Batterieslooseapplyknown-negative94543870.4%inside band
Batteriesloosesimp_allcandidate3210770.0%inside band
Batteriesloosesimpcandidate61622215168.0%inside band
Batterieslooseomegacandidate24191263.2%inside band
Batterieslooserwknown-negative229995858.6%inside band
Batterieslooseexactknown-negative133543055.6%inside band
Batterieslooseunfoldknown-negative4918950.0%inside band
Batterieslooserflknown-negative145391948.7%inside band
Batteriesloosefunextknown-negative378337.5%inside band
Batterieslooseextknown-negative3017635.3%inside band
Batterieslooseobtainknown-negative2210330.0%inside band
Batterieslooseintroknown-negative3413323.1%inside band
Batteriesloosesimpanot examined4023521.7%below band
Batteriesstrictgrindcandidate74746993.2%above band
Batteriesstrictrwknown-negative28121083.3%inside band
Batteriesstrictsimpcandidate165574273.7%below band
Initloosetrivialknown-negative2322100.0%inside band
Initloosenorm_castcandidate462828100.0%inside band
Initloosesubstknown-negative51617516493.7%inside band
Initlooseassumptionknown-negative150585289.7%inside band
Initloosercasesknown-negative92333830088.8%inside band
Initlooseconstructorknown-negative36715312883.7%inside band
Initlooseleftknown-negative38121083.3%inside band
Initlooseintroknown-negative86634828581.9%inside band
Initlooserightknown-negative4211981.8%inside band
Initloosedecidecandidate302524178.8%inside band
Initlooseextknown-negative37714110775.9%inside band
Initloosecontradictionknown-negative103362775.0%inside band
Initlooserintroknown-negative3181138474.3%inside band
Initloosegrindcandidate42322371.9%inside band
Initloosecasesknown-negative1,72122015871.8%inside band
Initlooseomegacandidate1,14465446270.6%inside band
Initloosesimp_allcandidate83820214169.8%inside band
Initlooseapplyknown-negative96430621068.6%inside band
Initlooseinductionknown-negative9661339168.4%inside band
Initloosefunextknown-negative150251768.0%inside band
Initlooserflknown-negative1,48839826165.6%inside band
Initlooserwaknown-negative179513364.7%inside band
Initlooseexactknown-negative1,28546828961.8%inside band
Initlooserefineknown-negative3241458961.4%inside band
Initlooserwknown-negative3,3391,22273560.1%inside band
Initloosesimpanot examined83140723858.5%inside band
Initlooseobtainknown-negative2851036058.3%inside band
Initlooseshowknown-negative2031176757.3%inside band
Initlooseunfoldknown-negative143301756.7%inside band
Initloosesimpcandidate8,4283,1151,51948.8%inside band
Initloosechangeknown-negative6420945.0%inside band
Initstrictomegacandidate663535100.0%above band
Initstrictsimp_allcandidate3988100.0%above band
Initstrictexactknown-negative226583.3%inside band
Initstrictgrindcandidate20201680.0%inside band
Initstrictrwknown-negative7882099846.9%inside band
Initstrictsimpanot examined160702840.0%inside band
Initstrictsimpcandidate2,6771,21231526.0%inside band
Initstrictrflknown-negative23100.0%inside band
Mathlibloosegrindcandidate2,7612,7331,06138.8%above band
Mathlibloosedecidecandidate33829010134.8%above band
Mathliblooseexfalsoknown-negative74712028.2%inside band
Mathlibloosecontradictionknown-negative1721483825.7%inside band
Mathlibloosetautocandidate3603248125.0%inside band
Mathlibloosecasesknown-negative2,4461,66441124.7%inside band
Mathliblooserightknown-negative61755812021.5%inside band
Mathliblooseconstructorknown-negative2,6332,29149321.5%inside band
Mathliblooseinductionknown-negative3,4182,56151920.3%inside band
Mathliblooseuseknown-negative1,6381,53230920.2%inside band
Mathliblooseassumptionknown-negative3012404820.0%inside band
Mathliblooserintroknown-negative4,5553,95378519.9%inside band
Mathlibloosercasesknown-negative4,5124,12679319.2%inside band
Mathliblooseobtainknown-negative8,2517,7001,47519.2%inside band
Mathlibloosefin_casesnot examined1951943719.1%inside band
Mathliblooseomegacandidate67531018.9%inside band
Mathliblooseinjectionknown-negative5128517.9%inside band
Mathliblooseexactknown-negative25,56123,5554,08517.3%inside band
Mathliblooserwaknown-negative3,0362,83847216.6%inside band
Mathliblooseaesopcandidate1,19295615516.2%inside band
Mathliblooserflknown-negative12,97911,0981,79316.2%inside band
Mathliblooserefineknown-negative13,16412,5172,01116.1%inside band
Mathlibloosetrivialknown-negative3192764415.9%inside band
Mathliblooseintroknown-negative8,1177,5101,19115.9%inside band
Mathlibloosesimpanot examined10,4909,6711,52415.8%inside band
Mathlibloosesimp_allcandidate1,2041,04116315.7%inside band
Mathliblooseleftknown-negative73367410315.3%inside band
Mathliblooserwknown-negative39,32235,2395,21414.8%inside band
Mathliblooselinear_combinationnot examined2301702514.7%inside band
Mathlibloosesubstknown-negative88070810314.5%inside band
Mathlibloosesimp_rwknown-negative5,7205,27875914.4%inside band
Mathliblooseunfoldknown-negative7396448713.5%inside band
Mathlibloosesimpcandidate38,68132,9134,40813.4%inside band
Mathliblooseapplyknown-negative9,5778,8351,16513.2%inside band
Mathliblooseshowknown-negative1,2871,22015512.7%inside band
Mathlibloosefunextknown-negative5444255312.5%inside band
Mathliblooseextknown-negative10,2028,43290310.7%inside band
Mathlibloosenlinarithcandidate7877810.4%inside band
Mathlibloosechangeknown-negative1,3341,2461209.6%inside band
Mathlibloosecat_dischnot examined709638609.4%inside band
Mathlibloosedeltaknown-negative189164148.5%inside band
Mathlibloosegcongrnot examined1,1181,062847.9%inside band
Mathlibloosenorm_castcandidate699663527.8%inside band
Mathlibloosering_nfnot examined256246166.5%inside band
Mathliblooseringcandidate985915556.0%inside band
Mathliblooseexact_mod_castknown-negative175172105.8%inside band
Mathlibloosenorm_numcandidate412400205.0%below band
Mathlibloosefield_simpcandidate14714774.8%below band
Mathliblooselinarithcandidate558556213.8%below band
Mathlibloosepositivitycandidate977975343.5%below band
Mathlibloosepush_castnot examined24524072.9%below band
Mathliblooseboundnot examined13213132.3%below band
Mathlibstrictinductionknown-negative29242187.5%inside band
Mathlibstrictgrindcandidate77076848362.9%inside band
Mathlibstrictdecidecandidate77583356.9%inside band
Mathlibstrictnorm_castcandidate2525936.0%inside band
Mathlibstrictrwaknown-negative125993232.3%inside band
Mathlibstrictgrwnot examined4122627.3%inside band
Mathlibstrictsimpanot examined1,9351,68638322.7%inside band
Mathlibstrictsimp_rwknown-negative68655411821.3%inside band
Mathlibstrictclassicalnot examined1091082119.4%inside band
Mathlibstrictrwknown-negative5,6344,45481518.3%inside band
Mathlibstrictsimpcandidate7,8225,99598116.4%inside band
Mathlibstrictsimp_allcandidate4431516.1%inside band
Mathlibstrictaesopcandidate180991111.1%inside band
Mathlibstrictfun_propnot examined2019210.5%inside band
Mathlibstrictexactknown-negative403738.1%inside band
Mathlibstrictconvert!not examined342627.7%inside band
Mathlibstrictcat_dischnot examined837822.6%inside band
Mathlibstrictapplyknown-negative958111.2%inside band
Mathlibstrictlinear_combinationnot examined232100.0%inside band
Mathlibstrictrflknown-negative20814500.0%inside band
Stdloosesimpanot examined73466751276.8%above band
Stdloosegrindcandidate89885562.5%above band
Stdlooseassumptionknown-negative95784760.3%inside band
Stdloosecontradictionknown-negative5416956.2%inside band
Stdloosesimpcandidate2,7491,56881451.9%inside band
Stdlooserwknown-negative1,7471,07553349.6%inside band
Stdlooseconstructorknown-negative89552749.1%inside band
Stdlooseobtainknown-negative4714642.9%inside band
Stdlooserintroknown-negative4219842.1%inside band
Stdlooseapplyknown-negative77751720339.3%inside band
Stdloosecasesknown-negative2631064138.7%inside band
Stdlooseextknown-negative58261038.5%inside band
Stdlooseintroknown-negative48228310336.4%inside band
Stdlooseomegacandidate130782835.9%inside band
Stdloosesimp_allcandidate172602135.0%inside band
Stdloosercasesknown-negative109802733.8%inside band
Stdlooserightknown-negative4023730.4%inside band
Stdlooseleftknown-negative4124729.2%inside band
Stdlooseexactknown-negative1,29496527828.8%inside band
Stdlooserflknown-negative4752005628.0%inside band
Stdloosedecidecandidate3015426.7%inside band
Stdlooseinductionknown-negative412992323.2%inside band
Stdloosefunextknown-negative2912216.7%inside band
Stdlooserwaknown-negative4816212.5%inside band
Stdlooseunfoldknown-negative1781001212.0%inside band
Stdlooserefineknown-negative2472002311.5%inside band
Stdloosesubstknown-negative302015.0%inside band
Stdloosetrivialknown-negative26100.0%inside band
Stdstrictapplyknown-negative25201890.0%inside band
Stdstrictsimp_to_rawnot examined40037632987.5%inside band
Stdstrictsimpanot examined56154644681.7%inside band
Stdstrictrwknown-negative2231257560.0%inside band
Stdstrictsimpcandidate90148127757.6%inside band
Stdstrictsimp_to_modelnot examined1,0921,05260557.5%inside band
Stdstrictsimp_allcandidate2014321.4%inside band
Stdstrictrflknown-negative883300.0%inside band

rate is eligible over classical: of the proofs using this tactic that depend on Classical.choice, the share whose statement is choice-free, so the proof introduced the dependence. rule is how a proof is attributed — strict counts only proofs where the tactic is the sole tactic, loose counts every proof it appears in. role marks whether a tactic is a known-negative control, one of the 15 candidates the paper tests, or a tactic that was measured but never examined.

Get the data

tactic-bands.json · tactic-bands.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

python analysis/final_table.py

Code and derived data: 10.5281/zenodo.21853489. The bands here are recomputed from the cells and checked against the ones the archive stores, so a row and its band cannot come from different runs.

What escapes, and why it does not help

7 of the examined candidates rise above their own library's band. Four of the seven are grind, which proves by refuting the negation and is therefore classical by construction rather than by defect. One is omega, whose avoidable dependence is real and independently established — and simp_all ties it at exactly 100.0% in the same library under the same rule, so even there the rate does not single it out.

norm_num carries a genuinely avoidable dependence, demonstrated by direct construction in the controlled experiment. It sits at 5.0% in Mathlib, below the known-negative floor, beneath rfl and exfalso and every other tactic that cannot introduce choice at all. The instrument ranks the one tactic with a proven defect beneath tactics incapable of the defect.

Widening the rule does not rescue it. Under strict, induction reaches 87.5% and widens Mathlib's band until nothing escapes at all. The instrument either fires on the wrong tactic or does not fire.

One cell the paper did not test

The published count of seven is over the 15 candidate tactics its script examines. Rates were computed for every tactic meeting the threshold, and one more escapes: simpa in Std under loose at 76.8% against a 60.3% band, over 734 proofs. It is neither a known-negative nor on the candidate list, so nothing in the pipeline looked at it.

It does not disturb the conclusion — an extra escape that nobody has a mechanism for is more evidence that the rate is not selecting on defectiveness — but it is in the data and belongs on the page rather than in a drawer.

Why the unit is wrong, not just the statistic

In the generated corpus interval_cases scores 100%. Its proofs close with <;> norm_num, and the score belongs to norm_num. A surface tactic inherits the axiom behaviour of whatever it delegates to, so attributing a proof to the tactic named in it is the wrong unit regardless of which statistic is computed over it. That is the finding this table exists to support.