Tree VDM++工具箱:操作或函数不在使用示例树实现的范围内

Tree VDM++工具箱:操作或函数不在使用示例树实现的范围内,tree,scope,runtime,vdm++,Tree,Scope,Runtime,Vdm++,我使用的是VDM++工具箱v9.0.2附带的树定义,当试图使用解释器使用函数addRoot时,在第一次使用时,我总是得到错误:运行时错误266:操作或函数不在范围内。如果我再次运行该函数,它就会工作。 为什么会有这种行为 我正在添加VDM++工具箱附带的树代码。请忽略类型和语法错误,因为我已经修复了它们,但仍然无法工作 -起始代码- 树类 class Tree types protected tree = <Empty> | node; public node :: lt:

我使用的是VDM++工具箱v9.0.2附带的树定义,当试图使用解释器使用函数addRoot时,在第一次使用时,我总是得到错误:运行时错误266:操作或函数不在范围内。如果我再次运行该函数,它就会工作。 为什么会有这种行为

我正在添加VDM++工具箱附带的树代码。请忽略类型和语法错误,因为我已经修复了它们,但仍然无法工作

-起始代码- 树类

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

-结束代码-

我很高兴你能解决这个问题。这对测试所有操作都受到保护是没有帮助的——尽管我担心它在第二次尝试时是否有效

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


请参见

问题在于类中的函数被设置为受保护,因此我无法自由使用它们。我刚把它改成公共的,现在可以用了。