NuXMV使用实数

时间:2017-05-26 11:44:22

标签: model-checking nuxmv

我正在使用 nuXmv 进行我正在开发的工作,而且我在使用Reals时遇到了麻烦。

我有程序:

MODULE main

VAR
  t : Real;
  r : 0..5000;

ASSIGN
  init(t):=0;
  init(r):=0;

TRANS
    case
      r>=500 :next(r)=0 & next(t)=0 & r<600;
      r<500 : next(t)-t>0 -> next(r)=r+t & next(r)<600;
    esac;

SPEC
    AG r<=600

我试图证明这个例子的属性是r总是小于或等于600。 请注意,这只是一个没有具体含义的说明性示例。

现在在命令行上输入

$ nuXmv <fileName>

为了运行程序并检查属性是否已实现,但会显示此消息

  

“在此版本的nuXmv中,批处理模式不适用于包含无限域变量的模型。”

所以我发现的问题是在变量Real上使用t。 有没有办法指定一系列Real值,比如我在变量r上使用的那个(类型为Integer)? 我知道如果存在可以解决问题,如果没有,我怎么能在我的程序中使用Reals?

提前感谢您的时间。

1 个答案:

答案 0 :(得分:1)

完整的错误消息会告诉您如何解决此问题:

  

在此版本的nuXmv中,批处理模式不适用于型号   包含无限域变量。

     

您可以输入交互模式

toSingle
     

或者,您可以在文件中编写要执行的命令,然后调用:

./nuXmv -int file_name.smv

AFAIK ,为了处理无限域变量,您需要利用基于 MathSAT 5 <的模型检查技术/ strong> SMT Solver。这意味着您应该关注look at the manual时名称中带有./nuXmv -source <command-file> file_name.smv 作为前缀或后缀的命令。

请注意, nuXmv 中没有msat命令可以执行 CTL模型检查,但 LTL和不变模型检查< / strong>可用,因此您应该更改您的属性

msat_

SPEC AG r <= 600

然后,您可以按如下方式验证模型:

LTLSPEC G r <= 600

你问:

  

有没有办法指定一系列Real值,比如我在变量 ~$ nuXmv -int nuXmv > reset ; nuXmv > read_model -i file_name.smv ; nuXmv > go_msat ; nuXmv > msat_check_ltlspec_bmc 上使用的值(Integer类型)?

不,r是非法的。

您有以下选项

0.0..500.0

如果您想将范围限制添加到真实 / 整数变量,可以使用 INVAR

rv : real ;      -- can represent any rational value, infinite domain
iv : integer ;   -- can represent any integer value, infinite domain
fv : LB..UB ;    -- can represent any integer value in the domain [LB, UB]
sv : {0, 2, 4} ; -- can represent either 0, 2 or 4.