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