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