定义Set

时间:2016-01-26 10:19:29

标签: equality coq

我试图在BES中定义变量的等级。 BES被定义为方程列表,变量是命题变量集的居民,它不是归纳类型:

Variable propVar : Set.

Definition rank (E:BES)(x:propVar) : nat :=
let fix block(E':BES)(curMu:bool) : nat := 
match E' with
| nil => fail
| cons (mu xc _) E2 => 
  if xc=x then (if curMu then O else S(O))
    else (if curMu then block E2 true else S(block E2 false))
| cons (nu xc _) E2 => 
  if eqb xc x then (if curMu then S(O) else O)
    else (if curMu then S(block E2 false) else block E2 true)
end
in
block E false.

然而,Coq不接受这个定义,因为xc = x的类型是Prop,而Coq需要某种类型的Bool。

是否可以在propVar上定义类似于bool_dec的可判定等式,以便我可以使用此而不是xc=x

1 个答案:

答案 0 :(得分:1)

你应该添加

Parameter propVardec : forall x y: propVar, {x = y}+{x <> y}.

该陈述增加了propVar的每个元素相同或不同的假设,使您的类型可判定。

你也可以定义

Parameter propVarbeq : propVar -> propVar -> bool.

哪个或多或少相同。主要的区别在于第一个提供了相等(或差异)的证明,其中第二个只告诉你它们是否相等。

如果你实例化了propVar类型,你还应该证明/实例化这两个函数。