如何在Coq中声明某种归纳类型的常量?

时间:2018-07-09 21:06:23

标签: logic coq

我遵循https://github.com/brunofx86/LL/blob/master/FOLL/LL/SyntaxLL.v,并定义了归纳类型(参数化的高阶抽象语法-在此使用PHOAS):

(** Closed Terms *)
  Inductive ClosedT : Term -> Prop :=
  | cl_cte: forall C, ClosedT (Cte C)
  | cl_fc1: forall n t1, ClosedT t1 -> ClosedT (FC1 n t1)
  | cl_fc2: forall n t1 t2, ClosedT t1 -> ClosedT t2 -> ClosedT (FC2 n t1 t2).

我的问题是-如何使用构造函数John将常量ClosedT定义为类型cl_cte

还有另一个问题:在某些情况下,我想定义更多类型,例如John : PersonBruno : Tortoise这样-我应该创建新的类型,例如ClosedT_Tortoise是否适合新类型? ClosedT是构建对象逻辑的基础类型,因此,也许我不应该继续进行多排序逻辑?

据我了解,然后将我使用的线性逻辑的这种形式化应用到另一个Coq项目http://subsell.logic.at/bio-CTC/中,并且可能在那里定义了常量。但是略读源代码我找不到它们。

1 个答案:

答案 0 :(得分:3)

严格来说,您的问题是个错误的陈述:ClosedT不是类型,而是由Term类型的元素索引的命题系列。根据该文件,我想ClosedT t意味着术语t : Term已关闭,并且您想要执行以下操作:

  • 定义具有元素T的常量John : T的类型。

  • 使用T实例化开发的定义。为此,您需要将T包装在类型为Eqset_dec_pol的模块中,并证明T具有可判定的相等性,并应用出现在开头的函子Syntax_LL文件到此模块。

  • 使用John的{​​{1}}“构造函数”在术语语法中嵌入Cte。 (这不是正确的Coq含义的构造函数,而只是用于构造Term类型的元素的方便包装器。)

  • 证明该术语已关闭;也就是说,证明Term。这仅是应用构造函数ClosedT (Cte John)的问题。

这与您想做的事情大致相同吗?