为什么不能在这个依赖类型的程序中求和推断0 + n = n?

巴库留

我开始使用Coq,我想定义一些依赖类型的程序。考虑以下:

Inductive natlist : nat -> Type :=
  | natnil : natlist 0
  | natcons : forall k, nat -> natlist k -> natlist (S k).

Fixpoint natappend (n:nat) (l1: natlist n) (m:nat) (l2: natlist m) : natlist (n+m) :=
  match l1 with
    | natnil => l2
    | natcons _ x rest => natcons (n+m) x (natappend rest l2)
  end.

因此,natlist k将是一个nat长度s的列表k串联定义的问题natappend是以下错误:

错误:
在环境中
natappend:全部n:nat,
            natlist n->
            forall m:nat,
            natlist m-> natlist(n + m)
n:自然
l1:纳豆
m:纳特
l2:纳豆
术语“ l2”的类型为“ natlist m”
虽然应该有类型
 “ natlist(?n @ {n1:= 0} + m)”。

如您所见,该子句存在问题:

| natnil => l2

因为它声称的类型为l2natlist m而结果类型必须为natlist (n+m) = natlist (0+m)

我知道Coq不能在类型级别解析任意表达式以避免非终止计算,但是我感到奇怪的是,即使这种简单的情况也无法解决。

我在Linux上运行CoqIDE,版本为:

The Coq Proof Assistant, version 8.5 (February 2016)
  compiled on Feb 22 2016 18:19:5 with OCaml 4.02.2

我已经看到了使用MacOSX版本的实时类,其代码类似于上面在IDE中编译的代码,并且没有该错误,所以我有些困惑。

我必须设置一些设置以启用更多类型推断并允许上述类型的代码吗?或者:如何编写不依赖类型推断的依赖类型代码?

亚瑟·阿兹维多·德·阿莫林

问题是您在第二个分支中有类型错误。这是一个有效的版本:

Fixpoint natappend {n m:nat} (l1 : natlist n) (l2 : natlist m) : natlist (n + m) :=
  match l1 with
  | natnil => l2
  | natcons n' x rest => natcons (n' + m) x (natappend rest l2)
  end.

此版本与原始版本之间的关键区别是传递给的参数natcons:此处为n' + m,而之前为n + m

此示例很好地说明了Coq中错误消息的非本地性的一个普遍问题,尤其是在编写依赖类型的程序时。即使Coq抱怨第一分支,问题实际上出在第二分支。match如@jbapple所建议,语句中添加注释在尝试诊断出问题时会很有用。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么不能在这个依赖类型的程序中求和推断0 + n = n?

来自分类Dev

在这篇Kmett CRC文章中,为什么ab = a0 ^ n + 0 ^ mb?这个符号是什么意思?

来自分类Dev

(.N)在这个扩展的glob中做什么?

来自分类Dev

在这个扩展的glob中,(.N)有什么作用?

来自分类Dev

为什么\ n和<br>不能在字符串中工作?

来自分类Dev

为什么我不能在给定的字符串中替换\ n?

来自分类Dev

(n--!= 0){}在这段代码中做什么?

来自分类Dev

如何从python列表中删除u'\ n \ n \ n \ n \ n \ n \ n \ n \ n'和u'\ xa0'

来自分类Dev

为什么键盘快捷键Ctrl-Alt-N不能在Visual Studio Code中工作?

来自分类Dev

为什么2 ^ 31不能被n整除?

来自分类Dev

为什么EOF(文件末尾)不能在没有'\ n'的行末尾工作?

来自分类Dev

为什么O(n / 2 + 5 log n)O(log n)而不是O(n log n)?

来自分类Dev

为什么{a ^ na ^ n | n> = 0}是否正常?

来自分类Dev

为什么O(n log n)大于O(n)?

来自分类Dev

为什么range(n)中的_比[“”] * n中的_慢?

来自分类Dev

为什么setw(n)在这里不起作用?

来自分类Dev

为什么〜N在JavaScript中执行-(N + 1)?

来自分类Dev

为什么这个 n-body 程序的特定 C++ 实现比 Java 版本更快?

来自分类Dev

类型“ N [P]”不能用于索引类型“ IComponents <N>”

来自分类Dev

求和小于O(N)

来自分类Dev

是否`alignof(N)== sizeof(N)`其中N是整数类型?

来自分类Dev

M个主教不能在N * N棋盘中走几个格?

来自分类Dev

n&〜(n-1)这个函数做什么?

来自分类Dev

什么是 Sybase ASE 中以“N”结尾的类型?

来自分类Dev

为什么这个时间复杂度为O(n)?

来自分类Dev

在C ++中,(n&(n-1))== 0和n&(n-1)== 0的作用是什么?

来自分类Dev

为什么这个scanf格式字符串不起作用?“%[^ \ n] \ n”

来自分类Dev

为什么这个简单的O(n)Haskell算法表现得更像O(2 ^ n)?

来自分类Dev

为什么这个为O(n ^ 2)代码执行速度比为O(n)?

Related 相关文章

  1. 1

    为什么不能在这个依赖类型的程序中求和推断0 + n = n?

  2. 2

    在这篇Kmett CRC文章中,为什么ab = a0 ^ n + 0 ^ mb?这个符号是什么意思?

  3. 3

    (.N)在这个扩展的glob中做什么?

  4. 4

    在这个扩展的glob中,(.N)有什么作用?

  5. 5

    为什么\ n和<br>不能在字符串中工作?

  6. 6

    为什么我不能在给定的字符串中替换\ n?

  7. 7

    (n--!= 0){}在这段代码中做什么?

  8. 8

    如何从python列表中删除u'\ n \ n \ n \ n \ n \ n \ n \ n \ n'和u'\ xa0'

  9. 9

    为什么键盘快捷键Ctrl-Alt-N不能在Visual Studio Code中工作?

  10. 10

    为什么2 ^ 31不能被n整除?

  11. 11

    为什么EOF(文件末尾)不能在没有'\ n'的行末尾工作?

  12. 12

    为什么O(n / 2 + 5 log n)O(log n)而不是O(n log n)?

  13. 13

    为什么{a ^ na ^ n | n> = 0}是否正常?

  14. 14

    为什么O(n log n)大于O(n)?

  15. 15

    为什么range(n)中的_比[“”] * n中的_慢?

  16. 16

    为什么setw(n)在这里不起作用?

  17. 17

    为什么〜N在JavaScript中执行-(N + 1)?

  18. 18

    为什么这个 n-body 程序的特定 C++ 实现比 Java 版本更快?

  19. 19

    类型“ N [P]”不能用于索引类型“ IComponents <N>”

  20. 20

    求和小于O(N)

  21. 21

    是否`alignof(N)== sizeof(N)`其中N是整数类型?

  22. 22

    M个主教不能在N * N棋盘中走几个格?

  23. 23

    n&〜(n-1)这个函数做什么?

  24. 24

    什么是 Sybase ASE 中以“N”结尾的类型?

  25. 25

    为什么这个时间复杂度为O(n)?

  26. 26

    在C ++中,(n&(n-1))== 0和n&(n-1)== 0的作用是什么?

  27. 27

    为什么这个scanf格式字符串不起作用?“%[^ \ n] \ n”

  28. 28

    为什么这个简单的O(n)Haskell算法表现得更像O(2 ^ n)?

  29. 29

    为什么这个为O(n ^ 2)代码执行速度比为O(n)?

热门标签

归档