我正在使用 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?
提前感谢您的时间。
答案 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.