在完成许多教程后尝试创建我的第一个Coq定义。想知道如何定义像字母表这样简单的东西,如果定义是:
Σ是一个字母表iff它是一个有限的非空符号集。
得到了这么多:
Require Import Coq.Lists.ListSet.
Definition alphabet := set.
但是如何指定“必须是有限的,非空集”部分?
答案 0 :(得分:1)
由于您选择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.
(您也可以使用Prop
和bool
在False
而不是True
中定义后者。)
归纳型可以通过以下方式居住:
bool
),nat
)False
)。然而,归纳型的任何元素都是通过构造有限的。例如,您可以通过在构造函数S
中构建有限的时间来编写任何自然数,但是 在某些时候使用O
并且#39;&#39 ;停止&#39;&#39;你的任期的建设。列表也是如此:您可以构建任意长列表,但其长度始终是有限的。