如何编写一个接受长度小于3的Vect的Idris函数

强奸

伊德里斯1.2.0。我试图自动找到向量长度小于3的证明。

f : {n : Nat} -> {auto prf: n < 3 = True} -> Vect n a -> ()
f v = ()

f' : {n : Nat} -> {auto prf: isJust (natToFin n 3) = True} -> Vect n a -> ()
f' v = ()

这两种类型检查都可以使用f {n=2} [1, 2},甚至可以使用f (the (Vect 2 Nat) [1, 2])但是当我将其命名为时f [1, 2],我得到

When checking argument x to constructor Data.Vect.:::
    No such variable len

我还尝试了另一种方法:

g : {x : Fin 3} -> Vect (finToNat x) a -> ()
g v = ()

这也适用g {x=2} [1, 2],但再次失败g [1, 2]

When checking an application of function Main.g:
    Type mismatch between
            Vect 2 Integer (Type of [1, 2])
    and
            Vect (finToNat x) Integer (Expected type)

    Specifically:
            Type mismatch between
                    2
            and
                    finToNat x

好的,我猜这两个表达式在x未知时不会还原为相同的规范形式

我不明白第一个错误。我怀疑它与[]语法重载有关。我究竟做错了什么?

加莱

当尝试解决统一问题时,Idris不会尝试逆转(内射)函数finToNat来猜测其值因此,它只是卡住了。xfinToNat x = 2

在更一般的水平上,而不是将计算推入类型或在隐式参数中进行证明搜索,我将通过以下两种方法来表示有界向量:

record BoundedVec (n : Nat) (a : Type) where
  size : Nat
  less : LTE size n
  vect : Vect size a

或者,遵循Agda的标准库

data BoundedVec : (n : Nat) -> (a : Type) -> Type where
  Nil  : BoundedVec n a
  Cons : a -> BoundedVec n a -> BoundedVec (S n) a

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Idris中,如何编写一个带参数索引功能的“ vect生成器”函数

如何使一个函数接受一个数字数组并给出小于70的数字?

我如何编写一个函数,该函数接受符合Codable的任何对象

如何声明一个函数接受右值的任意长度数组

如何编写一个不断读取一组行并标记行长度的C函数

定义一个函数或循环,如果给定的整数参数小于X,则该函数或循环重新启动,或者拒绝接受小于3的值

如何在Julia中编写一个接受可变数量参数的函数?

如何编写一个scala函数来接受两种类型的参数?

如何编写一个接受包含整数元素的元组的函数?

如何用 ... (dot-dot-dot) 编写一个也可以接受 tidyselect 助手的函数?

如何编写一个接受参数并将其添加到数组的函数?

如何编写一个接受列表作为参数并返回列表中值总和的函数?

如何编写一个可以接受一个或多个参数并发送回加法的函数

如何在 c 中编写一个函数 char* 来返回按长度排序的单词?

如何编写一个生成小于给定数字的斐波那契数列的函数(javascript)?

如何编写一个接受类型名的宏?

如何编写一个接受参数的NectarJS程序?

如何编写一个接受文件或标准输入的脚本?

如何使用递归编写一个函数,该函数接受 2 个整数并返回一个包含 2 个输入整数之间的整数的数组

如何在Rust中编写一个通用函数,该函数可以接受实现特定属性的任何结构?

如何编写一个函数,该函数接受可变数量的参数(整数)并使用stdargs输出它们?

如何编写一个接受一个数字并返回一个三元组列表的函数“三元组”?

如何在Idris中为Vect编写正确的类型签名?

编写一个接受 1 个参数的函数:一个字符串,s。它必须返回一个整数,表示 s? 中最长的神奇子序列的长度?

编写一个接受两个字符串并在python 3中返回True的函数

编写一个接受字符串数组并返回双精度值的函数,产生这些字符串的平均长度

我将如何编写一个函数,该函数接受一个正整数数组并返回数字上的阶乘数组?

编写一个函数,该函数接受包装的常量,但仅深一层

如何编写一个TypeScript函数来接受将接口实现为参数的类?