作为 Coq 新手,我被这个问题难住了。希望有人能帮忙!
给定 Coq 中有限类型的编码如下 -
Fixpoint fin (n : nat) : Type :=
match n with
| 0 => False
| S m => option (fin m)
end.
是否可以定义一个函数,将值从 提升fin (S n)
到fin (S (S n))
,同时保持值不变。因此,我希望有以下等式,例如 -
@up 2 (None : fin 2) = (None : fin 3)
@up 2 (Some None : fin 2) = (Some None : fin 3)
我想写这个 -
Fixpoint up {n:nat} : fin (S n) -> fin (S (S n)) :=
fun p => match p with
| None => None
| Some p' => Some (up p)
但它被拒绝了。直观地,我明白这是可能的,因为 - 的成员fin 2 - None, Some None
是 的成员fin 3 - None, Some None, Some (Some None)
等等。但我无法为它编写函数。我怀疑这是因为递归定义必须处理@up 0
应该有一个空匹配的地方,但我不确定如何编写这种情况。任何帮助都将不胜感激!谢谢
一种有用的调试方法是用证明模式对应部分替换您的定义,看看发生了什么:
如果你这样做了,你会发现你正在尝试构建一个类型
option (option (fin n))
知识的术语:显然
up p
没有类型检查但实际上你想太多了,这里不需要归纳,所以
fin (S n)
你option n
可以直接定义up {n} : fin n -> fin (S n)
为Some
:您将需要依赖模式匹配才能对您的术语进行正确的类型检查。
您的结构参数只能是,因为
n
这是您的的唯一参数Fixpoint
。您的递归调用必须应用于的子项,n
因此您需要在某处。match
n
我赞成下面的解决方案,返回类型
fin n -> fin (S n)
,它更通用一些,但您可以fin (S n) -> fin (S (S n))
稍后根据需要对其进行专门化: