精益定义组

Lean define groups

这是

的后续问题

我尝试了jmc的建议,似乎可行,但后来我卡在了另一个地方。这道题的初衷是定义群和环的范畴,现在显然我无法定义群态射了:

class group :=
(set: Type)
(add: set → set → set)

infix + := group.add

class group_morphism (G H: group) :=
(f: G.set → H.set)
(additive: ∀ g h : G.set, f(g + h) = (f g) + (f h))

我在第一个 + 时遇到错误。 Lean 似乎认为 this 指的是 H.add,而它应该指的是 G.add.

您正在重新定义 + 表示法,这很快就会让人头疼。有一个多态的 + 符号是很有帮助的。 (你将如何表示环中的加法?)

进一步的观点:

  • 你应该使用 structure 而不是 class
  • 在数学上,您定义的是幺半群和幺半群 homs,而不是群和群 homs

这虽然有效

(set: Type)
(add: set → set → set)

def add {G : group} := group.add G

class group_morphism (G H: group) :=
(f: G.set → H.set)
(additive: ∀ g h : G.set, f(add g h) = add (f g) (f h))

问题是组不应该是 class。如果您查看 group.add 的类型,通过 #check @group.add 您将得到

group.add : Π [c : group], group.set → group.set → group.set

c : group 两边的方括号表示这是一个隐式参数,将由类型 class 推断得出。您不必明确键入此参数,但 Lean 会尝试找出它是什么。类型 class 推理最适用于你只想使用一个居民的类型。

mathlib 中群的定义更接近于

class group (set : Type) :=
(add : set → set → set)

在一个特定的类型上,通常只有一个你想引用的组结构,所以在 mathlib 中,像 add_group int 这样的类型只有一个你关心的居民。

Lean 自动选择 H 作为类型 group 的典型代表,但这不是您想要的。

所以通常当你处理组时,类型和组结构被保存为单独的对象,它们不会成对出现。然而对于范畴论,通常的做法是行不通的,一个对象是一对类型和组结构。

mathlib 中的设置更接近于以下内容。 coe_to_sort 告诉精益如何获取 group_obj 并将其解释为类型而无需显式写入 G.set,group_obj_group 实例告诉精益如何自动推断组结构group_obj

的类型
class group (set : Type) :=
(add: set → set → set)

structure group_obj :=
(set : Type)
(group : group set)

instance coe_to_sort : has_coe_to_sort group_obj :=
{ S := Type, 
  coe := group_obj.set }

instance group_obj_group (G : group_obj) : group G := G.group

infix `+` := group.add

structure group_morphism (G H : group_obj) :=
(f: G → H)
(additive: ∀ g h : G.set, f(g + h) = (f g) + (f h))