Предположим, у меня есть тип записи для некоторой алгебраической структуры; например для моноидов:

{-# OPTIONS --cubical #-}

module _ where

open import Cubical.Core.Everything
open import Cubical.Foundations.Everything hiding (assoc)

record Monoid {ℓ} (A : Type ℓ) : Type ℓ where
  field
    set : isSet A

    _⋄_ : A → A → A
    e : A

    eˡ : ∀ x → e ⋄ x ≡ x
    eʳ : ∀ x → x ⋄ e ≡ x
    assoc : ∀ x y z → (x ⋄ y) ⋄ z ≡ x ⋄ (y ⋄ z)

Затем я могу вручную создать тип для гомоморфизмов моноидов:

record Hom {ℓ ℓ′} {A : Type ℓ} {B : Type ℓ′} (M : Monoid A) (N : Monoid B) : Type (ℓ-max ℓ ℓ′) where
  open Monoid M renaming (_⋄_ to _⊕_)
  open Monoid N renaming (_⋄_ to _⊗_; e to ε)
  field
    map : A → B
    map-unit : map e ≡ ε
    map-op : ∀ x y → map (x ⊕ y) ≡ map x ⊗ map y

Но есть ли способ определить Hom без разъяснения законов гомоморфизма? Так что как некое сопоставление свидетеля M : Monoid A с N : Monoid B, но для меня это не имеет большого смысла, потому что это будет "сопоставление", где мы уже знаем, что он должен отображать M на N ...

3
Cactus 5 Окт 2019 в 17:49

1 ответ

Лучший ответ

В настоящее время нет. Но это то, что является продолжением недавней статьи Функция для разделения данные по желанию примерно. В репо для этой работы вы найдете источники для 'package бывший'; в сопроводительной документации используется {{X0} } в качестве одного из примеров, а раздел 2.17 посвящен генерации гомоморфизмов.

Цель этого прототипа - выяснить, какие функции необходимы (и осуществимы), чтобы направлять разработку как метатеории, так и реализации «внутри Agda».

3
Jacques Carette 6 Окт 2019 в 12:20