【问题标题】:Recursive data types in PromelaPromela 中的递归数据类型
【发布时间】:2014-01-18 12:25:45
【问题描述】:

我正在尝试在 Promela 中制作 B-Tree,以便我可以证明有关它的内容,但是,Promela 似乎不支持递归数据类型。这不起作用:

#define n 2
typedef BTreeNode
{
    int keys[2*n-1];
    BTreeNode children[2*n];
    int c;
};

如何在 Promela 中制作 B-Tree,如果不能,您建议使用哪种工具?我考虑过 QuickCheck 和 Prolog。但是在 Prolog 中制作 B-Tree 也很困难。

【问题讨论】:

    标签: recursion b-tree recursive-datastructures spin promela


    【解决方案1】:

    您将使用指向静态定义的节点数组的索引来表示子级。像这样:

    #define n 2
    
    #define BTreeNodeId   byte
    typedef BTreeNode {
      BTreeNodeId my_id;
      int keys[2*n-1];
      BTreeNodeId children[2*n];
      int c;
    };
    
    BTreeNode nodes [10];
    byte next_node_id = 0;
    

    这样,您可以通过递增 next_node_id 来“分配”节点,并且可以通过使用子 ID 引用 nodes 来访问子节点。

    【讨论】:

    • 我有一个想法,使用 LRCS 树来表示 B-tree,然后使用通常的 binary-tree-in-array 来表示 LRCS 树。您认为这比您建议的解决方案优越还是次要?到目前为止,我只需要对树插入进行建模。
    • 这种布局对我来说是有问题的,因为它允许同一棵树的多个表示形式,这使得证明可以创建某棵树(如果不是不可能的话)变得更加困难。
    • 如果 Spin 无论如何都会检查它们以确认您的正确性声明,那么多重表示是否会成为问题?充其量可能会在验证中花费一些时间和空间,但不应该使验证变得不可能。
    • 我不熟悉“LRCS 树”,但我已经在一些简单的二叉树验证和一些很多 更大的验证中使用了上述技术。我很难看出它是如何行不通的!
    • 啊,我的意思是 LCRS 树。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多