VDM ++工具箱:使用示例树实现,操作或功能不在范围内

时间:2013-11-13 12:52:33

标签: tree scope runtime vdm++

我正在使用VDM ++ Toolbox v9.0.2附带的Tree定义,并且在尝试使用addRoot()函数(使用解释器)时,在第一次使用时,我总是得到错误:“运行 - 时间错误266:操作或功能不在范围内“。如果我再次运行该功能,它的工作原理。 为什么会有这种行为?

我正在添加VDM ++ Toolbox附带的Tree代码。 (请忽略类型和语法错误,因为我已经修复了所有错误,但它仍然无效)

- 开始代码 - 树类

class Tree

types

protected 
tree = <Empty> | node;

public
node :: lt: Tree
        nval : int
        rt : Tree

instance variables
protected
root: tree := <Empty>;



operations

protected
nodes : () ==> set of int
nodes () ==
  cases root:
    <Empty> -> return ({}),
    mk_node(lt,v,rt) -> return(lt.nodes() union {v} union rt.nodes())
  end ;

protected
addRoot : int ==> ()
addRoot (x) ==
  root := mk_node(new Tree(),x,new Tree());

protected
rootval : () ==> int
rootval () == return root.nval
pre root <> <Empty>;

protected
gettree : () ==> tree
gettree () == return root;

protected
leftBranch : () ==> Tree
leftBranch () == return root.lt
pre not isEmpty();

protected
rightBranch : () ==> Tree
rightBranch () == return root.rt
pre not isEmpty();

protected
isEmpty : () ==> bool
isEmpty () == return (root = <Empty>);

end Tree

- 结束代码 -

1 个答案:

答案 0 :(得分:1)

我很高兴你设法解决了这个问题。操作受到保护是无益的(用于测试) - 尽管我担心它是否适用于第二次尝试!

我使用Overture而不是VDMTools尝试了规范,看看是否有任何不同。当然,它与受保护的方法有同样的问题(你不能选择它们进行测试)。但它也指出了一些类型检查错误:“nodes”case语句需要一个“others”子句(如“others - &gt; error”),否则操作可能返回一个void值;并且调用isEmpty()的前提条件实际上不应该这样做 - 您可以从前提条件调用函数,但不能操作,因为它们可能会更改模型的状态。所以我用“root =&lt; Empty&gt;”替换了这些调用。那很好。

请参阅http://www.overturetool.org/