NuSMV 陷入了一个微不足道的僵局
NuSMV getting stuck at a trivial deadlock
假设我在 NuSMV 中编写了一个从状态 S1 开始的模型。我想检查此模型检查器中的条件是否在所有情况下最终都达到状态 S70。现在可视化我编码如下的 NuSMV 模型:
从上面可以明显看出最终会达到 S70,但可能需要 70 多个时间步长。为什么?因为你可能先去 S2,然后去 S3,而不是去 S4,然后再回到 S2,这个模式会重复,比如说 100 次。 NuSMV 软件也考虑了这种可能性,以确认肯定会达到 S70。
问题是NuSMV说S70达不到,反例就是这样:-
S1->S2->S3->S2
所以反例就是这4个步骤。但令我惊讶的是,NuSMV 无法弄清楚这种僵局最终会随着时间的推移而得到解决。为什么我会得到一个不直观的结果?
我在图中显示的自动机可能是我希望我的 NuSMV 代码表示的,但我错误地编码了一两行,但我不这么认为。否则 NuSMV 怎么会认为它可以从 S2 转到 S3。如果它能计算出可以从 S2 到 S3 那么为什么要在 S2 终止上面的反例?
谁能解释一下?
But I am amazed that NuSMV cannot figure out that this deadlock will eventually get resolved over time
我不确定这种情况对应的是definition of "deadlock"。无论如何,NuSMV
指出存在程序永远不会达到状态 S70
.
的执行是正确的
可达性问题的反例(在没有死锁状态的适当模型中)总是无限执行跟踪。你得到的反例:
S1->S2->S3->S2
由两部分组成:
- a prefix部分:状态序列,从初始状态开始,到达无限循环部分。在这种情况下,它只是
S1
.
- a loop 部分:自循环状态序列,很容易识别,因为它以与开始时相同的状态结束。在这种情况下,它是
S2 -> S3 -> S2
这是你的自动机的有效无限执行路径,这意味着程序总是从S3
跳转到S2
并且永远不要去 S4
,因为它永远不会触及 S70
,所以它也是你的 属性.
的反例
我不确定如何进一步帮助您解决问题,因为您没有说明您使用的是 LTL 还是 CTL,你也没有提供任何关于你的模型的进一步信息。可能需要更改模型、属性或两者。如果可以的话,我建议您看一下 NuSMV
/nuXmv
上 this course 第二部分的幻灯片,以便更好地了解该工具。
编辑
让我们假设在正在建模的现实世界场景中,技术上不可能发生这种无限执行,即这种可能性是建模阶段引入的一些简化的结果,或者这种情况可能确实会发生,但出于有据可查的原因,我们根本对这种极端情况不感兴趣。
那么,解决的办法就是将这种执行痕迹排除在验证部分之外,使其不能作为反例出现。确切的解决方案可能取决于正在验证的模型,我无法使用它,但可以举个例子:
(! (G (F S2))) -> (F S70)
此编码假定在 S70
之后不存在到 S2
的环回。否则,应使用其他方法。
假设我在 NuSMV 中编写了一个从状态 S1 开始的模型。我想检查此模型检查器中的条件是否在所有情况下最终都达到状态 S70。现在可视化我编码如下的 NuSMV 模型:
从上面可以明显看出最终会达到 S70,但可能需要 70 多个时间步长。为什么?因为你可能先去 S2,然后去 S3,而不是去 S4,然后再回到 S2,这个模式会重复,比如说 100 次。 NuSMV 软件也考虑了这种可能性,以确认肯定会达到 S70。
问题是NuSMV说S70达不到,反例就是这样:-
S1->S2->S3->S2
所以反例就是这4个步骤。但令我惊讶的是,NuSMV 无法弄清楚这种僵局最终会随着时间的推移而得到解决。为什么我会得到一个不直观的结果?
我在图中显示的自动机可能是我希望我的 NuSMV 代码表示的,但我错误地编码了一两行,但我不这么认为。否则 NuSMV 怎么会认为它可以从 S2 转到 S3。如果它能计算出可以从 S2 到 S3 那么为什么要在 S2 终止上面的反例?
谁能解释一下?
But I am amazed that NuSMV cannot figure out that this deadlock will eventually get resolved over time
我不确定这种情况对应的是definition of "deadlock"。无论如何,NuSMV
指出存在程序永远不会达到状态 S70
.
可达性问题的反例(在没有死锁状态的适当模型中)总是无限执行跟踪。你得到的反例:
S1->S2->S3->S2
由两部分组成:
- a prefix部分:状态序列,从初始状态开始,到达无限循环部分。在这种情况下,它只是
S1
. - a loop 部分:自循环状态序列,很容易识别,因为它以与开始时相同的状态结束。在这种情况下,它是
S2 -> S3 -> S2
这是你的自动机的有效无限执行路径,这意味着程序总是从S3
跳转到S2
并且永远不要去 S4
,因为它永远不会触及 S70
,所以它也是你的 属性.
我不确定如何进一步帮助您解决问题,因为您没有说明您使用的是 LTL 还是 CTL,你也没有提供任何关于你的模型的进一步信息。可能需要更改模型、属性或两者。如果可以的话,我建议您看一下 NuSMV
/nuXmv
上 this course 第二部分的幻灯片,以便更好地了解该工具。
编辑
让我们假设在正在建模的现实世界场景中,技术上不可能发生这种无限执行,即这种可能性是建模阶段引入的一些简化的结果,或者这种情况可能确实会发生,但出于有据可查的原因,我们根本对这种极端情况不感兴趣。
那么,解决的办法就是将这种执行痕迹排除在验证部分之外,使其不能作为反例出现。确切的解决方案可能取决于正在验证的模型,我无法使用它,但可以举个例子:
(! (G (F S2))) -> (F S70)
此编码假定在 S70
之后不存在到 S2
的环回。否则,应使用其他方法。