很容易表示自由岩浆(二元叶子树),自由半群(非空列表)和免费幺半群(列表),并且不难证明它们实际上是他们声称的。但自由团体似乎更棘手。似乎至少有两种方法可以使用通常的JarSplicer
表示法:
List (Either a)
,那么Left a :: Right b :: ...
,反之亦然。构建这些似乎有点困难。Not (a = b)
对(反之亦然)。表达这种关系似乎非常复杂。其他人有更好的主意吗?
我刚刚意识到唯一的答案所使用的选项(1)根本无法在最常规的设置中工作。特别是,如果不实施可判定的平等,就无法定义组操作!
我应该首先考虑Google。几年前它看起来像Joachim Breitner did it in Agda,从他的介绍性描述来看,看起来他从选项1开始,但最终选择了选项2.我想我会自己尝试,如果我太过困难我会看看他的代码。
答案 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)
但这个双重前置对我来说并不合适。