我想在Coq中定义时间延迟的语法,如下所示:
Inductive tcs : Type :=
| delay : nat -> tcs
| atomic : nat-> tcs.
但是构造函数 delay 中不允许使用自然数0。我还发现使用子集类型来定义语法。但是,子集类型的引入导致定义语义的更多复杂性。有没有简单的方法来定义这种语法?
答案 0 :(得分:4)
在您的特定情况下,我认为最简单的方法是更改delay
构造函数中数字的解释:请注意,nat
通过后继者与{n : nat | n > 0}
同构功能。因此,只要在match
表达式中使用delay参数,您所要做的就是为其添加一个参数。例如:
Definition nat_of_tcs t :=
match t with
| delay n => S n
| atomic n => n
end.
或者,您可以将nat
替换为positive
,这是标准库中定义的一种类型,用于表示大于0的数字。
通常,子集类型将是解决之道。您可以在延迟类型中添加n != 0
约束,或在tcs
的元素上定义一个单独的谓词,以描述元素何时形成正确的格式:
Definition well_formed t :=
match t with
| delay 0 => false
| _ => true
end.
Definition wftcs := { t : tcs | well_formed t = true }.
Mathematical Components和相关库普遍使用此模式;例如,检查subType
模块中的eqtype
类。在我的extensional structures库中,我使用subType
类通过包装列表并证明列表已排序来定义有限集(here)的类型。