我试图分别使用最小和最大固定点计算来计算一些可枚举类型的两个有限集(让我们说char
)。我希望我的定义可以被提取到SML,并且是#34;半效率"执行时我有什么选择?
从探索HOL库并玩代码生成,我有以下观察:
complete_lattice.lfp
和complete_lattice.gfp
常量和一对额外的单调函数来计算我的集合,实际上我目前正在这样做。代码生成确实可以使用这些常量,但是生成的代码非常低效,如果我理解正确生成的SML代码正在对字符的powerset中的每个可能的集合执行穷举搜索。因此,char
类型的这两个常量的任何使用,无论多么简单,都会导致执行时出现分歧。ccpo_class.fixp
中有Complete_Partial_Order
常量,但根据这个定义的基础iterates
常量没有关联的代码方程,因此代码不能萃取。是否有任何现有的固定点组合器隐藏在某处,适合与有限集一起使用,这些组合生成代码生成的半效率代码,我错过了?
答案 0 :(得分:1)
Isabelle标准库中的一般固定点组合器都不是直接用于代码提取,因为它们的结构过于笼统,无法在实践中使用。 (理论中还有另一个~~/src/HOL/Library/Bourbaki_Witt_Fixpoint
。)但理论~~/src/HOL/Library/While_Combinator
将lfp
和gfp
个固定点连接到您正在寻找的迭代实现,请参阅定理{{ 1}}和lfp_while_lattice
。这些特征具有函数单调的前提条件,因此它们不能直接用作代码方程。所以你有两个选择:
在代码方程式和/或定义中使用gfp_while_lattice
组合子而不是while
/ lfp
。
告诉代码预处理器使用gfp
作为lfp_while_lattice
等式。如果您还添加了预处理器需要的所有规则来证明这些方程式应用于其应该应用的实例,则此方法也适用。因此,我建议您同时添加[code_unfold]
函数的单调性陈述和定理来证明[code_unfold]
的有限性,即char set
。