常见问题解答

#001我想扩展NuSMV并实现一个新功能,但我在源代码库中迷失了方向。我应该从哪里开始?

目前,没有针对开发人员的教程。我们正在努力。但是,如果您有任何问题,请发送电子邮件至我们会尽快回答你的问题。

#002NuSMV崩溃,错误类似于“bdd_and_abstract:result=NULL”,我该怎么办?

NuSMV很可能会抛出这样的错误,因为您的系统内存不足(即内存不足)。您应该检查运行NuSMV时是否有足够的内存。如果是这种情况,那么您可能发现了一个错误。请报告给包含以下信息:运行的命令、使用的SMV模型、传递给NuSMV的所有选项以及系统规范。

您还可以尝试重新执行NuSMV以启用BDD动态变量排序,即提供-动态在命令行中标记,或dynamic_var_ordering-e筛选在NuSMV shell提示符下。

#003当NuSMV出现分段错误时,我正在进行一些检查。我相信我的模型写得对,你知道如何解决这个问题吗?

一个原因可能是堆栈大小限制较低:NuSMV仍然使用一些递归函数。在Linux/Unix下,完全消除此限制通常不会产生问题;

  • 带有(ba)sh问题ulimit-s无限制;
  • 使用(t)csh限制堆叠大小不受限制.

在Windows下,堆栈大小在可执行文件中是硬编码的。可以使用Visual Studio实用程序editbin.exe以增加堆栈大小。但是,由于将保留此内存,因此最好将其设置为合理的数量(例如10 MB)。

命令是editbin/stack:10485760 NuSMV.exe.
要检查它是否工作,请运行转储箱/标题NuSMV.exe并寻找字符串堆栈保留大小.

#004我以这种方式启动NuSMV:“NuSMV filename.smv”,它立即退出,并给我一条错误消息。然后我尝试了“NuSMV-bmc filename.smv”,一切都很好,我只收到了一个警告,与之前的文本相同。我很困惑,这是一只虫子吗?

我以这种方式启动了NuSMV:NuSMV文件名.smv它立即停止给我错误消息。然后我试着NuSMV-bmc文件名.smv,一切都很好,我只收到了一个警告,文本与之前一样。我很困惑,这是一只虫子吗?

不可以。启动NuSMV的第一种方法是使用BDD执行符号模型检查。该技术可以检测模型中的许多错误。选项-骨基质细胞使用SAT运行有界模型检查。此技术无法检测到BDD那么多的错误,因此我们插入了一些关于潜在错误的警告。例如,考虑以下模型:

1
2
模块 主要的
VAR(无功功率) x个 : 单词[16];
INVAR公司 x个 / x个 = 0第16_1页

它使BDD引擎错误终止第3行:被零除而BMC报告警告:在第2行,表达式可能包含被零除并继续执行。在这种情况下,用户有责任保证永远不会被零除。

解决方案之一是添加防护装置,例如:

1
INVAR公司 x个 != 0第16_0天 ? x个/x个=0第16_1页 : 真的;

#005使用CPP预处理器时,我的宏不会展开。为什么?

请始终记住,CPP预处理器是为C/C++语言设计的。可能是因为使用宏的SMV文件部分未被CPP预处理器识别为“可扩展”。

例如,使用以下模型调用“NuSMV-pre-cpp”:

1
#定义A_MACRO 5

1
2
模块 主要的
VAR(无功功率) 迈拉: 阵列 1..A_MACRO公司 属于 布尔值;

将导致以下错误:

1
标记“A_MACRO”文件cpp.smv第3行出现意外值:应为数字,但未找到。

因为这两个点(..)然后是A_MACRO公司不是由CPP预处理器扩展的。解决方案是在两个点后添加一个空白:

1
#定义A_MACRO 5

1
2
模块 主要的
VAR(无功功率) 迈拉: 阵列 1.. A_MACRO公司 属于 布尔值;

#006NuSMV实现的CTL模型检查的语义是什么?

NuSMV提供了“定点”语义。这是时间操作符的不动点特征的标准集合(在公平和非公平的情况下不同),它假设转换关系是完全的和无死锁的。

此外,在NuSMV中,所有初始公平状态都有一个隐含的通用量词。其结果是,如果没有初始公平状态,那么所有公式都会通过。

