首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NuSMV -和模型

NuSMV -和模型
EN

Stack Overflow用户
提问于 2017-09-25 16:00:25
回答 1查看 592关注 0票数 1

我正在尝试用NuSMV编写以下模型

换句话说,只有当x和y处于坏状态时,z才会变坏。这是我写的代码

代码语言:javascript
复制
MODULE singleton
    VAR state: {good, bad};
    INIT state = good
    TRANS (state = good) -> next(state) = bad
    TRANS (state = bad) -> next(state) = bad

MODULE effect(cond)
    VAR state: {good, bad};
    ASSIGN
    init(state) := good;
    next(state) := case
        (state = bad) : bad;
        (state = good & cond) : bad;
        (!cond) : good;
        TRUE : state;
        esac;

MODULE main 
    VAR x : singleton;
    VAR y : singleton;
    VAR z : effect((x.state = bad) & (y.state = bad));

但我只有这些可达的状态

代码语言:javascript
复制
NuSMV > print_reachable_states -v
######################################################################
system diameter: 3
reachable states: 3 (2^1.58496) out of 8 (2^3)
  ------- State    1 ------
  x.state = good
  y.state = good
  z.state = good
  ------- State    2 ------
  x.state = bad
  y.state = bad
  z.state = bad
  ------- State    3 ------
  x.state = bad
  y.state = bad
  z.state = good
  -------------------------
######################################################################

如何修改我的代码以获得

代码语言:javascript
复制
x.state = good
y.state = bad
z.state = good

x.state = bad
y.state = good
z.state = good

在可达状态下?

另外,我不确定是否要添加模型图片中的红色箭头:如果x和y的状态不好,我希望它迟早也会变差。

非常感谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-25 17:25:52

各州

代码语言:javascript
复制
x.state = good
y.state = bad
z.state = good

x.state = bad
y.state = good
z.state = good

无法访问,因为main的每个子模块在其他模块的同时执行一个转换,并且强制对状态变量进行确定性转换;也就是说,在您的模型中,xy同时将状态从good更改为bad。此外,与您的好图片相比,您的smv代码不允许任何自循环,只允许处于最后状态的一个。

要修复您的模型,只需声明--以防x (resp )。y)是good--你想要next(x)。( next(y))要么是good,要么是bad,但不强制这两个决定。(例如)

代码语言:javascript
复制
MODULE singleton
VAR
  state: { good, bad };

ASSIGN
  init(state) := good;
  next(state) := case
      state = good : { good, bad };
      TRUE         : bad;
    esac;


MODULE effect(cond)
VAR
  state: { good, bad };

ASSIGN
  init(state) := good;
  next(state) := case
      (state = bad | cond) : bad;
      TRUE                 : state;
    esac;


MODULE main
VAR
    x : singleton;
    y : singleton;
    z : effect((x.state = bad) & (y.state = bad));

注意:I也简化了模块effect__的规则,尽管这是不必要的。

您可以按以下方式测试该模型:

代码语言:javascript
复制
nuXmv > reset; read_model -i test.smv ; go; print_reachable_states -v
######################################################################
system diameter: 3
reachable states: 5 (2^2.32193) out of 8 (2^3)
  ------- State    1 ------
  x.state = good
  y.state = bad
  z.state = good
  ------- State    2 ------
  x.state = good
  y.state = good
  z.state = good
  ------- State    3 ------
  x.state = bad
  y.state = good
  z.state = good
  ------- State    4 ------
  x.state = bad
  y.state = bad
  z.state = bad
  ------- State    5 ------
  x.state = bad
  y.state = bad
  z.state = good
  -------------------------
######################################################################

关于第二个问题,我提供的代码示例保证了要验证的属性:

代码语言:javascript
复制
nuXmv > check_ltlspec -p "G ((x.state = bad & y.state = bad) -> F z.state = bad)"
-- specification  G ((x.state = bad & y.state = bad) ->  F z.state = bad)  is true

这显然是这样的,因为在您的图片中的红色边缘所勾画的自循环不存在。如果您仔细考虑一下,该转换将允许至少执行一个当前状态保持为

代码语言:javascript
复制
x.state = bad
y.state = bad
z.state = good

无限期地,这将是您的规范的反例。

编辑:

您也可以通过简单地编写以下代码来修复代码:

代码语言:javascript
复制
MODULE singleton
    VAR state: {good, bad};
    INIT state = good
    TRANS (state = bad) -> next(state) = bad

删除行TRANS (state = good) -> next(state) = bad允许xystate = good时任意更改,这意味着它们可以不确定地保留good或成为bad。这完全等同于我提供给您的代码,尽管乍一看不太清楚,因为它隐藏了不确定的内容,而不是将其显式化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46409484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档