我正在阅读Coq http://www.cs.cmu.edu/~iliano/projects/metaCLF2/inc/dl/papers/lsfa17.pdf和https://github.com/brunofx86/LL中线性逻辑的机械化知识,我很难理解函数定义Term
(以及其他涉及forall
的函数定义),来自https://github.com/brunofx86/LL/blob/master/FOLL/LL/SyntaxLL.v:
Definition Term := forall T:Type, term T. (* type for terms *)
Definition AProp := forall T:Type, aprop T. (* type for atomic propositions *)
为什么在函数定义中需要forall
构造,它还具有什么附加含义?是否正在创建某种类型的集合-即-该函数返回结果集-每种类型都有一个结果?
我正在阅读http://adam.chlipala.net/cpdt/cpdt.pdf“第12章宇宙和公理”,该问题是我先前的问题How to understand Coq type constructor var (t: T)的继续,试图理解本文。
答案 0 :(得分:3)
在参数HOAS中,参数T
表示一个术语中可能出现的一组变量。例如,如果您想要一个最多使用两个变量的术语,则其类型可能为term bool
,因为bool
有两个居民。因此,可以简单地将封闭项(没有自由变量)键入term void
,其中void
是空类型:
Inductive void := .
term void
等效于forall A, term A
(您可以在一个方向上应用功能forall A, void -> A
,而在另一个方向上专长)。后一种封闭术语表示法更易于嵌入其他开放术语中。