Page 114 - 《软件学报》2025年第8期
P. 114

左正康 等: 动态顺序统计树类结构的函数式建模及其自动化验证                                                  3537



                 //树的大小不变式
                           ′
                 fun inv size :: “ a dost ⇒ bool” where
                 “inv size <>= True”|
                 “inv size < n,l,a,r >= (inv size l ∧ inv size r ∧ (size2 l r = n))”

                    (3) 附加性质不变式     (统称  inv prop ), 这是一个可选项. 当实例化所用到的具体搜索树结构, 需要维持附加性质不
                 变时  (如颜色等), 加上相应的附加性质.
                    总而言之, 上述不变式       (1)−(3) 统称为动态顺序统计树类结构的不变式            (简称  invar), 其定义如下.

                 //动态顺序统计树类结构的不变式
                 definition “invar t ≡ inv ST t ∧ inv size t ∧ inv prop t”

                 3   动态顺序统计树类结构的           Isabelle 自动化验证框架

                    为了更高效地验证动态顺序统计树类结构相关算法函数的正确性, 减少开发人员验证代码的时间和成本, 本
                 节构建了动态顺序统计树类结构在            Isabelle 中的自动化验证框架, 如图     3  所示. 其设计理念为用列表模拟动态顺序
                 统计树类结构的      10  种操作, 设计对应的列表辅助函数, 并验证其正确性. 借助列表辅助函数可构建通用的验证引
                 理集, 合并  10  种操作对应的验证引理集, 组成验证引理库. 基于验证引理库, 动态顺序统计树类结构的                          10  种操作
                 的功能正确性均能实现自动化验证. 第            3.1  节阐述了设计自动化验证框架的理论基础, 第            3.2  节设计并验证了列表
                 辅助函数, 第   3.3  节构建了通用的验证引理库.


                              动态顺序统计树类         列表模拟                      验证正确性      Isabelle 库的
                              结构的 10 种操作                    列表辅助函数                  函数及其组合

                                                                  构建验证引理集


                                                            验证引理库
                                      自动化验证

                                           功能正确性

                                        图 3 动态顺序统计树类结构的自动化验证框架结构

                 3.1   自动化验证框架的理论基础
                    实现自动化验证需要简化问题的复杂性, 将复杂的问题逐步拆解为                       Isabelle 自动化证明组件能高效处理的形
                 式. 具体函数的实现可以用同态的抽象函数来代替证明函数的正确性, 这一过程已被证明是正确的                                [19] . 使用同态
                 的抽象函数代替具体函数进行函数式验证, 可以将复杂的问题证明分解为更为简单的形式, 从而简化证明过程                                   [5] .
                 对于动态顺序统计树类结构, 在验证其操作算法时, 涉及的情况较多, 自动化证明组件难以应付. 而对于列表这类
                 线性结构, 其结构的定义契合递归的思想, 对应函数的正确性验证较为简单. 如果能用列表模拟动态顺序统计树的
                 函数操作, 并将列表作为中介去验证动态顺序统计树的函数正确性, 则可以简化验证过程, 进一步实现自动化验证.
                    这一方法的关键在于实现将动态顺序统计树映射到列表的映射函数                         Abs :: 't  ⇒ 'a list. 并验证  Abs 是同态的,
                 即对于动态顺序统计树类结构中所有需要实现的函数操作                      (统称为   tree_fun), 及其列表辅助函数操作      (统称为
                 list_fun), 满足以下关系  [20] :

                                           invar t ⇒ Abs(tree_ fun(t)) = list_fun(Abs(t)).
                    函数  inorder 能够将动态顺序统计树中的节点按照中序遍历的顺序映射到列表中. 因此, 映射函数                         Abs 可以通
   109   110   111   112   113   114   115   116   117   118   119