我想用一个模型检查程序测试我的代码并从中调出一个FSM 以自动方式。为此,我需要一个模型检查器并将FSM结果转换为CNF。
有关如何在Python中执行此操作的任何建议吗?我只知道CBMC,但仅限于C。
由于 阿德里安
答案 0 :(得分:3)
Python不是一种适合模型检查的语言,例如duck typing可以很自由地引发异常。如果您的代码基本上是程序性的,那么您可以尝试使用py2c
或某些等效代码将其转换为C
。
然后使用modex
从C
代码中提取promela
模型。最后一步称为抽象。然后,您可以使用SPIN
模型检查器来验证感兴趣的属性。
如果CNF代表" Conjunctive Normal Form",那么我不明白CNF如何与模型检查的结果相关。模型检查产生一个"是的,你的模型模拟你提供的逻辑公式"或者"不,它没有,这是一个反例,为什么不是"。 CNF是布尔公式的特定句法形式。
如果您提到CNF与使用CBMC
的有界模型检查相关并且涉及SAT解决,那么请注意SPIN
接受使用promela
语言表达的Kripke模型作为输入。因此,您不需要将任何内容转换为布尔公式,此外,您还可以运行完整的活动验证检查。
有关模型检查工具的更多选项,请查看this list。特别是,如果您想将自己的转换器从python
转换为promela
,那么您可能会发现有用的项目:
- promela-metamodel
- ocaml
library for promela
- pi2promela
- Program to Promela converter。
另外,请注意" FSM" (有限状态机)是传感器,而不是Kripke结构。传感器具有输入和输出。它通过产生产出来对投入作出反应。它是在对抗设置中合成的结果,其中一个具有环境(控制输入)和一个系统(控制输出),并且想要合成满足以逻辑公式形式表达的某些规范的策略。有几种工具可以解决这个问题。结果是Mealy机器或Moore机器(它们不同且不相同),两者都是传感器类型。
传感器不是Kripke结构(或过渡系统,虽然后一个术语通常使用错误,所以更好地指代Kripke结构或模型,可以用一个图表来表示状态,这些状态由你在逻辑公式中引用的命题标记,这是你想要的规范。)
观察综合是如何与验证相反的(模型检查是一种验证形式):封闭系统综合(无环境)采用公式并以Kripke结构的形式合成满足它的模型。封闭系统验证采用模型和期望的公式,然后检查模型是否满足规范。封闭系统综合也可以通过使用部分模型(在某种意义上它定义什么是可容许的行为,但包括比期望和使用逻辑公式表达的行为更多的行为),以及逻辑公式,并产生它的子模型,它满足(或"模型")逻辑公式。
开放系统综合可以使用逻辑公式作为输入,然后通过解决系统和环境之间的游戏,我们获得了一个传感器,它实现了系统满足逻辑公式的策略,无论环境如何选择(假设环境符合逻辑公式)。
注意传感器(FSM)之间的差异,与开放系统综合相关(当然,验证,但模型检查器通常将输入封闭系统作为输入,因此在封闭系统环境中对环境进行建模必须通过以下方式完成:在Kripke结构中引入不受控制的非确定性)和Kripke结构或有限过渡系统,作为闭合系统综合的输入。