Isabelle 和 Coq 中的 De Bruijn 指数

De Bruijn indices in Isabelle and Coq

我希望能够在 Isabelle 或 Coq 中使用类似 de Bruijn 索引的东西,以便引用由量词引入的变量。例如,而不是写:

forall x. forall y. (p x y)

我想写这样的东西:

forall x. forall y. (p '2' '1')

其中索引“2”和“1”表示这些变量分别受第二个和第一个量词的约束(从内到外计数)。

我需要这样做的原因是量词实际上会被缩写隐藏,因此我不知道变量的名称。我的公式将如下所示:

box box (p '2' '1')

其中 box 应该是引入 unnamed/hidden 绑定变量的缩写,我希望 '2' 和 '1' 指代最左边和最右边引入的 unnamed/hidden 变量"box",分别。

是否有可能在 Isabelle 或 Coq 中实现类似的东西??

我在这里只能为伊莎贝尔建设性地说话:正式语法在内部使用 lambda 术语的标准 de-Bruijn 表示,并且有多种方法可以将其重用于您自己的语法和特殊符号。事实上,Isabelle/HOL只是Isabelle的另一个应用,所以它的量词和其他绑定器由系统的常规机制定义在user-space中。

要查找的概念是 "binders"、"syntax transformations"、"syntax translations" 等。特别是在 Isabelle/Isar Reference Manual. This can be stretched quite far, e.g. see how implicit bindings for Hoare logic 中;这只是多年来积累的许多其他例子中的一个小例子。

在 Hoare Logic 示例中,隐式抽象是通过特殊语法常量 _quote 引入的,它与 Isabelle/Pure 中的 Syntax_Trans.quote_tr 相关联——这是一个实用的概念.这个想法可以进一步推进以允许嵌套 quotation/antiquotation(参见 $ISABELLE_HOME/src/HOL/ex/Multiquote.thy),尽管据我所知这在应用程序中没有实际意义。

顺便说一句,如果 Coq 没有类似的机制来使用活页夹来表示用户符号,我会感到非常惊讶。