有限的数字如何运作? (依赖类型)

2023-11-24

我对依赖类型语言感兴趣。有限数对我来说似乎非常有用。例如,安全地索引固定大小的数组。但这个定义对我来说并不清楚。

Idris 中有限数的数据类型可以如下:(Agda 中可能类似)

data FiniteNum : Natural -> Type where
  FZero : FiniteNum (Succ k)
  FSucc : FiniteNum k -> FiniteNum (Succ k)

它似乎有效:

exampleFN : FiniteNum (Succ (Succ Zero))
exampleFN = FSucc FZero -- typechecks
-- exampleFN = FSucc (FSucc FZero)  -- won't typecheck

但这是如何运作的呢? k 是什么意思?为什么类型检查器接受第一个实现并拒绝第二个实现?


将索引视为上限对于任何可以表示为的数字Fin n。例如,Fin 4包含所有小于的自然数4。这是一个数据声明:

data Fin : ℕ → Set where

这个定义与此有何关系?自然数的定义有两部分:zero and suc; for Fin,我们称之为fzero and fsuc.

根据我们的上限解释,fzero可以给定任何上限,只要它不是zero(0≮0)。我们如何表示边界可以是除zero?我们可以简单地通过应用来强制执行suc:

fzero : {k : ℕ} → Fin (suc k)

这正是我们所需要的:没有人可以写fzero其类型为Fin 0.

Now the fsuc情况:我们有一个有上限的数字k我们希望创造一个继任者。关于上限我们能知道什么?它肯定至少增加一:

fsuc : {k : ℕ} → Fin k → Fin (suc k)

作为练习,说服自己所有数字都小于n可以表示为Fin n(只有一种可能的方式)。


类型检查器如何接受一个并拒绝另一个?在这种情况下,这是简单的统一。我们看一下这段代码:

test : Fin (suc (suc zero))
test = ?

当我们写的时候fsuc,Agda 必须计算出 的值k。为此,需要查看fsuc构造函数:构造一个类型的值Fin (suc k)我们需要suc k = suc (suc zero);通过统一这两者,我们得到k = suc zero。接下来:

test = fsuc ?

现在,下面的表达式fsuc(代表为?, a hole) 有一个类型Fin (suc zero) (since k = suc zero)。当我们填写fzero,Agda试图统一suc zero with suc k₂,当然解决方案会成功k₂ = zero.

如果我们决定再投入一个fsuc:

test = fsuc (fsuc ?)

然后使用与上面相同的统一,我们得到孔的类型必须是Fin zero。到目前为止,这种类型检查得很好。然而,当你尝试填充时fzero在那里,Agda 必须统一zero with suc k₃- 无论其价值k₃, suc某事永远不可能zero,因此失败并出现类型错误。


有限数的另一种表示形式(可以说不太好用)是一对自然数和它小于界限的证明。

open import Data.Product

Fin' : ℕ → Set
Fin' n = Σ ℕ (λ k → k < n)

原本的Fin可以被认为是一个版本Fin'证明被直接烘焙到构造函数中。

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

