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

3538                                                       软件学报  2025  年第  36  卷第  8  期


                 过函数   inorder 来实现.
                    对于  Abs 同态性的验证, 一方面, 需要额外定义列表辅助函数模拟动态顺序统计树函数操作, 并保证列表辅助
                 函数的正确性     (第  3.2  节); 另一方面, 需要针对列表辅助函数设计通用的验证引理集, 形成通用的验证引理库, 以
                 应对不同场景下的需求        (第  3.3  节).

                 3.2   自动化验证框架的列表辅助函数
                    动态顺序统计树类结构的种类繁多, 但每个具体的动态顺序统计树都至少提供                           10  种操作. 我们在  Isabelle 中
                 用区域   (locale) 刻画了这些基本操作, 如图     4  所示. 其中, 't 类型可以用'a dost 或  ′ a dost syn  代替. 对于树为空的情况
                 (empty), 其正确性证明是简单的, 本文将忽略对其的讨论.




                                      最大值
                                 动态集合  最小值
                                 相关操作  前继
                                       后继
                                                                               动态顺序统计
                                      树的大小
                                 顺序统计                                           树类结构的
                                  操作   选择
                                       求秩                                        10 种操作
                                       查找
                                 搜索树
                                  操作   插入
                                       删除
                                            图 4 动态顺序统计树类结构的          10  种操作

                    对于函数    tsize, 在第  2  节中讨论了其特殊实现方式. 基于这种实现方式及建模策略, 函数                 tsize 的正确性验证
                 也变得更为简单, 只需要通过归纳法并调用一次               auto  方法即可得证, 无需构造额外的列表辅助函数及引理集.
                    而对于其他操作, 我们设计相应的列表辅助函数进行模拟, 以达到简化问题的目的. 借助                           Isabelle 源码库中已
                 经得到验证的函数及其组合, 可以验证列表辅助函数的正确性. 具体如下.
                    (1) list_max 和  list_min: 查找有序列表中的最大值和最小值.
                    如图  5  所示, 对于动态顺序统计树类结构中求最大值和最小值的函数                   max 和  min, 设计了  list_max 和  list_min
                 模拟. 其中, list_max 通过遍历有序列表至表尾, 获取最大值, 而           list_min  则通过提取有序列表的表头元素, 获取最
                 小值. 这两个函数的正确性证明可以分别借助               Isabelle 集合  (set) 中的  Max 和  Min  函数辅助验证, 使用归纳法并调
                 用一次   auto  方法就能得到证明.

                                       d                      list_max             Max
                               min           max                                      set
                                                列表模拟                       验证正确性
                                   b      e               a  b  c  d  e  f           a b d
                                                                                     c f e
                               a      c       f         list_min
                                                                                   Min
                                           图 5 list_max 和  list_min  的模拟操作及验证

                    (2) list_pred  和  list_sucd: 查找在有序列表中, 指定元素的前继和后继元素.
                    一个元素的前继元素是指树中小于该元素的最大元素, 后继元素则是指大于该元素的最小元素. 在动态顺序
                 统计树类结构中, 求前继元素的         pred  函数和求后继元素的      sucd  函数的实现均依赖于搜索树性质.
                    如图  6  所示, 以  pred  函数为例, 一般来说, 元素   x 左子树中的最大元素即为元素          x 的前继元素. 若元素     x 的左
                 子树为空, 则需要向上查找其祖先节点以确定前继元素. 结合树形结构来看, 即沿着元素                           x 的父节点向上查找, 直
                 到找到一个元素      y, 元素  y 对应结点的右子树包含元素        x. 而  sucd  函数的实现思路则相反, 找元素      x 右子树中的最
                 小元素或找祖先节点中左子树含有元素              x 的节点元素, 即为元素      x 的后继元素. 在实际的建模场景中, 两个函数的
                 实现均需考虑较多的情况, 其正确性验证较为复杂, 常规的自动化证明组件难以应付.
   110   111   112   113   114   115   116   117   118   119   120