我希望能够在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应该是引入未命名/隐藏绑定变量的缩写,我想要' 2'和' 1'引用分别由最左边和最右边的"框"引入的未命名/隐藏变量。
是否有可能在Isabelle或Coq中实现这样的目标?
答案 0 :(得分:2)
我只能在这里为Isabelle建设性地说话:形式语法在内部使用lambda术语的标准de-Bruijn表示,并且有各种方法可以重用它来表示您自己的语法和特殊符号。事实上,Isabelle / HOL只是Isabelle的另一个应用程序,因此它的量词和其他绑定器是通过系统的常规机制在用户空间中定义的。
要查找的概念是“绑定器”,“语法转换”,“语法翻译”等,尤其是Isabelle/Isar Reference Manual。这可以拉得很远,例如看看Hoare logic的隐式绑定是如何完成的;这只是多年来积累的许多其他一个小例子。
在Hoare Logic示例中,隐式抽象是通过特殊语法常量_quote
引入的,该常量与来自Isabelle / Pure的Syntax_Trans.quote_tr
相关联 - 这是一个实用的概念。这个想法可以进一步推进,以允许嵌套引用/反引号(参见$ISABELLE_HOME/src/HOL/ex/Multiquote.thy
),尽管就我所知,这在应用程序中没有实际意义。