| /-! | |
| # An etaExperiment timeout | |
| The purpose of this file is to demonstrate a typeclass search that | |
| * times out with `etaExperiment` | |
| * is fast on `lean-toolchain` `gebner/lean4:reenableeta230506` | |
| * is realistic, i.e. is a minimisation of something appearing in mathlib. | |
| I've taken the example Matthew Ballard showed me: | |
| ``` | |
| import Mathlib | |
| #synth Zero ℤ | |
| ``` | |
| and minimised it. | |
| I've used `sorry` liberally, | |
| but not changed the typeclass inheritance structure at all relative to mathlib4. | |
| (It could probably be minimized further, but I think this is not the point?) | |
| This file is minimised in the sense that: | |
| * removing any command should either cause a new error, or remove the timeout. | |
| * removing any field of a structure, and sorrying a field of an instance, should do the same. | |
| Section titles correspond to the files the material came from the mathlib4/std4. | |
| -/ | |
| section Std.Classes.Cast | |
| class NatCast2 (R : Type u) where | |
| class IntCast2 (R : Type u) where | |
| end Std.Classes.Cast | |
| section Std.Data.Int.Lemmas | |
| end Std.Data.Int.Lemmas | |
| section Std.Classes.RatCast | |
| class RatCast (K : Type u) where | |
| end Std.Classes.RatCast | |
| section Mathlib.Algebra.Group.Defs | |
| class Semigroup (G : Type u) extends Mul G where | |
| class AddSemigroup (G : Type u) extends Add G where | |
| class CommSemigroup (G : Type u) extends Semigroup G where | |
| mul_comm : ∀ a b : G, a * b = b * a | |
| class AddCommSemigroup (G : Type u) extends AddSemigroup G where | |
| class MulOneClass (M : Type u) extends One M, Mul M where | |
| mul_one : ∀ a : M, a * 1 = a | |
| class AddZeroClass (M : Type u) extends Zero M, Add M where | |
| add_zero : ∀ a : M, a + 0 = a | |
| class AddMonoid (M : Type u) extends AddSemigroup M, AddZeroClass M where | |
| class Monoid (M : Type u) extends Semigroup M, MulOneClass M where | |
| class AddCommMonoid (M : Type u) extends AddMonoid M, AddCommSemigroup M | |
| class CommMonoid (M : Type u) extends Monoid M, CommSemigroup M | |
| class DivInvMonoid (G : Type u) extends Monoid G, Inv G, Div G where | |
| class SubNegMonoid (G : Type u) extends AddMonoid G, Neg G, Sub G where | |
| class Group (G : Type u) extends DivInvMonoid G where | |
| class AddGroup (A : Type u) extends SubNegMonoid A where | |
| class AddCommGroup (G : Type u) extends AddGroup G, AddCommMonoid G | |
| end Mathlib.Algebra.Group.Defs | |
| section Mathlib.Logic.Nontrivial | |
| class Nontrivial (α : Type _) : Prop where | |
| end Mathlib.Logic.Nontrivial | |
| section Mathlib.Algebra.GroupWithZero.Defs | |
| class MulZeroClass (M₀ : Type u) extends Mul M₀, Zero M₀ where | |
| class IsLeftCancelMulZero (M₀ : Type u) [Mul M₀] [Zero M₀] : Prop where | |
| class IsRightCancelMulZero (M₀ : Type u) [Mul M₀] [Zero M₀] : Prop where | |
| class IsCancelMulZero (M₀ : Type u) [Mul M₀] [Zero M₀] : Prop | |
| extends IsLeftCancelMulZero M₀, IsRightCancelMulZero M₀ | |
| class NoZeroDivisors (M₀ : Type _) [Mul M₀] [Zero M₀] : Prop where | |
| class SemigroupWithZero (S₀ : Type u) extends Semigroup S₀, MulZeroClass S₀ | |
| class MulZeroOneClass (M₀ : Type u) extends MulOneClass M₀, MulZeroClass M₀ | |
| class MonoidWithZero (M₀ : Type u) extends Monoid M₀, MulZeroOneClass M₀, SemigroupWithZero M₀ | |
| class CommMonoidWithZero (M₀ : Type _) extends CommMonoid M₀, MonoidWithZero M₀ | |
| class CancelCommMonoidWithZero (M₀ : Type _) extends CommMonoidWithZero M₀, IsLeftCancelMulZero M₀ | |
| end Mathlib.Algebra.GroupWithZero.Defs | |
| section Mathlib.Data.Nat.Cast.Defs | |
| class AddMonoidWithOne (R : Type u) extends NatCast2 R, AddMonoid R, One R where | |
| class AddCommMonoidWithOne (R : Type _) extends AddMonoidWithOne R, AddCommMonoid R | |
| end Mathlib.Data.Nat.Cast.Defs | |
| section Mathlib.Data.Int.Cast.Defs | |
| class AddGroupWithOne (R : Type u) extends IntCast2 R, AddMonoidWithOne R, AddGroup R where | |
| end Mathlib.Data.Int.Cast.Defs | |
| section Mathlib.Algebra.Ring.Defs | |
| class NonUnitalNonAssocSemiring (α : Type u) extends AddCommMonoid α, MulZeroClass α | |
| class NonUnitalSemiring (α : Type u) extends NonUnitalNonAssocSemiring α, SemigroupWithZero α | |
| class NonAssocSemiring (α : Type u) extends NonUnitalNonAssocSemiring α, MulZeroOneClass α, | |
| AddCommMonoidWithOne α | |
| class Semiring (α : Type u) extends NonUnitalSemiring α, NonAssocSemiring α, MonoidWithZero α | |
| class Ring (R : Type u) extends Semiring R, AddCommGroup R, AddGroupWithOne R | |
| class CommSemiring (R : Type u) extends Semiring R, CommMonoid R | |
| class CommRing (α : Type u) extends Ring α, CommMonoid α | |
| instance CommRing.toCommSemiring [s : CommRing α] : CommSemiring α := | |
| { s with } | |
| class IsDomain (α : Type u) [Semiring α] : Prop extends IsCancelMulZero α, Nontrivial α | |
| end Mathlib.Algebra.Ring.Defs | |
| section Mathlib.Data.Int.Basic | |
| instance : CommRing Int where | |
| one := 1 | |
| mul_comm := sorry | |
| mul_one := Int.mul_one -- Replacing this with `sorry` makes the timeout go away! | |
| add_zero := Int.add_zero -- Similarly here. | |
| end Mathlib.Data.Int.Basic | |
| section Mathlib.Algebra.Ring.Regular | |
| section IsDomain | |
| instance IsDomain.toCancelCommMonoidWithZero [CommSemiring α] [IsDomain α] : | |
| CancelCommMonoidWithZero α := { } | |
| end IsDomain | |
| end Mathlib.Algebra.Ring.Regular | |
| section Mathlib.Algebra.Field.Defs | |
| class DivisionRing (K : Type u) extends Ring K, DivInvMonoid K, Nontrivial K, RatCast K where | |
| class Field (K : Type u) extends CommRing K, DivisionRing K | |
| end Mathlib.Algebra.Field.Defs | |
| section Mathlib.Algebra.Field.Basic | |
| instance Field.isDomain [Field K] : IsDomain K := | |
| sorry | |
| end Mathlib.Algebra.Field.Basic | |
| set_option synthInstance.maxHeartbeats 200 in | |
| /-- info: CommRing.toCommSemiring.toNonAssocSemiring.toMulZeroClass.toZero -/ | |
| #guard_msgs in | |
| #synth Zero Int |