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

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



                    (5) 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点, 用                     inv height  来表示这一性质.
                    颜色性质不变式      inv rb  表示红黑树需满足上述性质. 基于第       2.3 节的不变式, 将   invar 实例化为   invar rbt , 将   inv prop
                 实例化为   inv rb , 可定义树  dost rbt  的不变式, 如下所示.

                 //红黑树dost rbt 的颜色性质不变式
                 definition “inv rb t ≡ inv color t ∧inv height t ∧ dost rbt _color t = Black”
                 //红黑树dost rbt 的不变式
                 definition “invar rbt t ≡ inv ST t ∧ inv size t ∧inv rb t”

                    以选择和求秩函数为例, 基于第          2.2  节中的高阶复合函数可对其进行函数式建模, 实现思路与第                 4.1.1  节类似,
                 限于篇幅略.
                    对于红黑树中函数功能正确性的验证, 基于第                3.3  节给出的基于引理库的自动化验证策略, 同样能够得到自
                 动化验证. 第   3.3.1  节中给出的验证引理库均是通用的, 因此同样使用验证引理库中的                    list_sel 和  list_rank 验证引
                 理集, 且只需要使用归纳法并调用一次            auto  方法即可完成选择和求秩函数的自动化验证, 如图              20  所示.

                 选择函数 dost rbt _select
                    的正确性定理
                           归纳法
                         auto 方法

                                             list_sel 验证引理集    辅助函数的正确性引理
                  求秩函数 dost bst _rank
                    的正确性定理
                           归纳法
                         auto 方法

                                            list_rank 验证引理集      辅助函数的正确性引理
                                 图 20 函数   dost rbt _select 和  dost rbt _rank 的功能正确性自动化验证过程

                    对于红黑树中函数结构正确性的验证, 实现思路与第                   4.1.2  节类似. 借助第  3.3.2  节的拆分方案, 将不变式
                 invar rbt  拆分为  inv ST 、  inv size  和  inv rb  等, 得到细化引理. 对于细化引理, 本文的自动化验证框架同样可以自动化
                 验证.

                 4.3   实例化为平衡的多叉搜索树
                    2−3  树是一种特殊的     B-树  [23] 结构, 常用于文件系统和数据库系统中, 动态顺序统计            2−3  树可用于实现目录结
                 构管理, 快速检索相应数据. 2−3       树的每个非叶节点都有         2  个或  3  个子树, 而且所有叶子节点都在同一层上. 本节
                 以  2−3  树作为平衡的多叉搜索树的典型案例进行讨论. 基于第                2.1  节中动态顺序统计树类结构的函数式定义, 可
                 将其结构定义如下.

                        ′
                 datatype a dost 23 = Leaf|
                          ′      ′  ′
                 Node2 nat “ a dost 23 ” a “ a dost 23 ”|
                                    ′
                                           ′
                                              ′
                                 ′
                          ′
                 Node3 nat “ a dost 23 ” a “ a dost 23 ” a “ a dost 23 ”
                    对于  2−3  树这类包含多个子树的多叉搜索树, 其操作函数的实现思路与二叉搜索树是一致的, 只需要额外补
                 充对多子树节点      (Node3) 的处理. 将函数   tsize 更新为函数  dost 23 _size, 只需要额外添加对  Node3  节点的处理操作
                 即可. 如下展示了不变式       inv size  额外添加的处理操作, 其中函数    size3  用于计算  Node3  节点对应树的大小值.
   120   121   122   123   124   125   126   127   128   129   130