以下是函数addpos的定义,它定义了对整数的自然数的加法。令人费解的是,当n与0匹配时,addpos x2 0给出succZ x2。为什么它不能只是x2?请解释一下。
Fixpoint addpos (x2 : Z) (n : nat) {struct n} : Z :=
match n with
| O ⇒ succZ x2
| S n0 ⇒ succZ (addpos x2 n0)
end.
答案 0 :(得分:1)
我认为,鉴于该功能的名称,这可能是故意行为。 addpos
表示我们正在添加正数;如果我们把“肯定”表示“严格肯定”(例如,标准库中的positive
类型就是这种情况),那么我们看到该函数只是使用了一个元素{{1代表严格正数n : nat
。
答案 1 :(得分:0)
为什么它不能只是x2?
可能应该如此。你从哪里得到这个定义?我的succZ
安装中没有Coq
,因此我必须将其更改为Z.succ
。然后,Eval compute in (addpos 0 0)
会产生1%Z
。定义错误,或者意图添加n
以外的其他内容。
编辑:另一个答案表明它可能确实是为了添加S n
,而定义接受n
作为S n
的编码。我认为这样的编码应该是明确的,因为它很容易实现。例如,通过使用OnePlus
参数的单个nat
构造函数为正整数定义新类型。