为什么函数addpos以这种方式定义?

时间:2015-03-30 08:06:59

标签: functional-programming coq theorem-proving

以下是函数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.

2 个答案:

答案 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构造函数为正整数定义新类型。