Coq:我如何从一个可判定的道具创建一个布尔?

Coq:我如何从一个可判定的道具创建一个布尔?,coq,Coq,我想将我的程序构造为抽象模块,并编写使用抽象类型的函数。但是我不能使用match来破坏抽象类型,所以我必须创建某种类型的反转引理,但是我也不能match。我试图将我的问题归结为: 首先创建可由可判定类型使用的模块类型 Require Import Decidable. Module Type decType. Parameter T : Type. Axiom decT : forall (a b:T), decidable (a=b). End decType. 下面是一个示例:n

我想将我的程序构造为抽象模块,并编写使用抽象类型的函数。但是我不能使用
match
来破坏抽象类型,所以我必须创建某种类型的反转引理,但是我也不能
match
。我试图将我的问题归结为:

首先创建可由可判定类型使用的模块类型

Require Import Decidable.

Module Type decType.
  Parameter T : Type.
  Axiom decT : forall (a b:T), decidable (a=b).
End decType.
下面是一个示例:
nat
是可判定的。但目标是编写
plus
等,只处理抽象类型。(我已经删除了参数
zero
Succ
,以及它们的要求,以使这里的示例最小化)


到目前为止,我的想法是,我必须在decType模块类型中添加一个布尔函数,如下所示:

Module Type decType.
  Parameter T : Type.
  Axiom decT : forall (a b:T), decidable (a=b).
  Parameter decB : forall (a b:T), {a=b}+{a<>b}.
End decType.
模块类型decType。
参数T:Type。
公理decT:forall(ab:T),可判定(a=b)。
参数decB:forall(ab:T),{a=b}+{ab}。
结束类型。
然后在上面的
nat_dec
模块中定义
decB


这是必须做的吗(即定义函数decB)?如果不经过返回bool的函数,就不可能使用类型是可判定的抽象事实吗?

由于Coq中命题和计算对象的分离,您无法编写此函数(例如,请参阅)

请注意,将
decB
参数添加到模块中会使
可判定
公理变得不必要,因为您可以使用
{p}+{Q}
来派生
p\/Q

我想补充几个相关的注释。首先,我将避免使用Coq模块系统来执行名称空间和编写不透明定义以外的任何操作。如果要编写参数化定义,最好使用依赖记录,例如

Record eqType := {
  sort :> Type; 
  eqb : sort -> sort -> bool;
  eqbP : forall x y, eqb x y = true <-> x = y
}.
这些功能是为每种归纳数据类型自动定义的。它们涉及依赖类型,但您也可以使用它们来执行非依赖类型的递归。尽管这会有点低效,但您也可以通过向它们传递忽略递归调用值的函数(在上面的示例中,第二个函数参数的
tn
参数),将它们用于模式匹配

Module Type decType.
  Parameter T : Type.
  Axiom decT : forall (a b:T), decidable (a=b).
  Parameter decB : forall (a b:T), {a=b}+{a<>b}.
End decType.
Record eqType := {
  sort :> Type; 
  eqb : sort -> sort -> bool;
  eqbP : forall x y, eqb x y = true <-> x = y
}.
nat_rect : forall (T : nat -> Type),
             (* value for 0 *)
             T 0 ->
             (* body for recursive call *)
             (forall n, T n -> T (S n)) ->
             forall n, T n.