我遵循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 : Person
和Bruno : Tortoise
这样-我应该创建新的类型,例如ClosedT_Tortoise
是否适合新类型? ClosedT
是构建对象逻辑的基础类型,因此,也许我不应该继续进行多排序逻辑?
据我了解,然后将我使用的线性逻辑的这种形式化应用到另一个Coq项目http://subsell.logic.at/bio-CTC/中,并且可能在那里定义了常量。但是略读源代码我找不到它们。
答案 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)
的问题。
这与您想做的事情大致相同吗?