我正在扩展现有项目(Featherweight Java形式化), 并且有许多常量,例如:
Notation env := (list (var * typ)).
如果我使用Definition
代替什么会改变:
Definition env := (list (var * typ)).
为什么作者在这里使用Notation
?
答案 0 :(得分:3)
每当你尝试使用引理进行应用或重写时,Coq中的一个组件称为 unifier ,它试图找出如何实例化你的引理,以便它可以处理这种情况在手边(并检查它确实适用于那里)。根据您是否使用符号或定义,此统一器的行为略有不同。
符号对于Coq的理论是不可见的:它们只影响系统的解析和打印行为。特别是,在分析术语时,统一者不需要明确地展开符号。另一方面,定义必须由统一者明确展开。问题是,unifier工作启发式,并且在必须展开某些定义时不能100%确定。因此,我们经常发现自己的目标是提到一个定义,即统一者不会自己展开,阻止我们应用引理或重写,并且必须手动添加一个调用来展开自己以使其得到它工作
因此,符号可以用作黑客来帮助统一者理解缩写意味着什么,而无需手动展开步骤。