Набор инструментов VDM++: операция или функция не входят в область действия, используя пример реализации дерева
Я использую определение дерева, которое поставляется с VDM++ Toolbox v9.0.2 и, при попытке использовать функцию addRoot() (с использованием интерпретатора), при первом использовании я всегда получаю ошибку: "Ошибка времени выполнения 266: Операция или функция не входят в объем ". Если я снова запускаю функцию, она работает. Почему у него такое поведение?
Я добавляю код дерева, который поставляется с VDM++ Toolbox. (Пожалуйста, игнорируйте ошибки типа и синтаксиса, так как я исправил их все, и это все равно не будет работать)
- START CODE - Класс дерева
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 ответ
Я рад, что вам удалось разобраться с этим. Бесполезно (для тестирования), что все операции защищены - хотя я волнуюсь, работает ли это со 2-й попытки!
Я попробовал спецификацию, используя Overture, а не VDMTools, чтобы увидеть, было ли это иначе. Конечно, у него та же проблема с защищенными методами (вы не можете выбрать их для тестирования). Но он также указывает на несколько ошибок проверки типов: для оператора case "узлов" требуется предложение "другие" (например, "другие -> ошибка"), в противном случае операция может вернуть значение void; и предварительные условия, которые вызывают isEmpty(), на самом деле не должны этого делать - вы можете вызывать функции из предварительного условия, но не операции, так как они могут изменить состояние модели. Поэтому я заменил эти вызовы на "root =
Смотрите http://www.overturetool.org/