如何在coq中定义从自然到自然的分段函数

时间:2017-09-24 16:31:06

标签: coq

如果x <5,我如何定义像f(x)= 0的函数,否则在Coq中f(x)= 1?

如果我像OСaml那样做,

Definition test (i:nat):nat :=
  if i < 5 then 0 else 1.

它抱怨

  

错误:术语i < 5的类型Prop不是(共同)归纳类型。

1 个答案:

答案 0 :(得分:2)

您需要使用可判定的版本的比较(i < 5是一个逻辑或命题版本,您无法计算)。这是在标准库中:

Require Import Arith.
Check lt_dec.

Definition test (i:nat) : nat := if lt_dec i 5 then 0 else 1.

标准库的测试少于返回不是布尔值而是实际上是一个sumbool,其中包括两种情况下的证明,告诉你函数的作用(这些证明在你的例子中没用,但是如果你想证明一下test)。您在{n < m} + {~n < m}类型中看到的lt_dec类型是sumbool (n < m) (~n < m)的符号。

如果您不关心校样,那么您可以使用返回布尔值的其他函数Nat.ltb。标准库还包括此功能的便捷表示法:

Require Import Arith.

Definition test (i:nat) : nat := if i <? 5 then 0 else 1.

在校对中使用此功能时,您需要应用Nat.ltb_lt这样的定理来推断i <? 5返回的内容。

请注意,Coq中的if b then .. else ...支持b是bool或sumbool。实际上,它支持带有两个构造函数的任何归纳类型,并使用then分支作为第一个构造函数,else分支作为第二个构造函数; boolsumbool的定义谨慎地命令其构造函数使if语句按预期运行。