我如何将这些更改为 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? 的相关文章

  • 如何将 Request->all() 与 Eloquent 模型一起使用

    我有一个 lumen 应用程序 需要在其中存储传入的 JSON 请求 如果我写这样的代码 public function store Request request if request gt isJson data request gt
  • 如何让两个模型互相引用 Django

    我有以下代码 class Game models Model title models CharField max length 50 summery models CharField max length 500 key models I
  • 使用ActiveRecord,有没有办法在after_update期间获取记录的旧值

    使用一个简单的示例进行设置 我有 1 张桌子 Totals 保存了总和amount第二个表中每条记录的列 Things When a thing amount更新后 我想简单地将旧值和新值之间的差异添加到total sum 现在我正在减去s
  • 为树视图创建 Qt 模型

    我正在用 Qt 使用 C 编写一个应用程序 我需要在树视图中表示一个对象结构 实现此目的的方法之一是为此创建一个模型 但在阅读有关该主题的 Qt 文档后我仍然很困惑 我的 结构 非常简单 有一个Project持有的物体Task中的对象std
  • 非成员规则在 Prolog 中无法按预期工作

    我正在尝试在 Prolog 中创建一个迷宫程序 其目的是找到一条从迷宫起点到迷宫中心点 m 的路线 迷宫由使用四种颜色之一连接的正方形组成 蓝色 绿色 紫色或橙色 从起点到中心的路线遵循四种颜色的重复图案 我创建了以下代码 link2 A
  • 可能的数独谜题的数量[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Wiki http en wikipedia org wiki Mathematics of Sudoku http en wikiped
  • 过滤 Django 管理选择框的模型结果

    我今天刚开始使用 Django 到目前为止发现做简单的事情相当困难 我现在正在努力解决的是过滤状态类型列表 StatusTypes 模型是 class StatusTypes models Model status models CharF
  • 使用枚举名称而不是值对 Pydantic 字段进行编码

    我有一个枚举类 class Group enum Enum user 0 manager 1 admin 2 我有一个 pydantic 模型 class User BaseModel id int username str group G
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • Magento:如何覆盖本地模块中的模型

    我试图在本地文件夹中覆盖本地文件夹中的模块 但我不知道是否可能 这就是我所做的 我创建了 local Mycompany Modulename Model Model php 我想覆盖 local Othercompany Modulena
  • JQuery .hasClass 用于 if 语句中的多个值

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

    有一个联系页面 可以输入姓名 电话 电子邮件和消息 然后发送到管理员的电子邮件 没有理由将消息存储在数据库中 问题 如何 在控制器中使用 Rails 验证 根本不使用模型 或者 在模型中使用验证 但没有任何数据库关系 UPD Model c
  • EditorTemplate 的嵌套模型的 ASP.NET MVC3 条件验证

    假设你有一个 viewModel public class CreatePersonViewModel Required public bool HasDeliveryAddress get set Should only be valid
  • 总结二维数组

    鉴于我当前的程序 我希望它在用户输入所有值后计算每列和每行的总和 我当前的代码似乎只是将数组的值加倍 这不是我想要做的 例如 如果用户输入具有以下值 1 2 3 2 3 4 3 4 5 的 3x3 矩阵 则看起来就像我在下面的程序中对其进行
  • 具有模型目录和AUTH_USER_MODEL

    I have myApp models profiles py代替myApp models py 对相关模型进行分组 你怎么设置AUTH USER MODEL在这种情况下 因为 auth 只接受 foo bar 模式 app label m
  • 变量的多个值介于 0 和数字序言之间

    所以我一直在尝试自学序言 我认为我进展顺利 然而 我有点坚持我正在尝试的这一种方法 toN N A A 等于 0 到 N 1 之间的整数值 按升序生成 所以 toN 5 A 将是 A 0 A 1 A 2 A 3 A 4 我对序言还很陌生 所
  • 如何将 django ModelForm 字段显示为不可编辑

    接受我的初步教训django ModelForm 我想让用户能够编辑博客中的条目 BlogEntry has a date postedTime title and content 我想向用户展示一个编辑表单 其中显示所有这些字段 但仅包含
  • Prism 应用程序中的数据模型位于何处?

    我无法将数据模型放置在 Prism 应用程序中的何处 大多数 如果不是全部 数据将来自网络服务 并且每个模块的网络服务都是唯一的 不幸的是 有些对象需要共享 例如人员 用户对象 我真的很困惑是否将这些服务直接添加到模块中 以便每个服务真正独
  • 如何从视图中使用模型函数? - 拉拉维尔 5.4

    我在模型类中创建了一个函数 它是 public function scopetest query return query gt pluck name 我的控制器代码是 public function index books Book al
  • MVC 模式中的验证层

    验证模型将使用的数据的最佳位置在哪里 例如 考虑登记表 我们有一些来自注册表的数据 那么验证这些数据的最佳位置在哪里 我们应该通过 if 语句或特殊的验证器类来检查每个数据 这意味着大量的编码 所以我想了解在哪里可以做到这一点 在控制器中

随机推荐