You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Lean中定义loop类时的菱形继承报错问题

问题根源

该报错由菱形继承导致的字段重复冲突引起:quasigroup和unital都继承自magma,Lean默认会为两个父类分别生成独立的to_magma字段,导致loop结构中出现两个同名的magma实例声明,无法通过编译。

解决方案1:启用旧结构命令(最简便)

在代码开头添加set_option old_structure_cmd true即可,该选项会让Lean沿用旧版结构继承逻辑,允许多个父类共享同一祖先结构的字段,不会重复生成to_magma字段。修改后的完整代码如下:

set_option old_structure_cmd true
universe u

class magma (α : Type u) :=
  ( add : α → α → α )

class unital (α : Type u) extends magma α :=
  ( unit : α )
  ( left_id : ∀ a : α, add unit a = a )
  ( right_id : ∀ a : α, add a unit = a )

class quasigroup (α : Type u) extends magma α :=
  ( left_div : α → α → α )
  ( right_div : α → α → α )
  ( left_cancel : ∀ a b : α, add a (left_div a b) = b )
  ( right_cancel : ∀ a b : α, add (right_div b a) a = b )

class loop (α : Type u) extends quasigroup α, unital α

解决方案2:显式绑定magma实例(无需修改全局选项)

如果不想启用全局的旧结构命令,可以显式指定unital使用的magma实例来自已经继承的quasigroup,避免重复声明,写法如下:

universe u

class magma (α : Type u) :=
  ( add : α → α → α )

class unital (α : Type u) extends magma α :=
  ( unit : α )
  ( left_id : ∀ a : α, add unit a = a )
  ( right_id : ∀ a : α, add a unit = a )

class quasigroup (α : Type u) extends magma α :=
  ( left_div : α → α → α )
  ( right_div : α → α → α )
  ( left_cancel : ∀ a b : α, add a (left_div a b) = b )
  ( right_cancel : ∀ a b : α, add (right_div b a) a = b )

-- 显式指定unital的magma实例来自quasigroup导出的实例
class loop (α : Type u) extends quasigroup α, @unital α (quasigroup.to_magma α)

两种方案都可以正常编译,实现同时具备quasigroup和unital性质的loop结构。

内容的提问来源于stack exchange,提问作者Wheat Wizard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:54:01