量化所有初始公平状态的选择(可能有争议)与模型检查问题的“经典”定义不同,模型检查问题不限于公平初始状态。然而,CadenceSMV也采用了这一选择。

#007带有顶级存在路径量词的CTL规范被错误地报告为被违反。例如,对于下面的模型,两个规范都报告为假,尽管其中一个只是另一个的否定!我知道死锁状态可能会出现这样的问题,但用-ctt运行它说明一切都很好。

带有顶级存在路径量词的CTL规范被错误地报告为被违反。例如,对于下面的模型,两个规范都报告为假,尽管其中一个只是另一个的否定!我知道死锁状态可能会出现这样的问题,但用-ctt运行它说明一切都很好。

MODULE主模块VAR b:布尔值;TRANS next(b)=b;CTLSPEC EF b公司CTLSPEC!(EF b)

CTL公式适用于所有初始状态。对于所提供的示例,有两个初始状态,其中一个违反了一个规范,另一个初始状态违反了另一个规范。

#2008年我正在尝试使用NuSMV为CTL执行定理证明/可满足性,但即使使用无约束模型,我也会得到令人困惑的结果。我该如何解释这些结果?

NuSMV不适合检查CTL的可满足性,而对于LTL,则使用无约束模型进行检查。

事实上,具有TRUE转换关系的模型显示了所有LTL行为(即状态序列),但它只显示了特定的CTL行为(如状态树),其中每个状态都有精确的2^个后继(n是模型中命题变量的数量,因为模型是一个集团)。例如,这种模型满足EX价格但不是AX页,尽管两者都令人满意。

最后,从理论的角度来看,我们注意到CTL的可满足性是EXPTIME完全的,因此可能不可归结为PSPACE完全的CTL模型检查。

#009我使用-coi选项对NuSMV进行了一些检查;当我尝试重新执行跟踪时,即使使用命令execute_partial_traces,也会收到一条错误消息。检查是否正确?为什么痕迹看起来是错误的?

当然,检查是正确的。关键是,选项-coi(影响锥)强制构建局部模型,其中仅包含受所检查属性影响的变量。这样,NuSMV可能会发现原始模型中不存在的循环。如果模型不包含死锁,则可以通过细化计算出的反例来重建具体反例。然而,这不是由NuSMV执行的。

下面是一个显示此行为的小示例。

1
2

4
5
6
7
8
9
模块 主要的
VAR(无功功率) x个 : 单词[];
VAR(无功功率)  : 单词[4];
分配
初始化(x个) := 0ud3_0个;
下一个(x个) := x个 + 0ud3_1;
初始化() := 0ud4_0个;
下一个() :=  + 0ud4_1;
LTLSPEC公司 ! G公司 F类 (x个 = 0ud3_7);

