如何在Coq中定义非空集?

时间:2015-07-19 23:01:03

标签: math set coq

在完成许多教程后尝试创建我的第一个Coq定义。想知道如何定义像字母表这样简单的东西,如果定义是:

  

Σ是一个字母表iff它是一个有限的非空符号集。

得到了这么多:

Require Import Coq.Lists.ListSet.

Definition alphabet := set.

但是如何指定“必须是有限的,非空集”部分?

1 个答案:

答案 0 :(得分:1)

由于您选择alphabetset,因此定义为有限,因为set被定义为list的实例,并且归纳类型总是有限的

您使用的ListSet库定义了emptyset,因此您的第一个选择就是声明

Definition not_empty (a: alphabet) : Prop := a <> empty_set.

或者您可以依赖于您的集合为list并且表达式匹配的事实:

Definition not_empty (a: alphabet) : bool := match a with
  | nil => false
  | _ => true
end.

(您也可以使用PropboolFalse而不是True中定义后者。)

编辑:Arthur提出的一些澄清说明(如果你想要更精确的解释,请在这里简化一下,获取一本关于归纳类型的真实教科书):

归纳型可以通过以下方式居住:

  • 有限数量的元素(例如,bool),
  • 无限多个元素(例如,nat
  • 根本没有元素(例如False)。

然而,归纳型的任何元素都是通过构造有限的。例如,您可以通过在构造函数S中构建有限的时间来编写任何自然数,但是 在某些时候使用O并且#39;&#39 ;停止&#39;&#39;你的任期的建设。列表也是如此:您可以构建任意长列表,但其长度始终是有限的。