我在COQ中有一个有限的枚举类型(比如T),并希望检查元素是否相等。这意味着,我需要一个功能
bool beq_T(x:T,y:T)
我设法定义这样一个函数的唯一方法是逐个案例分析。这导致了许多匹配语句,看起来非常麻烦。因此,我想知道是否有更简单的方法来实现这一点。
答案 0 :(得分:3)
更简单:Scheme Equality for ...
生成两个函数,分别返回布尔值和sumbool。
答案 1 :(得分:1)
坏消息是,实现beq_T
的程序必须包含两个参数的大型匹配语句。好消息是,您可以使用Coq的战术语言自动生成/合成此程序。例如,给定类型:
Inductive T := t0 | t1 | t2 | t3.
您可以按如下方式定义beq_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已经采用了几乎可以满足您需求的策略。它被称为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.