NuXMV 使用实数
NuXMV use of Real numbers
我正在开发的作品中使用 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>
为了运行程序,检查属性是否实现,但是出现这个信息
"In this version of nuXmv, batch mode is not available with models containing infinite domain variables."
所以我确定的问题是在变量 t
上使用 Real
。
有没有一种方法可以指定一系列 Real 值,就像我在变量 r
上使用的那样(它是 Integer 类型)?
我知道如果存在可以解决问题的方法,如果不存在,我该如何在我的程序中使用 Reals?
提前感谢您的宝贵时间。
完整的错误消息确实告诉您如何解决此问题:
In this version of nuXmv, batch mode is not available with models
containing infinite domain variables.
You can enter interactive mode calling:
./nuXmv -int file_name.smv
Alternatively, you can write the commands you want to execute in a file and then call:
./nuXmv -source <command-file> file_name.smv
AFAIK,要处理无限域变量,您应该利用基于MathSAT 5 SMT Solver. This means that you should focus on commands which have msat
as prefix or suffix in their name when you look at the manual.
请注意 nuXmv 中没有 msat_
命令用于执行 CTL 模型检查,尽管 LTL和不变模型检查可用,所以你应该改变你的属性
SPEC AG r <= 600
进入
LTLSPEC G r <= 600
然后您可以按如下方式验证模型:
~$ nuXmv -int
nuXmv > reset ;
nuXmv > read_model -i file_name.smv ;
nuXmv > go_msat ;
nuXmv > msat_check_ltlspec_bmc
你问:
Is there a way to specify a range of Real values like the one I have used on variable r
(which is of type Integer) ?
不,0.0..500.0
是非法的。
您有以下选项
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.
如果你想给一个real/integer变量添加范围约束,你可以使用INVAR:
INVAR 0.0 <= rv & rv <= 500.0 ;
我正在开发的作品中使用 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>
为了运行程序,检查属性是否实现,但是出现这个信息
"In this version of nuXmv, batch mode is not available with models containing infinite domain variables."
所以我确定的问题是在变量 t
上使用 Real
。
有没有一种方法可以指定一系列 Real 值,就像我在变量 r
上使用的那样(它是 Integer 类型)?
我知道如果存在可以解决问题的方法,如果不存在,我该如何在我的程序中使用 Reals?
提前感谢您的宝贵时间。
完整的错误消息确实告诉您如何解决此问题:
In this version of nuXmv, batch mode is not available with models containing infinite domain variables.
You can enter interactive mode calling:
./nuXmv -int file_name.smv
Alternatively, you can write the commands you want to execute in a file and then call:
./nuXmv -source <command-file> file_name.smv
AFAIK,要处理无限域变量,您应该利用基于MathSAT 5 SMT Solver. This means that you should focus on commands which have msat
as prefix or suffix in their name when you look at the manual.
请注意 nuXmv 中没有 msat_
命令用于执行 CTL 模型检查,尽管 LTL和不变模型检查可用,所以你应该改变你的属性
SPEC AG r <= 600
进入
LTLSPEC G r <= 600
然后您可以按如下方式验证模型:
~$ nuXmv -int
nuXmv > reset ;
nuXmv > read_model -i file_name.smv ;
nuXmv > go_msat ;
nuXmv > msat_check_ltlspec_bmc
你问:
Is there a way to specify a range of Real values like the one I have used on variable
r
(which is of type Integer) ?
不,0.0..500.0
是非法的。
您有以下选项
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.
如果你想给一个real/integer变量添加范围约束,你可以使用INVAR:
INVAR 0.0 <= rv & rv <= 500.0 ;