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

2023-12-20

很容易表示自由岩浆(二叉叶树)、自由半群(非空列表)和自由幺半群(列表),并且不难证明它们实际上就是它们所声称的那样。但自由团体似乎要棘手得多。似乎至少有两种方法可以使用通常的方法List (Either a)表示:

  1. 将要求编码为类型,如果您有Left a :: Right b :: ... then Not (a = b)反之亦然。建造这些似乎有点困难。
  2. 处理允许任意插入/删除的等价关系Left a :: Right a :: ...成对(反之亦然)。表达这种关系似乎极其复杂。

还有其他人有更好的主意吗?

Edit

我刚刚意识到唯一答案使用的选项(1)在最一般的设置中根本无法工作。特别是,如果不强加可判定的相等性,就不可能定义组运算!

Edit 2

我应该先想到谷歌这个。看起来像约阿希姆·布莱特纳在阿格达做的 https://www.joachim-breitner.de/blog/552-Free_Groups_in_Agda几年前,从他的介绍性描述来看,他似乎从选项 1 开始,但最终选择了选项 2。我想我会自己尝试一下,如果我陷入困境,我会看看他的代码。


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

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)

但这种双重前置对我来说看起来并不乐观。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代表自由团体的好方法是什么? 的相关文章

  • 证明唯一的零长度向量为零

    我有一个类型定义为 Inductive bits nat gt Set bitsNil bits 0 bitsCons forall l bool gt bits l gt bits S l 我试图证明 Lemma emptyIsAlway
  • Ltac:通过回溯重复策略 n 次

    假设我有一个像这样的策略 取自 HaysTac 它搜索一个参数来专门化一个特定的假设 Ltac find specialize in H multimatch goal with v gt specialize H v end 然而 我想写
  • Agda 函数、类型匹配函数

    我想创建一个辅助函数 它将从索引或参数化类型中获取术语并返回该类型参数 showLen len A Set gt Vec A len gt showLen len showType len A Set gt Vec A len gt Set
  • 显示 (head .unit ) = Agda 中的 head

    我试图证明 Agda 中的一个简单引理 我认为这是正确的 如果向量有两个以上元素 则取其head继采取init与取其相同head立即地 我将其表述如下 lem headInit l xs Vec suc suc l gt head init
  • 什么是累积宇宙和“* : *”?

    在阿格达 有Set n 我认为 Set n将 Haskell 风格的值类型种类层次结构扩展到无限级别 那是 Set 0是正常类型的宇宙 Set 1是正常类型的宇宙 Set 2是正常类型的宇宙 等等 相比之下 伊德里斯拥有所谓的 宇宙累积层次
  • 用约翰·梅杰的等式重写

    约翰 梅杰的等式带有以下重写引理 Check JMeq ind r JMeq ind r forall A Type x A P A gt Prop P x gt forall y A JMeq y x gt P y 很容易将其概括为 Le
  • 异常类型和数据构造函数

    我不知道我怎么没有注意到这一点 但是数据构造函数和函数定义都不能使用除 和它的变种 gt 等 由于 gt 的友善签名 即使在 XPolyKinds 这是我尝试过的代码 LANGUAGE DataKinds LANGUAGE KindSign
  • 使用 GADT 在 Haskell 中重新创建 Lisp 的“apply”

    作为练习 我正在尝试重新创建 Lispapply在哈斯克尔 我不打算将其用于任何实际目的 我只是认为这是一个更好地熟悉 Haskell 类型系统和一般类型系统的好机会 所以我也不是在寻找其他人的实现 我的想法如下 我可以使用 GADT 来
  • Idris 中类型的模式匹配

    可能这是基本的 但我不明白为什么下面的函数回答 1fnc Nat并且 对于fnc 整数 它甚至没有作为模式包含在内 fnc Type gt Integer fnc Bool 1 fnc Nat 2 您不能对类型进行模式匹配 也不应该这样做
  • 在Refl中使用重写

    我正在使用 Idris 学习第 8 章类型驱动开发 我有一个关于 rewrite 如何与 Refl 交互的问题 此代码作为重写如何在表达式上工作的示例显示 myReverse Vect n elem gt Vect n elem myRev
  • 使用标准库对 Agda 中的对/列表进行字典顺序排序

    Agda标准库包含一些模块Relation Binary Non StrictLex 目前仅适用于Product and List 我们可以使用这些模块轻松构建一个实例 例如IsStrictTotalOrder对于自然数对 即 open i
  • 阿格达。冒号之前/之后的参数

    定义数据类型时 我可以在冒号之前 传递 一些参数 data Image A B Set f A B B Set where im f A B x A Image f f x 但出于未知原因 我似乎无法在函数声明中执行此操作 exIm A B
  • 无法声明 MonadPlus 接口受 Monad 约束

    我试图像这样声明 MonadPlus 接口 module NanoParsec Plus access public export interface Monad m gt MonadPlus m where zero m a plus m
  • Agda 中实例参数的问题

    我正在尝试遵循 McBride s 的代码如何维持邻居秩序 https personal cis strath ac uk conor mcbride pub Pivotal pdf 并且无法理解为什么 Agda 我正在使用 Agda 2
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 使用 Idris 实现 isLast

    查看 Idris 类型驱动开发中的练习 9 2 data Last List a gt a gt Type where LastOne Last value value LastCons prf Last xs value gt Last
  • 构造微积分中的“Refl”东西?

    在语言中 例如Agda Idris or Haskell对于类型扩展 有一个 键入类似于以下内容的内容 data a b where Refl a a a b意思是a and b是相同的 这样的类型可以定义在结构演算 https en wi
  • 通过(单子)join 和 fmap 进行终止检查替换

    我正在使用大小类型 并且有一个用于键入术语的替换函数 如果我直接给出定义 则终止检查 但如果我通过 单子 连接和 fmap 对其进行分解 则不会进行终止检查 OPTIONS sized types module Subst where op
  • 为什么这个“with”块会破坏这个函数的整体性?

    我正在尝试在自然数上计算奇偶校验和一半的下限 data IsEven Nat gt Nat gt Type where Times2 n Nat gt IsEven n n n data IsOdd Nat gt Nat gt Type w
  • Haskell/Idris 中的开放类型级别证明

    在 Idris Haskell 中 可以通过注释类型并使用 GADT 构造函数 例如使用 Vect 来证明数据的属性 但这需要将属性硬编码到类型中 例如 Vect 必须是与 List 不同的类型 是否有可能拥有具有开放属性集的类型 例如同时

随机推荐