如果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
不是(共同)归纳类型。
答案 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
分支作为第二个构造函数; bool
和sumbool
的定义谨慎地命令其构造函数使if
语句按预期运行。