什么是代表自由团体的好方法?

时间:2015-05-22 03:42:49

标签: agda dependent-type idris

很容易表示自由岩浆(二元叶子树),自由半群(非空列表)和免费幺半群(列表),并且不难证明它们实际上是他们声称的。但自由团体似乎更棘手。似乎至少有两种方法可以使用通常的JarSplicer表示法:

  1. 在类型中对代码进行编码,如果您有List (Either a),那么Left a :: Right b :: ...,反之亦然。构建这些似乎有点困难。
  2. 研究等价关系,允许任意插入/删除Not (a = b)对(反之亦然)。表达这种关系似乎非常复杂。
  3. 其他人有更好的主意吗?

    修改

    我刚刚意识到唯一的答案所使用的选项(1)根本无法在最常规的设置中工作。特别是,如果不实施可判定的平等,就无法定义组操作!

    编辑2

    我应该首先考虑Google。几年前它看起来像Joachim Breitner did it in Agda,从他的介绍性描述来看,看起来他从选项1开始,但最终选择了选项2.我想我会自己尝试,如果我太过困难我会看看他的代码。

1 个答案:

答案 0 :(得分:1)

作为第一个近似值,我将此数据类型定义为

open import Relation.Binary.PropositionalEquality
open import Data.Sum
open import Data.List

infixr 5 _∷ᶠ_

invert : ∀ {α} {A : Set α} -> A ⊎ A -> A ⊎ A
invert (inj₁ x) = inj₂ x
invert (inj₂ x) = inj₁ x

data Consable {α} {A : Set α} (x : A ⊎ A) : List (A ⊎ A) -> Set α where
  nil  : Consable x []
  cons : ∀ {y xs} -> x ≢ invert y -> Consable x (y ∷ xs)

data FreeGroup {α} {A : Set α} : List (A ⊎ A) -> Set α where
  []ᶠ  : FreeGroup []
  _∷ᶠ_ : ∀ {x xs} -> Consable x xs -> FreeGroup xs -> FreeGroup (x ∷ xs)

另一个变体是

data FreeGroup {α} {A : Set α} : List (A ⊎ A) -> Set α where
  Nil   : FreeGroup []
  Cons1 : ∀ x -> FreeGroup (x ∷ [])
  Cons2 : ∀ {x y xs} -> x ≢ invert y -> FreeGroup (y ∷ xs) -> FreeGroup (x ∷ y ∷ xs)

但这个双重前置对我来说并不合适。