定义Coq中整数上的加法

定义Coq中整数上的加法,coq,Coq,在定义Coq中的整数时,我遵循的是来自的答案,但当试图在Coq上定义加法时,总是会出现错误,无法猜测递减参数。我尝试过多种不同的定义,但似乎总是发生这种情况。有没有办法证明Coq的论点在减少?或者我缺少了一些明确的方法来定义加法 Inductive nat : Type := (*Natural numbers*) | O | S (n : nat). Fixpoint plus (n:nat) (m:nat) : nat := (*Addition of natural numbers*)

在定义Coq中的整数时,我遵循的是来自的答案,但当试图在Coq上定义加法时,总是会出现错误,无法猜测递减参数。我尝试过多种不同的定义,但似乎总是发生这种情况。有没有办法证明Coq的论点在减少?或者我缺少了一些明确的方法来定义加法

Inductive nat : Type := (*Natural numbers*)
| O
| S (n : nat).

Fixpoint plus (n:nat) (m:nat) : nat := (*Addition of natural numbers*)
match n with
| O => m
| S(n') => S(plus n' m) 
end.

Notation "x + y" := (plus x y).

Inductive Z := (*Integers*)
  | Positive : nat -> Z   
  | Negative : nat -> Z.  

Fixpoint plus (n:Z) (m:Z) : Z := (*Addition of integers*)
match n, m with
| Positive O , _ => m
| _, Positive O => n
| Negative O , _ => m
| _, Negative O => n
| Positive (S n'), Positive (S m') => Positive (n' + m')
| Positive (S n'), Negative (S m') => plus (Positive n') (Negative m')
| Negative (S n'), Positive (S m') => plus (Positive n') (Negative m') 
| Negative (S n'), Negative (S m') => Negative (n'+ m') 
end.

在Coq中,您可以定义的唯一递归函数是那些对其参数的子项执行递归调用的函数。虽然正n'比正sn'小,这保证了递归调用是安全的,但它不是正sn'的子项,一个不会出现在另一个内部。因此,Coq无法识别您的函数总是终止并拒绝它

解决方案是定义无递归的加法:

Definition plusZ (n1 n2 : Z) : Z :=
  match n1, n2 with
  | Positive n1, Positive n2 => Positive (n1 + n2)
  | Negative n1, Negative n2 => Negative (n1 + n2)
  | Positive n1, Negative n2 =>
    if n2 <=? n1 then Positive (n1 - n2)
    else Negative (n2 - n1)
  | Negative n1, Positive n2 => (* Analogous to the previous case *)
  end.

在这里,在Coq中,您可以定义的唯一递归函数是那些对其参数的子项执行递归调用的函数。虽然正n'比正sn'小,这保证了递归调用是安全的,但它不是正sn'的子项,一个不会出现在另一个内部。因此,Coq无法识别您的函数总是终止并拒绝它

解决方案是定义无递归的加法:

Definition plusZ (n1 n2 : Z) : Z :=
  match n1, n2 with
  | Positive n1, Positive n2 => Positive (n1 + n2)
  | Negative n1, Negative n2 => Negative (n1 + n2)
  | Positive n1, Negative n2 =>
    if n2 <=? n1 then Positive (n1 - n2)
    else Negative (n2 - n1)
  | Negative n1, Positive n2 => (* Analogous to the previous case *)
  end.

这里,阿泽维德·德·阿莫林谢谢你的回答。这个加法在计算上似乎很昂贵。在Coq中是否有其他方法来计算递归函数而不是原始递归函数?也许这样我可以归纳地证明一个函数总是终止的?Coq可以表示一般的有充分根据的递归cf,尽管它比标准的结构递归使用起来不太方便。然而,如果您真的关心性能,那么最好使用整数的二进制表示法,例如标准库中的Z类型,或者将算术代码提取为更有效的表示法,例如Azevede De Amorim感谢您的回答。这个加法在计算上似乎很昂贵。在Coq中是否有其他方法来计算递归函数而不是原始递归函数?也许这样我可以归纳地证明一个函数总是终止的?Coq可以表示一般的有充分根据的递归cf,尽管它比标准的结构递归使用起来不太方便。然而,如果您真的关心性能,那么最好使用整数的二进制表示形式,例如标准库中的Z类型,或者将算术代码提取为更有效的表示形式,例如。