使用随机轨迹的NuSMV模拟

时间:2017-07-29 00:43:11

标签: 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 :=
    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中使用以下命令运行它:

go
pick_state -r
simulate -k -r 30
show_traces 1
quit

也许我的模特中有错误?或者我没有在shell中运行正确的命令。

提前致谢!

1 个答案:

答案 0 :(得分:2)

据我所知,在使用该工具之后,我会说你所遇到的是常见的行为,因为使用了伪随机发电机以某种方式。

基本上,我认为每次开始 NuSMV void srand(unsigned int seed)都会使用相同的种子值进行初始化。显而易见的结果是 NuSMV 在独立运行中执行完全相同的非确定性选择,只要您加载完全相同的模型并执行完全相同的命令序列。 / p>

这种设计在模型检查器中很常见,因为它允许重现用户更容易报告的潜在错误跟踪。

在查看NuSMV -help NuSMV 文档后,在我看来该程序无法选择手动设置任意种子用于伪随机生成器。 注意:您可能想要联系NuSMV邮件列表,有可能存在一些内部变量来借助set命令配置随机种子)

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

go
pick_state -r
simulate -r RANDOM_SEED
pick_state -r
simulate -r 30
show_traces 2
quit

基本上,我们的想法是利用第一个模拟,以便将伪随机生成器向前移动到伪随机链中的任意点。每次执行此脚本时,都会更改RANDOM_SEED的值,以便 NuSMV 的任意两次执行在伪随机中具有不同的起始点生成器用于第二个跟踪。通过这种方式, NuSMV 不再重复在第二次跟踪的其他执行中所做的相同选择,除非通过纯粹的机会发生

或者,您可以从 NuSMV 解算器的单次运行中获得所需的所有非确定性执行跟踪

go
pick_state -r
simulate -r 30
show_traces 1
pick_sate -r
simulate -r 30
show_traces 2
...
pick_state -r
simulate -r 30
show_traces N
quit

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

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

TYPE ERROR file test.smv: line 23 :
    illegal operand types of "=" : integer-set and integer

当我输入pick_state -i时。

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