我如何将这些更改为 NuSMV 模型中的 CTL SPEC?

2023-12-03

我需要帮助编写这些 CTL。我还不太明白如何以 NuSMV 格式编写,希望我的代码对您有意义,因为它是不完整的 atm。

2)如果一个进程正在等待,它最终会到达其临界区

3)两个进程必须“轮流”进入临界区

4)一个进程有可能连续两次进入临界区(在另一个进程进入之前)。

5) 进程 1 连续进入临界区将至少间隔 n 个周期,其中 n 是某个常数。您应该为 n 选择一个合适的值,并且应该验证该值(即,而不是反驳)。

6) 您选择的另外 2 个重要属性

MODULE thread1(flag2,turn)
VAR
   state : {W0,F1,W1,T1,F2,Wait,F3,C1,T2,F4};
   flag1 : boolean;

ASSIGN
   init(state) := W0;
   next(state) :=
case
   state = W0                 : F1;  
   state = F1                 : W1;  
   state = W1 & flag2         : T1; 
   (state = W1) & !flag2      : C1;  
   (state = T1)&(turn = 2)    : F2;  
   (state = T1)&(turn != 2)   : W1;  
   (state = F2)               : Wait; 
   (state = Wait)&(turn = 1)  : F3;   
   (state = Wait)&(turn != 1) : Wait; 
   (state = F3)               : W1; 
   (state = C1)               : T2; 
   (state = T2)               : F4; 
   (state = F4)               : W0;
    TRUE : state;
esac;

init(flag1) := FALSE;
next(flag1) := 
case
   state = F1 | state = F3 : TRUE;  
   state = F2 | state = F4 : FALSE; 
   TRUE                    : flag1;
esac;

DEFINE
  critical := (state = C1);
  trying := (state = F1 | state = W1 | state = T1 | state = F2 |     state = Wait | state = F3);  

MODULE thread2(flag1,turn)
VAR
   state1 : {N0,N1,N2,N3,N4,Wait1,N5,Critical1,N7,N8};
   flag2 : boolean;

ASSIGN
   init(state1) := N0;
   next(state1) :=
case
   (state1 = N0)               : N1;  
   (state1 = N1)               : N2;  
   (state1 = N2) & flag1       : N3;  
   (state1 = N2) & !flag1      : Critical1;
   (state1 = N3) & (turn = 1)  : N4;  
   (state1 = N3) & (turn != 2) : N2;  
   (state1 = F4)               : Wait1; 
   (state1 = Wait1)&(turn = 2) : N5;   
   (state1 = Wait1)&(turn != 2): Wait1; 
   (state1 = N5)               : N2; 
   (state1 = Critical1)        : N7; 
   (state1 = N7)               : N8;
   (state1 = N8)               : N0;
    TRUE : state1;
esac;

init(flag2) := FALSE;
next(flag2) := 
case
   state1 = N1 | state1 = N5 : TRUE;  
   state1 = N4 | state1 = N8 : FALSE;
   TRUE                    : flag2;
esac;

DEFINE
  critical := (state1 = Critical1);
  trying := (state1 = N1 | state1 = N2 | state1 = N3 | state1 = N4 |     state1 = Wait1 | state1 = N5);  

MODULE main

VAR

turn: {1, 2};
proc1: process thread1(proc2.flag2,turn);
proc2: process thread2(proc1.flag1,turn);

ASSIGN

init(turn) := 1;
next(turn) := 
case
   proc1.state = T2 : 2;
   proc2.state1 = N7 : 1;
   TRUE : turn;
esac;

SPEC 

AG !(proc1.critical & proc2.critical); 
--two processes are never in the critical section at the same time

SPEC 
AG (proc1.trying -> AF proc1.critical);

Note:为您全面介绍CTL答案是相当不现实的。此外thisNuSMV/nuXmv 上的快速而肮脏的课程,您可能会受益于查看这些幻灯片,提供了 CTL 模型检查的理论背景。


CTL 操作员

为简单起见,假设您的程序有一个unique 初始状态.

