Zulip Chat Archive
Stream: lean4
Topic: Panic: duplicate normalized declaration name
Pavel Klimov (Oct 01 2025 at 09:04):
how can I fix this?
PANIC at _private.Lean.Environment.0.Lean.AsyncConsts.add Lean.Environment:464:4: duplicate normalized declaration name parseByteArray vs. parseByteArray
backtrace:
/home/ubuntu/.elan/toolchains/leanprover--lean4---v4.22.0/lib/lean/libleanshared.so(lean_panic+0xf5) [0x7ffab85a0295]
/home/ubuntu/.elan/toolchains/leanprover--lean4---v4.22.0/lib/lean/libleanshared.so(lean_panic_fn+0x15) [0x7ffab85a0475]
/home/ubuntu/.elan/toolchains/leanprover--lean4---v4.22.0/lib/lean/libleanshared.so(l_Lean_Environment_addConstAsync+0xa72) [0x7ffab2acb182]
/home/ubuntu/.elan/toolchains/leanprover--lean4---v4.22.0/lib/lean/libleanshared.so(l_Lean_addDecl___lam__2+0x75d) [0x7ffab2a298ed]
/home/ubuntu/.elan/toolchains/leanprover--lean4---v4.22.0/lib/lean/libleanshared.so(l_Lean_addDecl+0x19bb) [0x7ffab2a2d16b]
/home/ubuntu/.elan/toolchains/leanprover--lean4---v4.22.0/lib/lean/libleanshared.so(l_Array_forIn_x27Unsafe_loop___at_____private_Lean_Elab_PreDefinition_Main_0__Lean_Elab_addSorried_spec__0+0x527) [0x7ffab3a485c7]
/home/ubuntu/.elan/toolchains/leanprover--lean4---v4.22.0/lib/lean/libleanshared.so(l___private_Lean_Elab_PreDefinition_Main_0__Lean_Elab_addSorried+0x44) [0x7ffab3a49894]
/home/ubuntu/.elan/toolchains/leanprover--lean4---v4.22.0/lib/lean/libleanshared.so(l_Array_forIn_x27Unsafe_loop___at___Lean_Elab_addPreDefinitions_spec__13___redArg+0x6da9) [0x7ffab3a6c0c9]
/home/ubuntu/.elan/toolchains/leanprover--lean4---v4.22.0/lib/lean/libleanshared.so(l_Lean_Elab_addPreDefinitions___lam__1+0x57e) [0x7ffab3a6db6e]
/home/ubuntu/.elan/toolchains/leanprover--lean4---v4.22.0/lib/lean/libleanshared.so(l_Lean_Elab_addPreDefinitions___lam__1___boxed+0xcc) [0x7ffab3a6e61c]
/home/ubuntu/.elan/toolchains/leanprover--lean4---v4.22.0/lib/lean/libleanshared.so(lean_apply_7+0xc0b) [0x7ffab85b586b]
It's not full log. It's just start.
Pavel Klimov (Oct 01 2025 at 09:20):
Renaming the function doesn't help
Henrik Böving (Oct 01 2025 at 09:20):
What is it that you are doing? #mwe
Pavel Klimov (Oct 01 2025 at 09:21):
I'm just writing normal lean code
Pavel Klimov (Oct 01 2025 at 09:21):
no magic
Henrik Böving (Oct 01 2025 at 09:21):
Please do provide a #mwe, we can't help you without seeing what you are doing
Pavel Klimov (Oct 01 2025 at 09:22):
oh, ok, will try :frown:
Pavel Klimov (Oct 01 2025 at 10:33):
While I'm trying to make mwe, I can tell you also that it also has following error:
Cannot derive parseByteArray._mutual.eq_def
failed to generate equational theorem for 'parseByteArray._mutual'
Pavel Klimov (Oct 01 2025 at 15:07):
here is #mwe
set_option Elab.async false
inductive Ty
| int (width : Nat)
| struct (packed : Bool) (elementTypes : List Ty)
deriving BEq
mutual
def listOfTypesToType : List Ty → Type
| .nil => Empty
| head :: .nil => head.toType
| head :: tail => Prod head.toType (listOfTypesToType tail)
def Ty.toType : Ty → Type
| .int width => BitVec width
| .struct _ elementTypes => listOfTypesToType elementTypes
end
def typeSize : Ty → Nat
| .struct _ elementTypes => 2 + (elementTypes.map typeSize).sum
| _ => 1
theorem typeSizeGeZero : ∀ (a : Ty), (typeSize a) > 0 := by
intro a
cases a with
| int _ => simp_all [typeSize]
| struct _ elementType =>
simp_all [typeSize]
induction elementType with
| nil => simp
| cons x xs ih => omega
mutual
def structParseByteArray (packed : Bool) (types : List Ty) (data : ByteArray) (offset : Nat) :
Except String (listOfTypesToType types) := do
match types with
| .nil => .error "empty struct"
| head :: tail =>
let alignment := if packed then 1 else 8
let alignedOffset := (offset + alignment - 1) / alignment
let nextOffset := alignedOffset + 8
let currentData := data.extract alignedOffset nextOffset
let first ← parseByteArray head currentData
match tail with
| .nil =>
.ok first
| head1 :: tail1 =>
let second ← structParseByteArray packed (head1 :: tail1) data nextOffset
.ok ⟨ first, second ⟩
termination_by (1 + (types.map typeSize).sum)
decreasing_by
. simp; omega
. simp [typeSizeGeZero]
def parseByteArray (type : Ty) (data : ByteArray) :
Except String type.toType := do
match type with
| .struct packed elementTypes => structParseByteArray packed elementTypes data 0
| t => throw s!"not implemented"
termination_by typeSize type
decreasing_by all_goals simp [typeSize]
end
Kim Morrison (Oct 14 2025 at 03:24):
Opening this in live.lean-lang.org does not show any errors.
Pavel Klimov (Oct 14 2025 at 09:18):
As far as I know, in live lean always most recent version of lean4. My code crash in v4.22.0version.
Kim Morrison (Oct 14 2025 at 10:57):
Then upgrade. :-)
Last updated: Dec 20 2025 at 21:32 UTC