2017-09-24 52 views
0

如何在fq(x)= 0的情况下定义函数,如f(x)= 0?如何在coq中定义从自然到分片函数

如果我做这样的事情在OСaml,

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

它抱怨

Error: The term i < 5 has type Prop which is not a (co-)inductive type.

回答

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)会很方便。您在lt_dec的类型中看到的{n < m} + {~n < m}类型的标记为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语句按预期行为。

+0

谢谢!这很有帮助。然而,我真正想要的是像定义词(i:nat)(j:nat)(n:nat):nat = 如果le_dec ji然后i + 1-j else if lt_dec j i + n-1 then j-i + 1 else if j = i + n-1 then 否则2 * n + ij。 coq为什么抱怨说:“术语”i + 1-j“的类型是”nat“ ,而预计会有类型”Set“。” ? –

+1

你很可能使用了错误的等式,试着用'=?'。 – ejgallego