Coq数据类型冲突

时间:2013-06-25 14:10:38

标签: types coq

重新定义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。

1 个答案:

答案 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。它允许你使用+以及特殊的数字文字。