的语义CTL运算符如下:

  • AF P: in all可能的执行路径,迟早 Ptrue.
  • AG P: in all可能的执行路径,P is always true.
  • AX P: in all可能的执行路径,在next state P is true.
  • A[P U Q]: in all可能的执行路径,P is true * until Q is true(至少一次)。

  • EF P: 至少在一个执行路径,迟早 Ptrue.

  • EG P: 至少在一个执行路径,P is always true.
  • EX P: 至少在一个执行路径,在next state P is true.
  • E[P U Q]: 至少在一个执行路径,P is true * until Q is true(至少一次)。

*: until is true也在一条路上P从来没有true,前提是Q是立即verified。 [另请参阅:弱/强直到]

如果你有multiple 初始状态,那么CTL财产如果是则成立true对于每一个初始状态.

CTL operators


特性:

请注意,自从您的NuSMV模型目前已损坏,这似乎是一项作业,我将为您提供一个伪代码属性的版本,并让您将其适合您自己的代码。

  • 如果一个进程正在等待,那么它最终将到达其临界区

    CTLSPEC AG (proc1.waiting -> AF proc1.critical);
    

    解释:括号的内容与您阅读的句子完全相同。我添加了AG因为该属性必须明确适用于模型中的每个可能状态。如果省略它,那么模型检查器将简单地测试是否proc1.waiting -> AF proc1.critical is true在你的初始状态。

  • 两个进程必须“轮流”进入临界区

    CTLSPEC AG ((proc1.critical -> AX A[!proc1.critical U proc2.critical]) &
               (proc2.critical -> AX A[!proc2.critical U proc1.critical]));
    

    解释:让我假设这种编码有效,因为两者proc1 and proc2留在临界区 for only one state。的想法proc1.critical -> AX A[!proc1.critical U proc2.critical]如下:“如果进程 1 处于临界区,那么从下一个状态开始,进程 1 永远不会(再次)处于临界区,直到进程 2 处于临界区”.

  • 一个进程有可能连续两次进入临界区(在另一个进程进入之前)。

    CTLSPEC EF (proc1.critical -> EX A[!proc2.critical U proc1.critical]);
    

    解释:与上一篇类似。这里我用的是EF因为它足够财产holds就一次。

  • 进程 1 连续进入临界区将至少间隔 n 个周期,其中 n 是某个常数。您应该为 n 选择一个合适的值,并且应该验证该值(即,而不是反驳)。

    edit:我删除了这个编码,因为再一想我写的公式是很多stronger比要求的。不过,我认为不可能通过E运算符,因为它会变得很多weaker比要求的。目前,除了修改模型来计算数量之外,我想不出其他可能的选择cycles, 不管什么意思。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何将这些更改为 NuSMV 模型中的 CTL SPEC? 的相关文章

  • Laravel 模型:模型属性在哪里?

    我来自 Visual Studio Entity Framework 背景 并尝试在 Laravel Eloquent 中找到等效功能 在 EF 和 Visual Studio 中 我们向应用程序添加一个新模型 并只告诉它我们现有的数据库
  • Magento - 在控制器和块之间传递数据

    非常快速和简单的问题 但我找不到一个合适的答案 将数据从控制器传递到 Magento 中的块的最佳方法是什么 如果它有所不同 我将按如下方式加载布局 this gt loadLayout array default myModule def
  • MVC 模型对象、域对象和 DTO 之间有什么区别

    MVC 模型对象 域对象和 DTO 之间有什么区别 我的理解是 MVC 模型对象 对要由相应视图显示的数据进行建模 它可能不会直接映射到域对象 即可能包含来自一个或多个域对象的数据 客户端 可能包含业务逻辑 例如 验证 计算属性等 没有持久
  • 在Python中动态评估简单的布尔逻辑

    我有一些动态生成的布尔逻辑表达式 例如 A 或 B 和 C 或 D A 或 A 和 B A 空 计算结果为 True 占位符被替换为布尔值 我是不是该 将此信息转换为 Python 表达式 例如True or True or False a
  • django 模型中的星期几表示

    我正在构建这个 作业服务器 模型 我想添加一个字段来保存该作业将在一周中的哪几天运行 最终在用户界面中 我希望用户能够拥有一系列可以选择的复选框 每天一个 在我的模式中表示 一周中的几天 数据的最佳方式是什么 class Job model
  • 从 C# 对象自动生成 javascript 对象模型

    寻找现有的 经过验证的解决方案来快速生成客户端JavaScript 对象模型代表一个现有的 C 对象 我想象有一个 T4 模板或其他一些方法 但我缺乏找到它的术语 我不是在讨论序列化以获取现有 C 对象实例的 JSON 表示形式或任何与反序
  • 反转博客条目和评论的显示顺序,Ruby on Rails

    我是 Rails 新手 所以可以在这里使用一些帮助 我已经按照几个教程创建了一个博客 其中包含评论 甚至还有一些 AJAX 花哨的内容 但我仍然坚持一些我希望很简单的事情 博客和评论的默认显示是首先列出最旧的 我如何反转它以在顶部显示最新条
  • Rails:是否可以向 has_and_belongs_to_many 关联添加额外的属性?

    我的意思是 如果我有两个模型 通过 has and belongs to many 关联连接 我可以在每个关联的连接表中存储其他数据吗 也就是说 额外的数据不会成为任一表中单个记录的一部分 而是它们之间的连接 我的实际模型如下 class
  • .gitlab-ci.yml 中的规则条件是否有 AND 选项?

    我想创建一些嵌套条件 当它是合并或合并请求并且以特定名称启动 功能 时 我需要此管道才能工作 那么 作业的 唯一 选项中是否有 AND 条件 不 那里没有 你必须使用rules https docs gitlab com ee ci yam
  • 如何将 Request->all() 与 Eloquent 模型一起使用

    我有一个 lumen 应用程序 需要在其中存储传入的 JSON 请求 如果我写这样的代码 public function store Request request if request gt isJson data request gt
  • Python 中的“与”/“或”? [复制]

    这个问题在这里已经有答案了 我知道and and orpython中存在表达式 但是有没有and or表达 或者以某种方式将它们组合起来以产生与and or表达 我的代码看起来像这样 if input a if a or or or or
  • 使用 sunspot/solr 搜索多个模型

    我已经能够成功地实现基本的全文搜索 但是当我尝试使用范围 with statements 时 任何涉及多对多关系模型的查询似乎都不适合我 我知道相关行位于数据库中 因为我的 sql 语句确实返回了数据 然而 太阳黑子查询不会返回任何结果 我
  • 如何计算分数?

    这个问题比任何编程语言都更与逻辑相关 如果问题不适合论坛 请告诉我 我将删除它 我必须编写一个逻辑来计算博客奖网站的博客分数 一个博客可能会获得多个奖项类别的提名 并由评审团以 1 到 5 的等级进行同行评审或评级 1 表示他们完全不喜欢博
  • 如何确定一个日期范围是否出现在另一个日期范围内的任何时间?

    我有一个事件表 指定日期范围start date and end date字段 我有另一个在代码中指定的日期范围 它将当前周定义为 week start 和 week end 我想查询本周的所有活动 这些案例似乎是 活动在一周内开始和结束
  • Laravel 中如何返回数组而不是集合?

    在 Laravel 中 可以仅选择一个字段并将其作为集合 数组返回 例如考虑模型Foo链接到表foos其中有字段id a b c 考虑以下示例数据 1 10 15 20 1 12 15 27 1 17 15 27 1 25 16 29 1
  • JQuery .hasClass 用于 if 语句中的多个值

    我有一个简单的 if 语句 if html hasClass m320 do stuff 这按预期工作 但是 我想添加更多的类if statement检查是否存在任何类标签 我需要它 所以它不是全部 而只是至少一个类的存在 但它可以更多 我
  • 来自控制器的 Rails 验证

    有一个联系页面 可以输入姓名 电话 电子邮件和消息 然后发送到管理员的电子邮件 没有理由将消息存储在数据库中 问题 如何 在控制器中使用 Rails 验证 根本不使用模型 或者 在模型中使用验证 但没有任何数据库关系 UPD Model c
  • 如何在 Yii2 中指定大于或小于特定数字或值的验证规则?

    我有一个模型 其验证规则如下 x integer x unique 现在我如何添加如下规则 x 或者类似的东西x gt 100 它应该是 x compare compareValue gt 100 operator gt lt and x
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • 无法使用tensorflow 2.0.0 beta1保存模型

    我已尝试了文档中描述的所有选项 但没有一个允许我将模型保存在tensorflow 2 0 0 beta1中 我还尝试升级到 也不稳定 TF2 RC 但这甚至破坏了我在测试版中工作的代码 所以我很快就回滚到测试版 请参阅下面的最小复制代码 我

随机推荐