Zulip Chat Archive
Stream: mathlib4
Topic: kernel deep recursion detected
Gareth Ma (Jul 22 2024 at 21:40):
Hello, when compiling the following code, I get a (kernel) deep recursion detected error message. What does it mean?
import Mathlib.LinearAlgebra.Determinant
example : (1 : Matrix (Fin 8) (Fin 8) ℚ).det = 1 := by
rw [Matrix.det_one]
I'm on Mathlib v4.10.0-rc2
Gareth Ma (Jul 22 2024 at 21:41):
Same error message on the lean interactive playground thing
Eric Wieser (Jul 22 2024 at 21:47):
You get slightly better diagnostics with
import Mathlib.LinearAlgebra.Determinant
example : (1 : Matrix (Fin 8) (Fin 8) ℚ).det = 1 := by
have := Matrix.det_one (n := Fin 8) (R := ℚ)
exact this
Daniel Weber (Jul 23 2024 at 04:03):
even making everything fully explicit it still fails :thinking:
import Mathlib.LinearAlgebra.Determinant
set_option pp.all true
#check @Matrix.det_one (Fin 8) (instDecidableEqFin 8) (Fin.fintype 8) ℚ Rat.commRing
example : @Eq.{1} Rat
(@Matrix.det.{0, 0} (Fin (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8)))
(instDecidableEqFin (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8)))
(Fin.fintype (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8))) Rat Rat.commRing
(@OfNat.ofNat.{0}
(Matrix.{0, 0, 0} (Fin (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8))) (Fin (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8)))
Rat)
1
(@One.toOfNat1.{0}
(Matrix.{0, 0, 0} (Fin (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8)))
(Fin (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8))) Rat)
(@Matrix.one.{0, 0} (Fin (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8))) Rat
(instDecidableEqFin (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8)))
(@CommMonoidWithZero.toZero.{0} Rat
(@CommSemiring.toCommMonoidWithZero.{0} Rat (@CommRing.toCommSemiring.{0} Rat Rat.commRing)))
(@Semiring.toOne.{0} Rat
(@CommSemiring.toSemiring.{0} Rat (@CommRing.toCommSemiring.{0} Rat Rat.commRing)))))))
(@OfNat.ofNat.{0} Rat 1
(@One.toOfNat1.{0} Rat
(@Semiring.toOne.{0} Rat (@CommSemiring.toSemiring.{0} Rat (@CommRing.toCommSemiring.{0} Rat Rat.commRing))))) := @Matrix.det_one.{0, 0} (Fin (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8))) (instDecidableEqFin (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8))) (Fin.fintype (@OfNat.ofNat.{0} Nat 8 (instOfNatNat 8))) Rat Rat.commRing
Daniel Weber (Jul 23 2024 at 04:12):
This also fails for 5x5
matrices, but not before that
Daniel Weber (Jul 23 2024 at 04:14):
Making Matrix.det
irreducible makes it work for 5x5
, 6x6
and 7x7
, but 8x8
now gives (kernel) deep recursion detected
Daniel Weber (Jul 23 2024 at 04:17):
import Mathlib.LinearAlgebra.Determinant
example : (1 : Matrix (Fin 8) (Fin 8) ℤ).det = 1 := by
unfold Matrix.det Matrix.detRowAlternating MultilinearMap.alternatization
sorry
this also gives deep recursion detected
Daniel Weber (Jul 23 2024 at 04:30):
Daniel Weber said:
import Mathlib.LinearAlgebra.Determinant example : (1 : Matrix (Fin 8) (Fin 8) ℤ).det = 1 := by unfold Matrix.det Matrix.detRowAlternating MultilinearMap.alternatization sorry
this also gives
deep recursion detected
I'm not sure what causes this, but turning pp.all
on here even for Fin 2
you get a huge expression
Daniel Weber (Jul 23 2024 at 04:52):
I managed to edit MultilinearMap.alternatization to fix this, I'll make a pull request
Daniel Weber (Jul 23 2024 at 05:03):
Daniel Weber (Jul 23 2024 at 08:39):
Daniel Weber said:
any ideas why this works?
Gareth Ma (Jul 26 2024 at 13:40):
I got another erronous code also with recursion error (not kernel error), seems to be the same bug though since it also triggers for n >= 5.
import Mathlib.LinearAlgebra.Matrix.Determinant.Basic
local notation "n" => 5
def M : Matrix (Fin n) (Fin n) ℚ := sorry
theorem E8_det_eq_one : M.det = 1 :=
-- "manual rref (laughing as I type this)"
let c0 : Fin n → ℚ := ![1, 0, 0, 0, 0]
let c1 : Fin n → ℚ := ![0, 1, 0, 0, 0]
have h₁ := congrArg (fun f ↦ c1 1 • f) (Matrix.det_updateRow_sum M 0 c0)
have h₂ := Matrix.det_updateRow_sum (M.updateRow 0 (∑ k, c0 k • M k)) 1 c1
have := h₂.trans h₁
sorry
Let me try your fix. If it works, I will prefer it to be merged as soon as possible :D
Gareth Ma (Jul 26 2024 at 13:42):
It does work!
Gareth Ma (Jul 26 2024 at 13:42):
(within your PR)
Eric Wieser (Jul 26 2024 at 13:43):
I wonder if making alternatization an irreducible_def
is a better choice?
Daniel Weber (Jul 26 2024 at 14:29):
Eric Wieser said:
I wonder if making alternatization an
irreducible_def
is a better choice?
I tried this, but it doesn't fix the problem, surprisingly
Daniel Weber (Jul 26 2024 at 14:56):
this works, but I think it's much worse than what I'm doing in the PR.
opaque alternatization' : {b : MultilinearMap R (fun _ : ι => M) N' →+ M [⋀^ι]→ₗ[R] N' //
∀ m, ⇑(b m) = (∑ σ : Perm ι, Equiv.Perm.sign σ • m.domDomCongr σ : _)} :=
⟨{
toFun := fun m ↦
{ ∑ σ : Perm ι, Equiv.Perm.sign σ • m.domDomCongr σ with
toFun := ⇑(∑ σ : Perm ι, Equiv.Perm.sign σ • m.domDomCongr σ)
map_eq_zero_of_eq' := fun v i j hvij hij =>
alternization_map_eq_zero_of_eq_aux m v i j hij hvij }
map_add' := fun a b ↦ by
ext
simp only [mk_coe, AlternatingMap.coe_mk, sum_apply, smul_apply, domDomCongr_apply, add_apply,
smul_add, Finset.sum_add_distrib, AlternatingMap.add_apply]
map_zero' := by
ext
simp only [mk_coe, AlternatingMap.coe_mk, sum_apply, smul_apply, domDomCongr_apply,
zero_apply, smul_zero, Finset.sum_const_zero, AlternatingMap.zero_apply]
}, fun n ↦ rfl⟩
def alternatization : MultilinearMap R (fun _ : ι => M) N' →+ M [⋀^ι]→ₗ[R] N' :=
alternatization'.1
Yakov Pechersky (Jul 26 2024 at 14:59):
Seems like a problem in the reduction of Fintype and finset. Does it work if you define it as a finsum instead? I don't know if those reduce, I assume not
Eric Wieser (Jul 26 2024 at 15:37):
Daniel Weber said:
this works, but I think it's much worse than what I'm doing in the PR.
opaque alternatization' : {b : MultilinearMap R (fun _ : ι => M) N' →+ M [⋀^ι]→ₗ[R] N' // ∀ m, ⇑(b m) = (∑ σ : Perm ι, Equiv.Perm.sign σ • m.domDomCongr σ : _)} :=sorry def alternatization : MultilinearMap R (fun _ : ι => M) N' →+ M [⋀^ι]→ₗ[R] N' := alternatization'.1
Isn't this precisely what irreducible_def
does? Are you sure you didn't misread my suggestion as @[irreducible] def
?
Daniel Weber (Jul 26 2024 at 15:53):
Oh, I have. But using irreducible_def
collides with the existing docs#MultilinearMap.alternatization_def
Eric Wieser (Jul 26 2024 at 15:54):
That should probably be called alternatization_coeFn
or coeFn_alternatization
Eric Wieser (Jul 26 2024 at 15:55):
Yakov Pechersky said:
Seems like a problem in the reduction of Fintype and finset.
I would guess that Finset.univ : Finset (Perm ι)
is producing a very large term that the kernel is tricked into reducing
Yakov Pechersky (Jul 26 2024 at 19:47):
Right, so I hoped that Finset.univ.toSet_finite would possibly avoid it.
Last updated: May 02 2025 at 03:31 UTC