如何在 Coq 中定义非空集?

How to define non-empty set in Coq?

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

Σ is an alphabet iff it's a finite nonempty set of symbols.

得到这么多:

Require Import Coq.Lists.ListSet.

Definition alphabet := set.

但是如何指定 "must be a finite, non-empty set" 部分?

由于您选择 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.

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

编辑:Arthur 要求的一些说明(此处简化,如果你想要更精确的解释,请拿一本关于归纳类型的真正教科书):

归纳型可以居住:

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

但是,归纳类型的任何元素在结构上都是有限的。例如,您可以通过构造函数 S 的有限次数来编写任何自然数,但是您 必须 在某些时候使用 O 并且 ''stop'' 术语的结构。列表也是如此:您可以构建任意长列表,但其长度始终是有限的。