THE CLEANABLE TABLE
the declarations whose dependence on choice actually came out
275 declarations across 60 modules were rewritten to remove a dependence on the axiom of choice, and the Lean kernel accepted every one. Four were refused and one kept its dependence. This is the list.
The unit is a compiler-generated _proof_N term rather than a lemma anyone wrote, and that is the finding rather than a caveat. The removable dependence in these libraries sits in terms the elaborator emitted, so it comes out by changing the tactic that emits them and not by editing a proof.
Measured with gonzalgo · Lean 4.32.1 with Mathlib v4.32.1 · every rewrite checked by the Lean kernel, not the elaborator
| library | module | declaration | occurrences | outcome |
|---|---|---|---|---|
| Batteries | Batteries.Data.Char.AsciiCasing | Char.toLower_eq_of_not_isUpper | 1 | removed |
| Batteries | Batteries.Data.String.Lemmas | String.Legacy.Iterator.hasNext_cons_addChar | 2 | removed |
| Batteries | Batteries.Data.String.Lemmas | String.splitAux_of_valid | 2 | removed |
| Init | Init.Data.Array.Extract | Array.extract_eq_self_iff | 2 | removed |
| Init | Init.Data.Array.Lemmas | Array.back?_eq_none_iff | 3 | removed |
| Init | Init.Data.BitVec.Bitblast | BitVec.carry_succ | 2 | removed |
| Init | Init.Data.BitVec.Bitblast | BitVec.carry_succ | 2 | removed |
| Init | Init.Data.BitVec.Bitblast | BitVec.intMin_udiv_ne_zero_of_ne_zero | 4 | removed |
| Init | Init.Data.BitVec.Bitblast | BitVec.saddOverflow_eq | 10 | removed |
| Init | Init.Data.BitVec.Bitblast | BitVec.sdivOverflow_eq | 2 | removed |
| Init | Init.Data.BitVec.Bitblast | BitVec.sdivOverflow_eq | 2 | removed |
| Init | Init.Data.BitVec.Bitblast | BitVec.sdivOverflow_eq | 2 | removed |
| Init | Init.Data.BitVec.Bitblast | BitVec.ssubOverflow_eq | 14 | removed |
| Init | Init.Data.BitVec.Bitblast | BitVec.ult_eq_not_carry | 2 | removed |
| Init | Init.Data.BitVec.Bitblast | BitVec.umulOverflow_eq | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.clzAuxRec_eq_iff_of_getLsbD_false | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.clzAuxRec_eq_iff_of_getLsbD_false | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.clzAuxRec_eq_zero_iff | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.clzAuxRec_eq_zero_iff | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getLsbD_false_of_clzAuxRec | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getLsbD_false_of_clzAuxRec | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getLsbD_intMax | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getLsbD_intMin | 4 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getLsbD_shiftConcat_eq_decide | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getLsbD_shiftConcat_eq_decide | 3 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getLsbD_true_of_eq_clzAuxRec_of_ne_zero | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getLsbD_true_of_eq_clzAuxRec_of_ne_zero | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getMsbD_extractLsb | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getMsbD_extractLsb | 4 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getMsbD_extractLsb' | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getMsbD_extractLsb' | 4 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.getMsbD_twoPow | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.le_add_iff_sub_le | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.le_toInt_shiftRight | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.msb_one | 4 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.msb_setWidth | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.sdivOverflow_eq_negOverflow_of_eq_allOnes | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.setWidth_setWidth | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.sle_eq_not_slt | 3 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.sle_eq_slt_or_eq | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.sub_le_sub_iff_le | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.toInt_mul_toInt_lt_neg_two_pow_iff | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.toInt_mul_toInt_lt_neg_two_pow_iff | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.toInt_neg_iff | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.toInt_pos_iff | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.toInt_shiftRight_lt | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.toInt_sub_toInt_lt_twoPow_iff | 4 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.toInt_sub_toInt_lt_twoPow_iff | 5 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.toNat_signExtend_of_le | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.twoPow_le_toInt_sub_toInt_iff | 3 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.two_pow_le_toInt_mul_toInt_iff | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.two_pow_le_toInt_mul_toInt_iff | 1 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.two_pow_le_toInt_mul_toInt_iff | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.uaddOverflow_assoc | 2 | removed |
| Init | Init.Data.BitVec.Lemmas | BitVec.ult_eq_msb_of_msb_neq | 3 | removed |
| Init | Init.Data.ByteArray.Lemmas | ByteArray.extract_eq_empty_iff | 2 | removed |
| Init | Init.Data.Fin.Lemmas | Fin.coe_sub_iff_le | 2 | removed |
| Init | Init.Data.Fin.Lemmas | Fin.coe_sub_iff_le | 2 | removed |
| Init | Init.Data.Fin.Lemmas | Fin.coe_sub_iff_lt | 2 | removed |
| Init | Init.Data.Fin.Lemmas | Fin.coe_sub_iff_lt | 2 | removed |
| Init | Init.Data.Fin.Lemmas | Nat.mod_eq_sub_of_lt_two_mul | 2 | removed |
| Init | Init.Data.Int.Cooper | Int.cooper_resolution_dvd_right | 2 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.add_one_tdiv | 8 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.add_one_tdiv_of_pos | 2 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.bmod_neg_iff | 2 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.bmod_neg_iff | 4 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.ediv_le_iff_le_mul | 2 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.fdiv_fmod_unique' | 8 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.le_mul_iff_le_left | 2 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.mul_fdiv_self_le | 2 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.natAbs_ediv | 1 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.natCast_eq_zero | 2 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.tdiv_tmod_unique | 8 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.tdiv_tmod_unique | 2 | removed |
| Init | Init.Data.Int.DivMod.Lemmas | Int.tdiv_tmod_unique' | 9 | removed |
| Init | Init.Data.Int.Gcd | Int.eq_zero_of_lcm_eq_zero | 4 | removed |
| Init | Init.Data.Int.LemmasAux | Int.eq_natCast_toNat | 2 | removed |
| Init | Init.Data.Int.LemmasAux | Int.lt_toNat | 2 | removed |
| Init | Init.Data.Int.LemmasAux | Int.mul_le_mul_of_natAbs_le | 3 | removed |
| Init | Init.Data.Int.LemmasAux | Int.natCast_le_zero | 2 | removed |
| Init | Init.Data.Int.LemmasAux | Int.natCast_ne_zero | 4 | removed |
| Init | Init.Data.Int.LemmasAux | Int.natCast_ne_zero_iff_pos | 3 | removed |
| Init | Init.Data.Int.LemmasAux | Int.natCast_nonpos_iff | 2 | removed |
| Init | Init.Data.Int.LemmasAux | Int.natCast_toNat_eq_self | 2 | removed |
| Init | Init.Data.Int.LemmasAux | Int.neg_lt_self_iff | 2 | removed |
| Init | Init.Data.Int.LemmasAux | Int.neg_nonpos_iff | 2 | removed |
| Init | Init.Data.Int.LemmasAux | Int.pos_iff_toNat_pos | 2 | removed |
| Init | Init.Data.Int.LemmasAux | Int.toNat_eq_zero | 2 | removed |
| Init | Init.Data.Int.LemmasAux | Int.toNat_le | 2 | removed |
| Init | Init.Data.Int.LemmasAux | Int.toNat_lt' | 2 | removed |
| Init | Init.Data.Int.LemmasAux | Int.toNat_lt_toNat | 2 | removed |
| Init | Init.Data.Int.Pow | Int.pow_lt_pow_of_lt | 2 | removed |
| Init | Init.Data.List.Nat.Range | List.count_range_1' | 1 | removed |
| Init | Init.Data.List.Nat.Range | List.erase_range' | 1 | removed |
| Init | Init.Data.List.Nat.Range | List.erase_range' | 1 | removed |
| Init | Init.Data.List.Nat.Range | List.erase_range' | 2 | removed |
| Init | Init.Data.List.Nat.Range | List.find?_range'_eq_some | 2 | removed |
| Init | Init.Data.List.Nat.Range | List.find?_range'_eq_some | 4 | removed |
| Init | Init.Data.List.Nat.Range | List.range'_eq_singleton_iff | 4 | removed |
| Init | Init.Data.List.Nat.Range | List.sum_range' | 4 | removed |
| Init | Init.Data.List.Nat.Range | List.sum_range' | 4 | removed |
| Init | Init.Data.List.Nat.Sum | List.sum_pos_iff_exists_pos_nat | 2 | removed |
| Init | Init.Data.Nat.Bitwise.Lemmas | Nat.testBit_log2 | 3 | removed |
| Init | Init.Data.Nat.Bitwise.Lemmas | Nat.testBit_log2 | 3 | removed |
| Init | Init.Data.Nat.Bitwise.Lemmas | Nat.testBit_two_pow_sub_succ | 2 | removed |
| Init | Init.Data.Nat.Div.Lemmas | Nat.div_le_iff_le_mul | 2 | removed |
| Init | Init.Data.Nat.Div.Lemmas | Nat.le_mul_iff_le_left | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.add_eq_left | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.add_eq_max_iff | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.add_eq_min_iff | 4 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.add_eq_one_iff | 6 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.add_eq_right | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.add_eq_three_iff | 10 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.add_eq_two_iff | 8 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.add_eq_zero | 4 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.add_lt_iff_lt_sub_right | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.add_pos_iff_pos_or_pos | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.le_add_one_iff | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.le_and_le_add_one_iff | 4 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.le_iff_lt_add_one | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.left_eq_add | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.lt_sub_iff_add_lt' | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.max_eq_zero_iff | 4 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.min_eq_zero_iff | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.one_lt_iff_ne_zero_and_ne_one | 6 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.pow_eq_zero | 5 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.pow_lt_pow_iff_pow_mul_le_pow | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.right_eq_add | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.sub_lt_iff_lt_add | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.sub_lt_iff_lt_add' | 2 | removed |
| Init | Init.Data.Nat.Lemmas | Nat.sub_lt_sub_iff_right | 2 | removed |
| Init | Init.Data.Nat.Mod | Nat.mul_lt_mul_left | 2 | removed |
| Init | Init.Data.Nat.Power2.Lemmas | Nat.and_sub_one_testBit_log2 | 5 | removed |
| Init | Init.Data.Nat.Power2.Lemmas | Nat.and_sub_one_testBit_log2 | 3 | removed |
| Init | Init.Data.Nat.ToString | Nat.toDigits_of_base_le | 2 | removed |
| Init | Init.Data.Range.Lemmas | Std.Legacy.Range.forIn'_loop_eq_forIn'_range' | 2 | removed |
| Init | Init.Data.Range.Lemmas | Std.Legacy.Range.forM_loop_eq_forM_range' | 2 | removed |
| Init | Init.Data.Range.Lemmas | Std.Legacy.Range.size_eq | 2 | removed |
| Init | Init.Data.Range.Lemmas | Std.Legacy.Range.size_eq | 2 | removed |
| Init | Init.Data.Range.Lemmas | Std.Legacy.Range.size_eq | 2 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.getElem!_toArray_roo_ne_zero_iff | 7 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.getElem!_toList_roc_ne_zero_iff | 7 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.getElem?_toList_rco | 2 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.toArray_rcc_eq_singleton_append_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.toArray_rco_eq_singleton_iff | 5 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.toArray_roo_eq_singleton_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.toList_rcc_eq_cons_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.toList_rcc_eq_nil_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.toList_rcc_eq_singleton_iff | 7 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.toList_rcc_ne_nil_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.toList_rco_eq_singleton_iff | 5 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.toList_roc_eq_singleton_iff | 7 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.toList_roo_eq_singleton_iff | 7 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.zero_lt_getElem!_toArray_roc_iff | 8 | removed |
| Init | Init.Data.Range.Polymorphic.IntLemmas | Int.zero_ne_getElem!_toList_roo_iff | 7 | removed |
| Init | Init.Data.Range.Polymorphic.Internal.SignedBitVec | BitVec.Signed.sle_iff_rotate_le_rotate | 2 | removed |
| Init | Init.Data.Range.Polymorphic.Internal.SignedBitVec | BitVec.Signed.sle_iff_rotate_le_rotate | 2 | removed |
| Init | Init.Data.Range.Polymorphic.Nat | Std.instLawfulRcoIntersectionNat | 11 | removed |
| Init | Init.Data.Range.Polymorphic.Nat | Std.instLawfulRcoIntersectionNat_1 | 12 | removed |
| Init | Init.Data.Range.Polymorphic.Nat | Std.instLawfulRcoIntersectionNat_2 | 8 | removed |
| Init | Init.Data.Range.Polymorphic.Nat | Std.instLawfulRcoIntersectionNat_3 | 10 | removed |
| Init | Init.Data.Range.Polymorphic.Nat | Std.instLawfulRcoIntersectionNat_4 | 11 | removed |
| Init | Init.Data.Range.Polymorphic.Nat | Std.instLawfulRcoIntersectionNat_5 | 7 | removed |
| Init | Init.Data.Range.Polymorphic.Nat | Std.instLawfulRcoIntersectionNat_6 | 7 | removed |
| Init | Init.Data.Range.Polymorphic.Nat | Std.instLawfulRcoIntersectionNat_7 | 7 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.getElem!_toArray_roc_eq_zero_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.getElem!_toArray_roo_eq_zero_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.getElem!_toList_rco_eq_zero_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.getElem!_toList_rco_eq_zero_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.getElem!_toList_roc_eq_zero_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.getElem!_toList_roo_eq_zero_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.toArray_rcc_eq_singleton_append_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.toArray_rco_eq_singleton_iff | 5 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.toList_rcc_eq_cons_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.toList_rcc_eq_nil_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.toList_rcc_eq_singleton_iff | 7 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.toList_rcc_ne_nil_iff | 2 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.toList_rco_eq_singleton_iff | 5 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.toList_ric_eq_singleton_iff | 4 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.toList_rio_eq_singleton_iff | 7 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.toList_roc_eq_singleton_iff | 7 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.toList_roo_eq_singleton_iff | 7 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.zero_lt_getElem!_toArray_roc_iff | 4 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.zero_lt_getElem!_toArray_roo_iff | 3 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.zero_lt_getElem!_toList_rco_iff | 4 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.zero_lt_getElem!_toList_roc_iff | 4 | removed |
| Init | Init.Data.Range.Polymorphic.NatLemmas | Nat.zero_lt_getElem!_toList_roo_iff | 3 | removed |
| Init | Init.Data.Range.Polymorphic.SInt | HasModel.succMany?_eq | 2 | removed |
| Init | Init.Data.SInt.Lemmas | ISize.le_iff_lt_or_eq | 2 | removed |
| Init | Init.Data.SInt.Lemmas | Int16.le_iff_lt_or_eq | 2 | removed |
| Init | Init.Data.SInt.Lemmas | Int32.le_iff_lt_or_eq | 2 | removed |
| Init | Init.Data.SInt.Lemmas | Int64.le_iff_lt_or_eq | 2 | removed |
| Init | Init.Data.SInt.Lemmas | Int8.le_iff_lt_or_eq | 2 | removed |
| Init | Init.Data.String.Basic | String.Pos.Raw.isValid_push | 2 | removed |
| Init | Init.Data.String.Basic | String.Pos.sliceFrom_inj | 2 | removed |
| Init | Init.Data.String.Basic | String.Pos.slice_inj | 2 | removed |
| Init | Init.Data.String.Basic | String.Slice.Pos.sliceFrom_inj | 2 | removed |
| Init | Init.Data.String.Basic | String.Slice.Pos.slice_inj | 2 | removed |
| Init | Init.Data.String.Decode | ByteArray.utf8DecodeChar?_eq_utf8DecodeChar?_extract | 2 | removed |
| Init | Init.Data.String.Decode | ByteArray.utf8DecodeChar?_eq_utf8DecodeChar?_extract | 2 | removed |
| Init | Init.Data.String.Decode | ByteArray.utf8DecodeChar?_eq_utf8DecodeChar?_extract | 2 | removed |
| Init | Init.Data.String.Decode | ByteArray.utf8DecodeChar?_eq_utf8DecodeChar?_extract | 2 | removed |
| Init | Init.Data.String.Lemmas.Basic | String.Slice.slice_eq_self_iff | 2 | removed |
| Init | Init.Data.String.Lemmas.Order | String.Pos.sliceFrom_le_sliceFrom_iff | 2 | removed |
| Init | Init.Data.String.Lemmas.Order | String.Pos.sliceFrom_lt_sliceFrom_iff | 2 | removed |
| Init | Init.Data.String.Lemmas.Order | String.Pos.slice_le_slice_iff | 2 | removed |
| Init | Init.Data.String.Lemmas.Order | String.Pos.slice_lt_slice_iff | 2 | removed |
| Init | Init.Data.String.Lemmas.Order | String.Slice.Pos.sliceFrom_le_sliceFrom_iff | 2 | removed |
| Init | Init.Data.String.Lemmas.Order | String.Slice.Pos.sliceFrom_lt_sliceFrom_iff | 2 | removed |
| Init | Init.Data.String.Lemmas.Order | String.Slice.Pos.slice_le_slice_iff | 2 | removed |
| Init | Init.Data.String.Lemmas.Order | String.Slice.Pos.slice_lt_slice_iff | 2 | removed |
| Init | Init.Data.String.Lemmas.Pattern.String.ForwardSearcher | String.Slice.Pattern.Model.ForwardSliceSearcher.prefixFunctionRecurrence_eq_prefixFunction | 1 | removed |
| Init | Init.Data.String.PosRaw | String.Pos.Raw.dec_lt_iff | 2 | removed |
| Init | Init.Data.String.PosRaw | String.Pos.Raw.le_dec | 2 | removed |
| Init | Init.Data.String.Termination | String.Slice.Pos.le_iff_remainingBytes_le | 2 | removed |
| Init | Init.Data.String.Termination | String.Slice.Pos.lt_iff_remainingBytes_lt | 2 | removed |
| Init | Init.Data.String.Termination | String.Slice.Pos.remainingBytes_inj | 2 | removed |
| Init | Init.Grind.Ordered.Int | Lean.Grind.instLawfulOrderLTInt | 5 | removed |
| Init | Init.Grind.Ordered.Int | Lean.Grind.instOrderedAddInt | 2 | removed |
| Init | Init.Grind.Ring.Basic | Lean.Grind.IsCharP.mk'_aux | 2 | removed |
| Init | Init.Grind.ToInt | Lean.Grind.IntInterval.wrap_eq_self_iff | 2 | removed |
| Init | Init.Grind.ToInt | Lean.Grind.IntInterval.wrap_eq_self_iff | 2 | removed |
| Init | Init.Grind.ToInt | Lean.Grind.IntInterval.wrap_eq_self_iff | 2 | removed |
| Init | Init.GrindInstances.Nat | Lean.Grind.instExistsAddOfLTNat | 2 | removed |
| Init | Init.GrindInstances.Ring.Nat | Lean.Grind.instLawfulOrderLTNat | 5 | removed |
| Init | Init.GrindInstances.Ring.Nat | Lean.Grind.instOrderedRingNat | 2 | removed |
| Lean | Lean.Meta.Sym.Simp.Have | Lean.Meta.Sym.Simp.toHave | 1 | removed |
| Lean | Lean.Util.Diff | Lean.Diff.diff | 1 | removed |
| Lean | Lean.Util.Diff | Lean.Diff.diff | 1 | removed |
| Mathlib | Mathlib.Algebra.Group.Fin.Basic | Fin.lt_sub_iff | 2 | removed |
| Mathlib | Mathlib.Algebra.SkewPolynomial.Basic | SkewPolynomial.coeff_erase | 1 | kernel rejected |
| Mathlib | Mathlib.CategoryTheory.Limits.Shapes.BinaryBiproducts | CategoryTheory.Limits.BinaryBicone.toBiconeFunctor | 7 | kernel rejected |
| Mathlib | Mathlib.Data.List.Infix | List.take_isPrefix_take | 2 | removed |
| Mathlib | Mathlib.LinearAlgebra.RootSystem.Finite.G2 | RootPairing.EmbeddedG2.isOrthogonal_short_and_long_aux | 2 | removed |
| Mathlib | Mathlib.Logic.Equiv.Defs | Equiv.propEquivBool | 1 | kernel rejected |
| Mathlib | Mathlib.MeasureTheory.VectorMeasure.Basic | MeasureTheory.VectorMeasure.dirac | 1 | kernel rejected |
| Mathlib | Mathlib.Order.Interval.Finset.Box | Int.mem_box | 12 | still classical |
| Mathlib | Mathlib.Tactic.DeriveFintype | Mathlib.Deriving.Fintype.mkFintypeInstanceHandler | 1 | removed |
| Plausible | Plausible.Gen | Plausible.Gen.chooseNatLt | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balanced | Std.DTreeMap.Internal.Impl.balancedAtRoot_one_one | 1 | removed |
| Std | Std.Data.DTreeMap.Internal.Balanced | Std.DTreeMap.Internal.Impl.balancedAtRoot_one_two | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balanced | Std.DTreeMap.Internal.Impl.balancedAtRoot_two_one | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balanced | Std.DTreeMap.Internal.Impl.balancedAtRoot_zero_iff | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balanced | Std.DTreeMap.Internal.Impl.balancedAtRoot_zero_iff' | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.BalanceLPrecond.erase | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.BalancedAtRoot.adjust_left | 10 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.BalancedAtRoot.erase_left | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balance!_desc | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balance!_eq_balanceₘ | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balance!_eq_balanceₘ | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanceLErasePrecond_zero_iff | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanceLErasePrecond_zero_iff' | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanced_doubleL | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanced_doubleL | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanced_doubleL | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanced_doubleR | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanced_doubleR | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanced_doubleR | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanced_singleL | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanced_singleL | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanced_singleR | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Balancing | Std.DTreeMap.Internal.Impl.balanced_singleR | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Model | Std.DTreeMap.Internal.Impl.updateCell | 10 | removed |
| Std | Std.Data.DTreeMap.Internal.Model | Std.DTreeMap.Internal.Impl.updateCell | 10 | removed |
| Std | Std.Data.DTreeMap.Internal.Operations | Std.DTreeMap.Internal.Impl.erase | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Operations | Std.DTreeMap.Internal.Impl.erase | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Operations | Std.DTreeMap.Internal.Impl.insert | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Operations | Std.DTreeMap.Internal.Impl.insert | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Operations | Std.DTreeMap.Internal.Impl.insertMax | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Operations | Std.DTreeMap.Internal.Impl.insertMin | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Operations | Std.DTreeMap.Internal.Impl.link | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Operations | Std.DTreeMap.Internal.Impl.link | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Operations | Std.DTreeMap.Internal.Impl.link | 2 | removed |
| Std | Std.Data.DTreeMap.Internal.Operations | Std.DTreeMap.Internal.Impl.link2 | 6 | removed |
| Std | Std.Data.DTreeMap.Internal.Operations | Std.DTreeMap.Internal.Impl.link2 | 6 | removed |
| Std | Std.Sat.AIG.Basic | Std.Sat.AIG.mkGate | 2 | removed |
| Std | Std.Sat.AIG.Cached | Std.Sat.AIG.mkGateCached | 2 | removed |
| Std | Std.Tactic.BVDecide.Bitblast.BVExpr.Basic | Std.Tactic.BVDecide.BVExpr.decEq | 2 | removed |
| Std | Std.Tactic.BVDecide.Bitblast.BVExpr.Basic | Std.Tactic.BVDecide.BVExpr.decEq | 2 | removed |
| Std | Std.Tactic.BVDecide.LRAT.Internal.Convert | Std.Tactic.BVDecide.LRAT.Internal.CNF.lift | 2 | removed |
occurrences is how many uses of Classical.propDecidable the generated term carried. outcome is removed where the kernel accepted the rewritten term, kernel rejected where it refused, and still classical where the rewrite left the dependence in place. The full data carries the generated term's name and, for the four refusals, the kernel's message verbatim.
Get the data
cleanable.json · cleanable.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/Substitute.lean
ConstantInfo.value? must be passed allowOpaque := true or theorem proof terms read as empty and every occurrence count comes back zero. Method: 10.5281/zenodo.21769846.
Where it lives
The distribution is the useful part: Init 223, Std 41, Mathlib 9, Batteries 3, Lean 3, Plausible 1. Four fifths of the removable classical dependence in this measurement is in Lean core, and only nine declarations are in Mathlib.
That matters for what anyone can do about it. Lean core's position on the tactic behaviour behind most of these is on record: avoiding choice is a deliberate non-goal there, stated in response to the omega report and without disputing any figure. So the largest share of what is removable sits where removal is not wanted, and the share sitting where it might be welcomed is small.
The four the kernel refused
Every refusal is a type mismatch rather than a timeout or a missing instance: the substituted term elaborated and then failed to check. Those are the interesting ones, because they are cases where a Decidable instance exists and is still not interchangeable with the classical one at the point it is used. The kernel's message is carried verbatim in the data for each.
What this is not
It is not a claim that 275 theorems were made constructive. Removing a use of Classical.propDecidable from a generated term removes one route to the axiom; whether the declaration still reaches choice by another route is a separate question this table does not answer. The Dominator Table is where routes are counted.