枚举类型的COQ中的相等性

枚举类型的COQ中的相等性,coq,Coq,我在COQ中有一个有限枚举类型(比如T),我想检查元素是否相等。这意味着,我需要一个函数 bool beq_T(x:T,y:T) 我能够定义这样一个函数的唯一方法是进行个案分析。这会导致大量匹配语句,看起来非常麻烦。因此,我想知道是否有更简单的方法来实现这一点。坏消息是,实现beq\T的程序必须在其两个参数上都包含一个大型匹配语句。好消息是,您可以使用Coq的战术语言自动生成/合成此程序。例如,给定类型: Inductive T := t0 | t1 | t2 | t3. 您可以如下定义

我在COQ中有一个有限枚举类型(比如T),我想检查元素是否相等。这意味着,我需要一个函数

bool beq_T(x:T,y:T)  

我能够定义这样一个函数的唯一方法是进行个案分析。这会导致大量匹配语句,看起来非常麻烦。因此,我想知道是否有更简单的方法来实现这一点。

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

Inductive T := t0 | t1 | t2 | t3.
您可以如下定义
beq\u T
。前两种
destruct
策略综合了在
x
y
上匹配所需的代码。
match
策略检查它所在的匹配分支,根据
x=y
,该策略要么合成返回
true
false
的程序

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已经提供了一种几乎可以满足您需求的策略。它被称为决定平等性。它自动合成一个程序,该程序决定类型
T
的两个元素是否相等。但是,合成的程序不只是返回布尔值,而是返回两个元素相等的证明

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

更简单的是:
Scheme Equality for…
生成两个函数,分别返回一个布尔值和一个sumbool

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