有限的数字如何运作? (依赖类型) 的相关文章

  • 如何在 Idris 中表达范围有效性?

    我正在尝试在 Idris 中构建一个简单的调查表单 目前正在努力验证用户输入 该输入以字符串形式出现 所提出问题的类型 目前我有以下几种类型 data Question Type where QCM numOptions Nat gt qu
  • 根据参数值返回不同类型的通用函数

    我有一个保存寄存器的结构 我想要我的read register函数返回一个u8 for Register V0 and Register V1 but a u16 for Register V2 and Register V3 我不确定如何
  • Haskell 中 Idris 的 Fin 的首选替代方案是什么

    我想要一个可以包含 0 到 n 值的类型 其中 n 位于类型级别 我正在尝试类似的事情 import GHC TypeLits import Data Proxy newtype FiniteNat n FiniteNat toIntege
  • 依赖类型的 ghc-7.6 类实例

    异构列表是 ghc 7 6 的新依赖类型工具给出的示例之一 data HList gt where HNil HList HCons a gt HList t gt HList a t 示例列表 li 编译良好 li HCons Int H
  • Haskell 版本的 Idris !-表示法(爆炸表示法)

    我最近有幸学习了一些 Idris 我发现非常方便的一件事是 符号 https idris2 readthedocs io en latest tutorial interfaces html highlight do 20notation
  • 如何使用 Agda 的分隔延续实现?

    我们可以很容易地在 Agda 中实现定界延续 monad 然而 没有必要 因为 Agda 标准库 已经定界延续单子的实现 http www cse chalmers se nad listings lib 0 7 Category Mona
  • 什么是累积宇宙和“* : *”?

    在阿格达 有Set n 我认为 Set n将 Haskell 风格的值类型种类层次结构扩展到无限级别 那是 Set 0是正常类型的宇宙 Set 1是正常类型的宇宙 Set 2是正常类型的宇宙 等等 相比之下 伊德里斯拥有所谓的 宇宙累积层次
  • 在scala shapeless中,是否可以使用文字类型作为泛型类型参数?

    假设我正在编写一个向量乘法程序 按照本文的要求 https etrain github io 2015 05 28 type safe 线性 algebra in scala https etrain github io 2015 05 2
  • Idris:函数使用 Nat 参数,但使用 Integer 参数时类型检查失败

    我是伊德里斯的新手 我正在尝试类型 我的任务是制作一个 洋葱 一个带有两个参数的函数 一个数字和任何东西 并将任何东西放入List嵌套了这么多次 例如 结果为mkOnion 3 Hello World 应该 Hello World 我做了这
  • 同一个构造函数是否可以有不同的行为?

    我正在写一个 SQL 解释器 我需要区分编译时格式错误的表达式和运行时错误 我将给您提供一个应该格式良好但可能在运行时失败的示例 SELECT ColumnName first name AS name FROM TABLE people
  • Idris 中类型的模式匹配

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

    这几天我一直在为一个问题绞尽脑汁 但我的 Agda 技能不是很强 我正在尝试在仅在特定索引处定义的索引数据类型上编写一个函数 这仅适用于数据构造函数的某些专门化 我不知道如何定义这样的函数 我试图将我的问题简化为一个更小的例子 该设置涉及自
  • 如何解释agda中的REL

    我试图理解 Agda 标准库的某些部分 但我似乎无法弄清楚REL FWIW 这是定义REL Binary relations Heterogeneous binary relations REL a b Set a Set b Level
  • 在Refl中使用重写

    我正在使用 Idris 学习第 8 章类型驱动开发 我有一个关于 rewrite 如何与 Refl 交互的问题 此代码作为重写如何在表达式上工作的示例显示 myReverse Vect n elem gt Vect n elem myRev
  • 使用异质等式 =

    到目前为止我所拥有的是 module Foo postulate P P postulate NP NP complexityProof P NP complexityProof complexityProof rhs 但在尝试加载文件时
  • 如何在 MMT 中粘合/识别两个结构中的内含物?

    我想形式化形式语言及其语义MMT https uniformal github io 并定义一个一般概念语义等价两种语义 one句法 准确地说 对后者进行编码实际上是一种识别 粘合 我不知道如何在 MMT 中做到这一点 接下来让我详细说明我
  • 如何学习阿格达

    我正在努力学习agda 但是 我遇到了一个问题 我在 agda wiki 上找到的所有教程对我来说都太复杂了 并且涵盖了编程的不同方面 在并行阅读了 3 个关于 agda 的教程后 我能够编写简单的证明 但我仍然没有足够的知识来使用它来实现
  • 在 Idris 中,我可以证明自由定理吗? `forall t 类型的唯一(全部)函数。 t -> t` 是 `id`?

    对于足够多态的类型 参数性可以唯一地确定函数本身 参见瓦德勒的定理免费 http www cs sfu ca CourseCentral 831 burton Notes July14 free pdf了解详情 例如 唯一具有类型的总函数f
  • 构造微积分中的“Refl”东西?

    在语言中 例如Agda Idris or Haskell对于类型扩展 有一个 键入类似于以下内容的内容 data a b where Refl a a a b意思是a and b是相同的 这样的类型可以定义在结构演算 https en wi
  • 为什么这个“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

随机推荐