Math 如何在Coq中定义非空集合?

Math 如何在Coq中定义非空集合?,math,set,coq,Math,Set,Coq,在做了很多教程之后,我正在尝试创建我的第一个Coq定义。想知道如何定义像字母表这样简单的东西,如果定义是: ∑是一个字母表,当它是一组有限的非空符号时 得到这么多: Require Import Coq.Lists.ListSet. Definition alphabet := set. 但是如何指定“必须是有限的、非空的集合”部分呢?既然您选择字母表作为集合,根据定义它是有限的,因为集合被定义为列表的一个实例,归纳类型总是有限的 您正在使用的ListSet库定义了emptyset,因此您的

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

∑是一个字母表,当它是一组有限的非空符号时

得到这么多:

Require Import Coq.Lists.ListSet.

Definition alphabet := set.

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

既然您选择
字母表
作为
集合
,根据定义它是有限的,因为
集合
被定义为
列表
的一个实例,归纳类型总是有限的

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

Definition not_empty (a: alphabet) : Prop := a <> empty_set.
(您也可以使用
False
True
Prop
中定义后者,而不是
bool

编辑:Arthur提出了一些澄清问题(这里简单化了,如果你想得到更精确的解释,就拿一本关于归纳类型的真实教科书):

感应式可由以下部件组成:

  • 有限数量的元素(例如,
    bool
  • 无限多的元素(例如,
    nat
  • 没有任何元素(例如
    False

然而,任何归纳类型的元素都是有限的。例如,您可以通过构造构造函数
S
来编写任意自然数,但您必须在某个点使用
O
,并“停止”术语的构造。列表也是如此:你可以建立一个任意的长列表,但它的长度总是有限的。

我想你可以对“归纳类型总是有限的”做一些澄清,因为它可以被理解为一个归纳类型有有限多的元素。@ArthurAzevedoDeAmorim同意,我认为“归纳类型的实例总是有限的”更精确。
Definition not_empty (a: alphabet) : bool := match a with
  | nil => false
  | _ => true
end.