重新定义Coq中的自然数字类型并尝试使用它时,如下所示:
Inductive Nat: Type :=
| O: Nat
| S: Nat -> Nat.
Fixpoint plus (n: Nat) (m: Nat): Nat :=
match n with
| O => m
| S n' => S (plus n' m)
end.
Fixpoint mult (n: Nat) (m: Nat): Nat :=
match n with
| O => O
| S n' => plus m (mult n' m)
end.
Fixpoint factorial (n: Nat) : Nat :=
match n with
| O => 1
| (S n') => mult n (factorial n')
end.
Coq发出错误
术语“1”的类型为“nat”,而预期类型为“Nat”。
我理解这种行为的原因(实际数字'1'仍然映射到Coq的内置自然数字类型)但是有没有办法修复它? TIA。
答案 0 :(得分:1)
最简单的解决方案当然是
Definition one := S O.
但是,由于您的类型与nat
完全相同,因此您可以声明强制。这看起来像
Inductive Nat : Type :=
| O: Nat
| S: Nat -> Nat.
Fixpoint to_nat (n : nat) : Nat :=
match n with
| S n' => 1 + (to_nat n')
| O => 0
end.
Coercion to_nat : nat >-> Nat.
这告诉coq只要获得to_nat
并且期望nat
就使用Nat
。它允许你使用+
以及特殊的数字文字。