了解Spin Modelchecker的错误跟踪

时间:2012-04-13 03:16:47

标签: model-checking spin

我正在尝试使用Spin Model Checker来模拟两个对象(A和B)之间的游戏。对象在板上移动,每个位置由其(x,y)坐标定义。这两个对象应该不会发生碰撞。我有三个过程:init,A Model,B Model。我是模型检查ltl属性:(活动属性检查两个对象是否占用相同的位置)

ltl prop1 { [] (!(x_a == x_b) && !(y_a == y_b)) }

我得到的错误路径是:   init - >模型 - > B模型 - >初始化

但是,我不应该根据显示的数据得到错误跟踪(反例):x_a = 2,x_b = 1,y_a = 1,y_b = 1.

第一个init也经历了init进程的所有行,但第二个只显示到它的最后一行。

此外,我的A模型和B模型仅包含“执行”块中的警卫和操作,如下所示。然而,它们更复杂,并且在' - >'

右侧有块
active proctype AModel(){
do
:: someValue == 1 -> go North
:: someValue == 2 -> go South
:: someValue == 3 -> go East
:: someValue == 4 -> go West
:: else -> skip;
od
}

我是否需要在原子块中放置任何东西?我问的原因是错误跟踪显示的行甚至没有进入'do'块,它只是两个模型的第一行。

编辑: LTL属性是错误的。我改为:

ltl prop1 { [] (!((x_a == x_b) && (y_a == y_b))) }

但是,我仍然得到完全相同的错误路径。

1 个答案:

答案 0 :(得分:2)

您的LTL属性被错误地实施。从本质上讲,SPIN发现的反例是LTL的真实反例,如上所述。

[] ( !(x_a == x_b) && !(y_z == y_b) )   =>
[] ( !(2 == 1) && !(1 == 1) )  =>
[] ( !0 && !1) =>
[] ( 1 && 0)   =>
[] 0  =>
false

LTL应该是:

always not (same location) =>
[] (! ((x_a == x_b) && (y_a == y_b))) =>
[] (! ((2 == 1) && (1 == 1))) =>
[] (! (0 && 1) =>
[] (! 0) =>
[] 1 =>
true

关于你的init和任务。在开始执行任务时,您需要确保在任务运行之前完成初始化。我将使用以下两种方法之一:

init { ... atomic { run taskA(); run taskB() } where tasks are spawned once all initialization is complete`

bool init_complete = false;
init { ...;  init_complete = true }
proctype taskA () { /* init local stuff */ ...; init-complete -> /* begin real works */ ... }

初始化期间您的LTL可能会失败。

根据你的问题,如果你改变了x或y,你最好在原子{}中同时改变它们。