Random 使用随机轨迹的NuSMV模拟

Random 使用随机轨迹的NuSMV模拟,random,model-checking,nusmv,Random,Model Checking,Nusmv,我正在尝试对我创建的NuSMV模型进行“随机”或非确定性模拟。但是,在后续运行之间,生成的跟踪是完全相同的 模型如下: MODULE main VAR x : 0..4; VAR clk : 0..10; DEFINE next_x := case x = 0 : {0,1}; x = 1 : {1,2}; x = 2 : {1,0}; TRUE : {0}; esac; DEFINE next_clk :=

我正在尝试对我创建的NuSMV模型进行“随机”或非确定性模拟。但是,在后续运行之间,生成的跟踪是完全相同的

模型如下:

MODULE main
VAR x : 0..4;
VAR clk : 0..10;

DEFINE next_x :=
    case
        x = 0 : {0,1};
        x = 1 : {1,2};
        x = 2 : {1,0};
        TRUE : {0};
    esac;

DEFINE next_clk :=
    case
        (clk < 10) : (clk+1);
        TRUE : clk;
    esac;

INIT (x = 0);
INIT (clk = 0);

TRANS (next(x) in next_x);
TRANS next(clk) = next_clk;

CTLSPEC AG(clk < 10);
也许我的模型有错误?或者我没有在shell中运行正确的命令


提前谢谢

据我所知在使用该工具之后,我想说,由于以某种方式使用了伪随机发生器,您所体验到的是一种常见的行为

基本上,我假设每次启动NuSMV
void srand(unsigned int seed)
都使用相同的seed值初始化。明显的结果是NuSMV在独立运行中执行完全相同的非确定性选择,前提是加载完全相同的模型并执行完全相同的命令序列

这种设计在模型检查器中很常见,因为它允许更容易地重现用户报告的潜在缺陷痕迹


在查看了
NuSMV-help
NuSMV文档后,我觉得该程序没有选择手动为伪随机生成器设置任意种子。(注意:您可能希望就此联系NuSMV邮件列表,可能存在一些内部变量,可以借助
set
命令配置随机种子)

因此,我想提出以下解决办法,以帮助您实现从同一模型收集不同的、不确定的执行跟踪的目标。尝试:

go
选择州-r
模拟-r随机_种子
选择州-r
模拟-r 30
显示轨迹2
退出
基本上,其想法是利用第一次模拟,将伪随机生成器向前移动到伪随机链中的任意点。每次执行此脚本时,都会更改
RANDOM_SEED
的值,以便NuSMV的任意两次执行在第二个跟踪的伪随机生成器中具有不同的起点。这样,NuSMV就不再重复它在第二个跟踪的其他执行中所做的相同选择,除非这纯粹是偶然发生的

或者,您可以通过运行NuSMV解算器获得所需的所有非确定性执行跟踪:

go
选择州-r
模拟-r 30
显示跟踪1
选择状态-r
模拟-r 30
显示轨迹2
...
选择州-r
模拟-r 30
显示痕迹
退出

注意1:您的模型只有一个初始状态,因此
拾取状态-r
始终选择相同的初始状态

注意2:您的型号在我的系统上报告以下错误:

TYPE ERROR file test.smv: line 23 :
    illegal operand types of "=" : integer-set and integer
当我键入
时,选择状态-I


注3:由于NuSMV源代码可用,另一种可能的解决方案是对其进行修补,以便接受一种新的选项,用于设置任意种子以初始化伪随机生成器。

可能只有一条路径,没有空间容纳非确定性值。如果您尝试查看模型的可能状态数,说明了什么?@DjDac执行交互式模拟就足够了,可以看到模型有一些不确定的选项可用,因为向用户提供了多个选项以使其取得进展。感谢您提供详细的答案。RE Note 2:我也收到了这个错误,据我所知,根据手册,这是一个有效的表达式,我很想知道你怎么想?@SimonDiemert在评论了一行又一行代码后,看起来问题确实在另一行,出于某种原因,NuSMV报告了不正确的一行。不正确的部分似乎是
next_x
的定义,它被指定为一组整数值。我建议你在NusMV的邮件列表中写一封关于这个错误消息的邮件,也许他们可以提供一个解释。我刚刚收到NusMV开发者的回复。这显然是语法检查例程中的一个已知错误。它将在下一版本中解决。
TYPE ERROR file test.smv: line 23 :
    illegal operand types of "=" : integer-set and integer