NuSMV

时间:2018-10-07 14:04:23

标签: model-checking nusmv nuxmv

我尝试使用NuSMV来检查我的模型,这是代码。

enter image description here

但是,当我在shell中输入NuSMV kernel.smv时,会发生错误

file kernel.smv: line 16: nested NEXT operators: next(_b)
in definition of next(_cond)
in definition of next(tx.fired) at line 16

我是NuSMV模型检查器的新手,因此无法修复此语法错误。请帮忙,谢谢!

1 个答案:

答案 0 :(得分:0)

我能够根据您的图片创建一个MVCE

MODULE trans(cond)
VAR
    fired : boolean;
ASSIGN
    init(fired) := FALSE;
    next(fired) := case
        !next(cond) : TRUE;
        TRUE        : FALSE;
    esac;

MODULE main
VAR
    _b : boolean;
    t  : trans(_cond);
DEFINE
    _cond := (_b != next(_b));

这里的设计问题正是模型检查器在错误消息中告诉您的内容:

NuSMV > reset; read_model -i t.smv ; go

file t.smv: line 6: nested NEXT operators: next(_b)
in definition of next(_cond)
in definition of next(t.fired) at line 6

内部有next()运算符的双重嵌套,并且不支持此操作,因为这需要将执行范围增加到 current_state + selected_transition 对,并知道哪个过渡是从仍在构建的未来状态中获取的。


解决方法。

让我们采用以下模型,该模型与您的模型有相同的问题:

MODULE main()
VAR
    frst : 0 .. 1;
    scnd : boolean;

ASSIGN
    init(frst) := 0;
    init(scnd) := FALSE;

    next(scnd) := case
        next(middle) : TRUE;
        TRUE         : FALSE;
    esac;

DEFINE
    middle := (frst != next(frst));

我们希望scndtrue,因为frst的值将在next()next(next())状态之间改变。

为此,我们可以延迟执行跟踪的开始,以便我们可以预测 {{1 }}具有足够的优势。

让我们看一个例子:

frst