有没有办法将“和”两个决策程序合二为一?

时间:2014-02-01 15:12:36

标签: coq

我试图在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 ...

但是通过使用这种技术定义函数,后来当我需要在这些函数上证明东西时会变得非常复杂,因为它会产生很多情况,所以我想知道是否有人有更好的方法来定义这些函数?

2 个答案:

答案 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