Проблема в том, что группа не должна быть классом. Если вы посмотрите на тип group.add
, по #check @group.add
вы получите
group.add : Π [c : group], group.set → group.set → group.set
Квадратные скобки вокруг c : group
указывают, что это неявный аргумент, который будет выводиться путем вывода класса типов. Вам не нужно явно вводить этот аргумент, но Lean попытается выяснить, что это такое. Вывод класса типов лучше всего работает для типов, в которых есть только один обитатель, который вы хотите использовать.
В mathlib определение группы ближе к
class group (set : Type) :=
(add : set → set → set)
В конкретном типе обычно есть только одна групповая структура, на которую вы хотите сослаться, поэтому в mathlib тип, подобный add_group int
, имеет только одного обитателя, о котором вы заботитесь.
Lean автоматически выбрал H
в качестве канонического представителя типа group
, но это не тот тип, который вам нужен.
Поэтому обычно, когда вы имеете дело с группами, тип и структура группы сохраняются как отдельные объекты, а не объединяются в пару. Однако для теории категорий обычный подход не работает, объект представляет собой пару типа и групповой структуры.
Настройка в mathlib ближе к следующему. coe_to_sort
сообщает Lean, как взять group_obj
и интерпретировать его как тип без явного написания G.set, экземпляр group_obj_group
сообщает Lean, как автоматически вывести структуру группы по типу 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))
person
Christopher Hughes
schedule
16.04.2021