在Coq中表达可数无限的惯用方法是什么?

时间:2014-10-08 01:48:15

标签: coq

假设我希望断言存在可数无数的不同x : X。我的第一个猜测是按字面意思遵循可数无穷大的定义,例如:

Definition aleph_null ( X : Type ) :=
exists ( R : nat -> X -> Prop ), 
( forall ( n : nat ), exists ( x : X ), R n x )
/\ ( forall ( x : X ), exists ( n : nat ), R n x )
/\ ( forall ( n : nat ) ( x y : X ), R n x -> R n y -> x = y )
/\ ( forall ( n m : nat ) ( x : X ), R n x -> R m x -> n = m ).

但是在实际样张中使用它似乎有点笨拙,并没有使用库。 我认为我可以通过使用现有的双重性定义来缩短它,但我能找到的所有定义都是关于函数,而不是二元关系。

在Coq中有没有更好的,惯用的表达可数无穷大的方法?

1 个答案:

答案 0 :(得分:1)

最佳选择在很大程度上取决于您的特定应用。我会说在大多数情况下使用函数可能是最简单的选择。由于您提到了库支持,ssreflect库对此类推理有很好的支持;你可以定义,例如

Inductive count_inf (X : Type) : Type := CountInf {
  count : X -> nat;
  _ : bijective count
}.

ssreflect实际上有自己的countable types定义,但它包括有限类型和无限类型,所以它并不能让你想要开箱即用。