枚举类型的COQ平等

时间:2015-11-14 13:35:23

标签: coq

我在COQ中有一个有限的枚举类型(比如T),并希望检查元素是否相等。这意味着,我需要一个功能

bool beq_T(x:T,y:T)  

我设法定义这样一个函数的唯一方法是逐个案例分析。这导致了许多匹配语句,看起来非常麻烦。因此,我想知道是否有更简单的方法来实现这一点。

2 个答案:

答案 0 :(得分:3)

更简单:Scheme Equality for ...生成两个函数,分别返回布尔值和sumbool。

答案 1 :(得分:1)

坏消息是,实现beq_T的程序必须包含两个参数的大型匹配语句。好消息是,您可以使用Coq的战术语言自动生成/合成此程序。例如,给定类型:

Inductive T := t0 | t1 | t2 | t3.

您可以按如下方式定义beq_T。前两个destruct策略合成了在xy上匹配所需的代码。 match策略检查它所在的匹配分支,并且取决于x = y,该策略要么合成返回truefalse的程序。

Definition beq_T (x y:T) : bool.
  destruct x eqn:?;
  destruct y eqn:?;
  match goal with 
  | _:x = ?T, _:y = ?T |- _ => exact true
  | _ => exact false
  end.
Defined.

如果要查看合成程序,请运行:

Print beq_T.

值得庆幸的是,Coq已经采用了几乎可以满足您需求的策略。它被称为decide equality。它会自动合成一个程序,用于确定类型T中的两个元素是否相等。但是,合成程序不是仅仅返回一个布尔值,而是返回两个元素(in)相等的证明。

Definition eqDec_T (x y:T) : {x = y} + {x <> y}.
  decide equality.
Defined.

通过合成该程序,可以轻松实现beq_T

Definition beq_T' {x y:T} : bool := if eqDec_T x y then true else false.