如何在 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" 部分?
由于您选择 alphabet
为 set
,因此根据定义它是有限的,因为 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.
(您也可以使用 False
和 True
在 Prop
而不是 bool
中定义后者。)
编辑:Arthur 要求的一些说明(此处简化,如果你想要更精确的解释,请拿一本关于归纳类型的真正教科书):
归纳型可以居住:
- 有限数量的元素(例如,
bool
),
- 无限数量的元素(例如,
nat
)
- 根本没有元素(例如
False
)。
但是,归纳类型的任何元素在结构上都是有限的。例如,您可以通过构造函数 S
的有限次数来编写任何自然数,但是您 必须 在某些时候使用 O
并且 ''stop'' 术语的结构。列表也是如此:您可以构建任意长列表,但其长度始终是有限的。
在学习了很多教程之后尝试创建我的第一个 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" 部分?
由于您选择 alphabet
为 set
,因此根据定义它是有限的,因为 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.
(您也可以使用 False
和 True
在 Prop
而不是 bool
中定义后者。)
编辑:Arthur 要求的一些说明(此处简化,如果你想要更精确的解释,请拿一本关于归纳类型的真正教科书):
归纳型可以居住:
- 有限数量的元素(例如,
bool
), - 无限数量的元素(例如,
nat
) - 根本没有元素(例如
False
)。
但是,归纳类型的任何元素在结构上都是有限的。例如,您可以通过构造函数 S
的有限次数来编写任何自然数,但是您 必须 在某些时候使用 O
并且 ''stop'' 术语的结构。列表也是如此:您可以构建任意长列表,但其长度始终是有限的。