我试图在Coq中使用if ... then ... else ...定义一个函数,并在我的条件下为'if'我想测试一个nat是否在一个区间内。
例如a,b,x是nat,我想测试x是否在[a,b]区间内,所以我希望得到像if (le_gt_dec a x)/\(lt_dec x b) then ... else ...
这样的条件,但这不起作用,因为'/ \'所需的类型是两侧的Prop,而le_gt_dec不是Prop。
所以我收到错误:The term "le_gt_dec a x" has type "{a <= x} + {a > x}"
while it is expected to have type "Prop"
我也试过if (le_gt_dec a x)&&(lt_dec x b) then ... else ...
,但这也不起作用。
我现在找到的唯一解决方案就是做一个if ... then ... else ...在另一个内...如果......那么......其他......所以对于我给出的函数IsIn一个例子:
if (le_gt_dec a x) then ( if (le_gt_dec x b) then ... else ... ) else ...
但是通过使用这种技术定义函数,后来当我需要在这些函数上证明东西时会变得非常复杂,因为它会产生很多情况,所以我想知道是否有人有更好的方法来定义这些函数?
答案 0 :(得分:1)
您可能正在搜索此内容:
Require Import Coq.Arith.Arith.
Definition IsIn (a:nat) (b:nat) (x:nat) : bool :=
andb (leb a x) (leb x b).
答案 1 :(得分:0)
只是为了扩展@thoferon的答案:Coq让你添加自己的语法糖,所以你可以写
Notation "A && B" := (andb A B).
Notation "A || B" := (orb A B).
然后
Eval compute in (if true && false then 1 else 0).
= 0 : nat
Eval compute in (if true || false then 1 else 0).
= 1 : nat