用约束定义语法

时间:2018-07-12 14:08:51

标签: coq

我想在Coq中定义时间延迟的语法,如下所示:

Inductive tcs : Type :=
| delay : nat -> tcs
| atomic : nat-> tcs.

但是构造函数 delay 中不允许使用自然数0。我还发现使用子集类型来定义语法。但是,子集类型的引入导致定义语义的更多复杂性。有没有简单的方法来定义这种语法?

1 个答案:

答案 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)的类型。