NuSMV-coi文件.smv仅用变量生成反例x个那是从x=0x=7然后循环回x=0。如果我们要求重新执行使用execute_partial_traces生成的部分跟踪,NuSMV会抱怨无法通过赋值给变量y来完成跟踪。这是因为,从x=7&y=7我们不能去x=0&y=0整个系统的反例需要一条从x=0&y=0x=7&y=15可以循环回x=0&y=0(这是NuSMV在禁用影响锥减少的情况下调用时生成的反例。

我们注意到,NuSMV中实现的影响减少锥以及CTL/LTL模型检查算法假设具体模型是无死锁的。

#010NuSMV肯定给了我一个错误的结果。考虑下面的简单示例。

NuSMV肯定给了我一个错误的结果。考虑下面的简单示例。

MODULE主模块VAR c:单词[16];赋值初始值(c):=0d16_0;分配下一个(c):=c+0d16_1;INVAR c<0d16_100;LTLSPEC G(c=0d16_0)
$ ./NuSMV model.smv——规范G c=0ud16_0为真

结果似乎完全错误。这怎么可能?

原因是模型中存在死锁。如果您尝试以这种方式增加详细级别./NuSMV-v 1模型.smv你收到这个警告:

1
2

4
********警告********有限状态机的公平状态集为空。这可能会使模型检查的结果不可信。********结束警告********

可以使用NuSMV命令检测死锁的存在检查fsm.

如果使用的是影响锥减少,则不能进行此检查,因为它会阻止NuSMV构建完整的模型。然而,模型构建可能会受到构建模型-f.

也可以在批处理模式下发出-电流互感器命令行标志。

#2011年我得到了两个不同的结果,使用基于BDD和基于SAT的模型检查来验证相同的LTL属性。这是一个错误吗?

我写了一个最低限度的模型,其中包括:

MODULE主模块VAR s:布尔值;传输s=真LTLSPEC G(s=真)

基于BDD的模型检查证明LTL规范有效,但基于SAT的有界模型检查违反了该规范。
哪个是正确的结果?是什么导致了这种行为?

NuSMV中实现的基于BDD的LTL模型检查算法仅考虑无限路径。因此,即使对于不适用的安全属性,也会生成套索形状的反例,尽管有限路径就足够了。在进行检查时,假设转换关系的总数和没有死锁,搜索仅限于考虑无限路径,而忽略导致死锁的所有路径。因此,不会检测到导致死锁和伪造属性的有限路径。

基于SAT的有界模型检查算法也假设转移关系的总和和无死锁,但它们正在为给定的有限或无限属性寻找反例。因此,与基于BDD的LTL模型检查算法不同,将检测到导致死锁和篡改属性的有限路径。

这两种算法都假设转换关系的总和和无死锁,但它们没有具体检查是否满足这些条件。用户有责任执行此检查,例如在批处理模式下发出-ctt命令行标志,或调用NuSMV shell中的check_fsm命令。

到目前为止,在基于SAT的有界模型检查中没有禁止搜索有限路径的标志。然而,通过在模型中添加以下公正公平条件

1
正义 真的;

有界模型检查算法停止查找有限路径,并将搜索限制为仅搜索无限路径:

当NuSMV模型包含多个初始状态时,报告的验证结果可能会发生另一种差异。基于BDD的方法依赖于将LTL模型检查减少为CTL模型检查(通过表格构造)。CTL模型检查在公平初始状态集上普遍量化。因此,只考虑公平的初始状态。可能会有不公平的初始状态,并且不会被考虑。这个选择可能有问题,但CadenceSMV也显示了这一点。不同的是,基于BMC的模型检查并不局限于只考虑公平的初始状态。因此,如果存在一个不公平的初始状态,并且有一条有限路径违反了公平条件,那么它就会找到它。

#012自2.5.2版以来,当使用进程时,我收到以下警告:warning\*\*processes仍然受支持,但已弃用。尽管如此,NuSMV 2.5用户手册仍使用流程。为什么流程被弃用?应该使用什么来代替流程?

不推荐NuSMV中的进程的主要原因是:

  1. 正确性
    目前,如果模型不包含任何TRANS/INIT/INVAR,则流程可以正常工作。

    如果出现任何此类构造,则不容易定义未运行进程的框架条件。由于这个原因,当使用关系结构来对行为建模时,当前实现不支持正确的过程。

  2. 流程层次结构的语义
    在另一个进程中拥有一个进程具有非直观行为,即只有其中一个进程可以处于活动状态,而如果父进程也在运行,则可能会期望内部进程也正在运行。

    此外,SMV中的行为定义不是局部的,因为可以从该流程外部定义流程的逻辑。非局部性使得过程的明确语义的定义更加复杂。

  3. 同步
    NuSMV的核心是以同步为理念的。调整它以支持异步进程会增加复杂性,这对核心结构有不良影响。

出于这些原因,我们决定将目标定在核心只支持同步系统,并且对异步的支持建立在其之上,可能来自NuSMV。

其思想是要有一个语义清晰的级别(可能提供一种富于表现力的用户语言)来支持异步进程,并在该级别和核心支持的SMV语言之间有一个定义良好的映射。

我们知道,这个决定可能会让一些用户投诉。然而,我们认为在这种情况下,惯性没有帮助,我们坚信,在过渡结束时,NuSMV将比现在更加强大和有效。

#013我的PSL表达式的解析方式与我想象的不同,或者即使在我看来是正确的,也会出现解析错误,我该怎么办?

如果您使用的是PSL运算符,例如“always”、“never”、“next”、“next!”等。。。,插入括号可以解决问题,改变表达式的解析方式。以下是NuSMV如何解析PSL表达式的一些示例:

1
2

4
模块 主要的
VAR(无功功率)
x个 : 布尔值;
 : 布尔值;

1
2

4
PSLSPEC公司
总是 x个 -> 下一个();
--解析为:
--始终((x->下一个(y))

1
2

4
PSLSPEC公司
总是 (!x个 -> 下一个( <-> x个));
--解析为:
--始终((!x->next((y<->x)))

1
2

4
PSLSPEC公司
总是 (!x个 -> (下一个() <-> x个));
--解析为:
--始终((!x->(下一个(y)<->x))

1
2

4
PSLSPEC公司
总是 (!x个 -> (下一个  <-> x个));
--解析为:
--始终((!x->(下一个(y)<->x))

1
2

4
PSLSPEC公司
总是 (!x个 -> ((下一个()) <-> x个));
--解析为:
--始终((!x->(下一个(y)<->x))

#014模型检查可能是一项非常耗时的活动。如何才能加快NuSMV的执行速度?

NuSMV提供了多种优化技术。这里我们列出了最有效的方法(有关详细信息,请参阅命令文档):

通用技术

  1. 使用影响锥。根据要检查的属性,这可能非常有效。
    (选项:-coi)
  2. 禁用某些功能:
    • 计算可达状态(选项:-数据流);
    • 生成反例记录道(选项:-dcx公司);

基于SAT的模型检查技术

一般来说,基于SAT的有界模型检查(bmc)通常比BDD的检查更快,尤其是对于大型模型和查找错误。然而,对于基于SAT的bmc来说,由于需要使用非常大的界限,因此能够得出财产持有的结论可能会更加复杂。

  • 使用增量算法(检查_ltlspec_bmc_inc,检查_ltlspec_sbmc_inc);

基于BDD的模型检查技术

  • 启用动态变量重新排序
    (选项:-动态
    命令:dynamic_var_ordering-e筛选);

  • 使用现有变量排序文件
    (选项:-i名称);

  • 禁用BDD缓存
    (命令:设置enable_sexp2bdd_caching 0);

  • 调整BDD包的缓存
    (命令:设置BDD。“缓存大小的硬限制”<new_value>);
    (命令:设置BDD。“调整大小的缓存命中阈值”<new_value>);
    (命令:设置BDD。“快速唯一表增长的限制”<new_value>);
    (请参见cudd-24.4.1.1/doc/cudd.ps)

  • 生成变量排序文件。遵循以下步骤:
    1. 启用动态重新排序(选项-动态);
      启动长流程一段时间(几分钟、一小时、一天,取决于问题的大小);
    2. 中断计算ctrl+c(它可能无法在窗口下工作);
    3. 转储排序文件(命令写订单);
    4. 使用生成的排序文件退出并重新启动计算
      (选项-i名称).

请注意,可以多次迭代a-c步骤以尝试提高排序文件的质量,即第i次迭代使用(i-1)-th生成的排序文件作为初始文件订购。

#015嗨,我正在使用SMV为有限游戏中的可达性建模。为此,我建立了一个模型,其中包含一些初始状态(对应于游戏中的初始状态)和一个转换关系(对应于移动)。为了检查是否(以及如何)可以达到某个状态,我检查了LTL公式(实际上只有可达性)“AG!property”,并使用了反例。这对于基于BDD的模型检查很有用。然而,当使用基于SAT的BMC时,它完全忽略了指定的初始状态,即导出的反例不是从模型中指定的初始态开始的。

你好,

我正在使用SMV对有限游戏中的可达性进行建模。为此,我建立了一个模型,其中包含一些初始状态(对应于游戏中的初始状态)和一个转换关系(对应于移动)。为了检查是否(以及如何)可以达到某个状态,我检查了LTL公式(实际上只有可达性)“AG!property”,并使用了反例。

这对于基于BDD的模型检查很有用。然而,当使用基于SAT的BMC时,它完全忽略了指定的初始状态,即导出的反例不是从模型中指定的初始态开始的。当然,这在我的应用程序中不是很有用,因为游戏的初始状态至关重要。

对于基于SAT的bmc,我使用了“NuSMV-bmc model.smv”,这是输出:

--无法证明不变量!finished为true或false:归纳失败--如下执行序列所示--说明:BMC导入失败跟踪类型:反例->状态:1.1-<-...

其中状态1.1不是我的模型的初始状态。

你能告诉我为什么初始状态被忽略了吗?在基于SAT的BMC中,是否有办法避免这种行为?

你好,

使用您默认使用的命令,NuSMV试图通过使用BMC的归纳来证明不变量。

在您的案例中,入职培训失败,NuSMV会通知您这一点。

1
2
--无法证明不变量!finished是真是假:归纳法
--失败,如以下执行序列Trace所示
--说明:BMC感应失败

产生的轨迹见证了归纳步骤的失败,即从不变量保持(不一定)初始状态的状态到不变量不保持的状态。

您应该使用其他不变量检查算法,如伪造、zig-zag、een-sorensson、dual,以避免出现此问题。这些算法只能通过交互式shell使用,因为并非所有算法都可以通过命令行选项使用。

下面是使用伪造与NuSMV的简单交互。

1
2

4
$ NuSMV公司 –整数 文件.smvNuSMV公司 > go_bmc公司NuSMV公司 > 检查_invar_bmc_inc –a 伪造NuSMV公司 > 退出

对于全套选项,请尝试检查_invar_bmc–h或检查_invar_bmc_inc–h.

有关自动化流程的信息,请参阅常见问题解答#016。

#016我注意到交互式shell具有比批处理模式更丰富的功能集。如何在批处理模式下使用这些功能?

有两种解决方案:

  1. 使用命令文件
    在一个文件中写入您将在交互模式下使用的命令,例如script.cmd。然后您可以简单地:

    1
    NuSMV公司 -源 脚本.cmd 模型.smv

    下面是命令文件的简短示例:

    1
    2
    设置 打开失败脚本退出 go_bmc公司 检查invarspec_bmc_inc -一个 伪造退出

    您甚至可以组合批处理命令和交互式命令:

    1
    NuSMV公司 [-批处理命令1 -批处理命令2 ...] -源 脚本.cmd 型号.smv
  2. 使用管道
    在类UNIX系统上,您可以简单地执行以下操作:

    1
    2
    回声 “设置为失败脚本退出;go_bmc;check_invarspec_bmc_inc-a\
    伪造;退出“ | NuSMV公司 -整数

    1
    $  脚本.cmd | NuSMV公司 -整数

    命令“set on_failure_script_quits”非常有用,因为如果没有它,如果在交互模式中发生非致命错误,解释器只需停止当前执行的命令,打印问题原因,并提示输入新命令,从而阻塞脚本。

有关更多信息,请参阅NuSMV 2.5用户手册第3章“交互式运行NuSMV”的介绍。

#017BMC在哪里?NuSMV似乎不包含任何BMC相关功能。例如,命令行`-bmc`选项以及所有bmc交互式命令(如`check_invar_bmc`)都不可用。

您从源代码编译了NuSMV,但在配置时找不到合适的SAT解算器,如Minisat。

配置阶段实际上会向您发出如下消息:

1
2

4
5
6
7
8
9
10
11
12
13
14
15
16
------------------------------------------------------------------
这个 微型卫星  解算器  不是  链接的  NuSMV公司.
如果  希望  链接 , 拜托 使用 配置 选项
--enable-minisat,使用-minisat-libdir,使用-milisat-incdir。
对于 进一步的 帮助, 尝试 "./配置 --帮助”。
------------------------------------------------------------------

------------------------------------------------------------------
警告:   解算器   链接的  NuSMV公司.
警告: 全部 NuSMV公司 命令  选项 那个 依赖    
警告: 解算器    可获得的.
警告: 如果  希望  使用  解算器 NuSMV公司 特征, 拜托 
警告: 编译  链接 这个 兹查夫  解算器  这个 超小卫星
警告:  解算器.
警告: 对于 进一步的 帮助, 尝试 "./配置 --帮助”。
------------------------------------------------------------------

解决方案:必须重新编译nusmv和至少一个SAT解算器,如Minisat或ZChaff。有关更多信息,请参阅源代码发行版中的nusmv/README。