- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下 promela 代码:
chan level = [0] of {int};
proctype Sensor (chan levelChan) {
int x;
do
:: true ->
levelChan ? x;
if
:: (x < 2) -> printf("low %d", x);
:: (x > 8) -> printf("high %d", x);
:: else -> printf("normal %d", x);
fi
od
}
init {
run Sensor(level);
int lvl = 5;
level ! lvl;
lvl = 0;
do
:: true ->
level ! lvl;
lvl++;
(lvl > 9) -> break;
od
}
我希望将级别 (0-9) 信息发送到 channel ,并根据此级别使传感器输出低|正常|高。它很简单。但是为什么 SPIN 总是说超时呢?
0: proc - (:root:) creates proc 0 (:init:)
Starting Sensor with pid 1
1: proc 0 (:init:) creates proc 1 (Sensor)
1: proc 0 (:init:) 1.pml:18 (state 1) [(run Sensor(level))]
2: proc 1 (Sensor) 1.pml:6 (state 11) [(1)]
3: proc 0 (:init:) 1.pml:20 (state 2) [lvl = 5]
4: proc 0 (:init:) 1.pml:20 (state 3) [level!lvl]
4: proc 1 (Sensor) 1.pml:8 (state 2) [levelChan?x]
5: proc 1 (Sensor) 1.pml:9 (state 9) [else]
6: proc 0 (:init:) 1.pml:21 (state 4) [lvl = 0]
normal 5 8: proc 1 (Sensor) 1.pml:12 (state 8) [printf('normal %d',x)]
9: proc 0 (:init:) 1.pml:22 (state 10) [(1)]
12: proc 1 (Sensor) 1.pml:6 (state 11) [(1)]
13: proc 0 (:init:) 1.pml:24 (state 6) [level!lvl]
13: proc 1 (Sensor) 1.pml:8 (state 2) [levelChan?x]
14: proc 1 (Sensor) 1.pml:9 (state 9) [((x<2))]
low 0 15: proc 1 (Sensor) 1.pml:10 (state 4) [printf('low %d',x)]
17: proc 0 (:init:) 1.pml:25 (state 7) [lvl = (lvl+1)]
19: proc 1 (Sensor) 1.pml:6 (state 11) [(1)]
timeout
#processes: 2
19: proc 1 (Sensor) 1.pml:8 (state 2)
19: proc 0 (:init:) 1.pml:26 (state 8)
2 processes created
似乎只执行 do 循环的 1 次迭代,为什么?
最佳答案
init
进程的 do 循环中的语句按顺序运行。
do
:: true ->
level ! lvl;
lvl++;
(lvl > 9) -> break;
od
第一次运行 do 循环时,它将通过 level
channel 发送 lvl
,增加 lvl
(现在是1) 然后测试(lvl > 9)
。这是错误的,因此会阻塞并导致超时。
要在 do 循环中有多个选项,您需要 ::
来定义每个选项的开始:
do
:: true ->
level ! lvl;
lvl++;
:: (lvl > 9) -> break;
od
然而,这仍然不会按预期执行。当 lvl
大于 9 时,do 循环的两个选项都有效,可以选择其中一个,因此当 lvl > 9
时循环不一定会中断,它可以选择继续通过 level
channel 发送 lvl
并增加 lvl
。
第一个 do 选项和第二个 do 选项都需要有条件:
do
:: (lvl <= 9) ->
level ! lvl;
lvl++;
:: (lvl > 9) -> break;
od
对于此示例,使用 for 循环语法可能会更好:
init {
run Sensor(level);
int lvl = 5;
level ! lvl;
for (lvl : 0..9){
level ! lvl;
}
}
请注意,此示例仍会出现由 Sensor
的 do 循环引起的超时错误,当 init
进程完成时 Sensor
将仍然尝试从 level
channel 读取并超时。
关于verification - 什么导致 Promela/SPIN 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14671018/
我正在构建一个带有登录和注册系统的网站,用户的信息将存储在数据库中。我在创建帐户后实现标准电子邮件验证步骤。该过程如下:创建一个帐户,但将“已验证”标志设置为 False。然后,系统会向用户发送一封电
给定一个系统及其完整的状态空间,我可以说该状态空间是该系统行为的正式规范吗? 最佳答案 除非您正式定义了进出每个状态的所有可能转换,并且您的状态空间包含系统可能处于的所有可能状态。 在计算机系统的正式
有哪些代码示例可以证明KeY的优势? 细节 有了这么多的正式方法工具,我想知道KeY在哪些方面比其竞争对手更好,以及如何?一些可读的代码示例对于比较和理解非常有帮助。 更新 搜索the KeY web
我一直在写类似于 Stream 的东西。我能够证明每个仿函数定律,但我无法想出一种方法来证明它是完整的: module Stream import Classes.Verified %default
传统上,大多数使用计算逻辑的工作要么是命题式的(在这种情况下,您使用SAT( bool(boolean) 可满足性)求解器),要么是一阶的(在这种情况下,您使用一阶定理证明器)。 近年来,在SMT(可
我目前正在注册 MapR Academy 的免费在线学习计划 ADM200。我正在使用 2015 年 11 月 25 日修订的“设置虚拟集群”说明。我正在使用 Windows 8.1 计算机,并尝试在
在下面的程序中,循环的最后一个不变量验证失败。但是如果我把它作为断言放在 while 循环之前,条件就会验证。如果我添加字段 ia 没有改变,它也会验证。为什么需要这个?读取权限不应该暗示这一点吗?我
程序可以从 START 分支到 LEFT 或 RIGHT 分支。如何检查 LEFT 分支的执行路径和 RIGHT 分支的另一个执行路径? ------------------------------
我正在尝试使用 Dafny 证明以下程序的正确性/不正确性。 datatype List = Nil | Cons(T, List) function tail(l:List):List {
我对交易收据验证有一些疑问: 为什么需要外部服务器?为什么我不能直接联系 http://buy.itunes.apple.com直接从 iPhone 上? 如果此外部服务器出现故障或收据无效怎么办?如
我有一些类似于以下的伪代码: for (lets say 10 iterations) begin // Do some configuration changes fork
我已在设备设置中从商店注销。我仅在我的应用程序中输入了用户凭据。我已经设置了一个全新的(实际上大约 4 次)测试用户。 为什么这条消息不断弹出? 它是否连接到 iOS 5、自动应用程序同步或 iClo
我想向用户展示他们刚刚在点击“提交”进行验证后弹出的模式中填写的表单。我将其视为表格的副本,但每个字段均被禁用或变灰,以便他们可以查看并确认一切正确。要在此阶段对表单进行更改,需要从模式中取消并返回到
当我模拟Endian Swapper时,我得到了不同的时钟周期。使用 QuestaSim 在 VHDL 和 Verilog 模式下的 Cocotb 示例。 provided example code
我正在计划使用现成的 SMT 求解器对 C 代码的符号执行进行一些实验,并且想知道使用哪个求解器;看着例如SMT 竞赛参赛者只选择开源系统,将范围缩小到 Beaver、Boolector、CVC3、O
我在达夫尼(Dafny)得到警告,说我的量词有 No terms found to trigger on. 我要为代码执行的操作是找到平方值小于或等于给定自然数'n'的最大数字。这是到目前为止我想出的
我已在设备设置中退出商店。我只在我的应用程序中输入了用户凭据。我设置了一个全新的(实际上大约 4 次)测试用户。 为什么这条消息不断弹出? 它是否连接到 iOS 5、自动应用同步或 iCloud? 最
将未经验证的用户放入 users_table 是一个不错的选择,还是我应该创建一个 temp_users_table 来添加未经验证的用户? 第一个选项是在 users_table 上创建包含一列的行
我已经尝试了几天来解决这个问题,使用SDK附带的Dungeons演示代码。我已经尝试谷歌寻找答案,但找不到答案。 在地下城演示中,我从开发控制台传递了我的公钥。 签署apk并上传到控制台而不发布。 测
我必须在 fabric 上安装一个 bna 文件。我正在关注链接 https://hyperledger.github.io/composer/tutorials/deploy-to-fabric-s
我是一名优秀的程序员,十分优秀!