【Kind2(基于SMT的自动模型检查器)学习笔记】基础范例

范例一:Y所有时刻的状态值均为X在当前时刻的状态值(pre、->)

代码:

node first( X : real ) returns ( Y : real );
let
  Y = X -> pre Y;
tel

Simulate执行结果:
在这里插入图片描述

范例二:输出前一时刻的状态值,初始状态值为false(pre、->)

代码:

node Delay(in: bool) returns (out: bool) ;
-- 定义一个布尔变量x,默认为false,这个定义只在Time=0的时候定义一次
  var x: bool ;
let
-- 对输出变量out的值赋上x当前的值
  out = x ;
--  Time=0的时候x的值为false,以后的x的值为前一个in的值
  x = false -> pre in ;
tel

Simulate执行结果:
在这里插入图片描述

范例三:S的值为当前和之前所有X的值的总和(pre、or、->)

代码:

node sum (X: int) returns (S: int);
let
   S =  X ->  X + (pre S);
tel

Simulate执行结果:

在这里插入图片描述

范例四:向上计数器, C从0开始,持续增加1,Reset为真,此时C回到0(pre、if、->)

代码:

node UpCounter( Reset: bool ) returns ( C: int );

let
  C = 0 -> if Reset then 0 else (pre C) + 1 ;
tel

Simulate执行结果:
在这里插入图片描述

范例五:如果状态X在某一时刻为真,则从该时刻之后(包括该时刻),状态Y均为真,从该时刻之前,状态Y均为假(pre、or、->)

代码:

node hasHappened(X : bool) returns (Y : bool);
let
  Y = X or (false -> pre Y);
tel

Simulate执行结果:
在这里插入图片描述

范例六:状态X从开始时刻到某一时刻都是真的,则状态Y从开始时刻到这一时刻也是真的,一旦某一时刻遇到为假,不管未来还有多少时刻为真,从这一结点开始,状态Y在任何时刻都为假(pre、and、->)

代码:

node sofar( X : bool ) returns ( Y : bool );
let
 Y = X -> (X and (pre Y));
tel

Simulate执行结果:
在这里插入图片描述

范例七:X为真时Z为真,X不为真时,当Y和前一时刻的Z同时为真时,Z为真,否则Z为假(pre、or、and、->)

代码:

node Since( X, Y : bool ) returns ( Z : bool );
let
  Z =  X or (Y and (false -> pre Z));
tel

Simulate执行结果:
在这里插入图片描述

范例八:Y为真且X为真,或Y为真且前一时刻Z为真时,当前时刻Z为真,否则当前时刻Z为假(pre、or、and、->)

代码:

node SinceIncl( X, Y : bool ) returns ( Z : bool );
let
  Z =  Y and (X or (false -> pre Z));
tel

Simulate执行结果:
在这里插入图片描述

范例九:灯的开关按钮,按On后灯亮,按Off后灯灭(pre、if、not、->)

代码:

node switch (On, Off: bool) returns (S: bool);
let
  S = false -> if (pre S) then not Off else On;
tel

Simulate执行结果:
在这里插入图片描述

范例十:两种对状态X赋相同值的方法,并验证结果是否有效(pre、if、->、–%MAIN、–%PROPERTY)

代码:

-- 一个复杂的X赋值过程
node s (_:bool) returns (X: int);
let
  X = 1 -> if (pre X) < 3 then (pre X) + 1 else 3 ;
tel

-- 一个精简的X赋值过程
node s1 (_:bool) returns (X:  int);
let
  X = 1 -> pre (2 -> 3);
tel


-- 观察结点s和s1的运行结果是否一致,如果一致,则OK的结果为true,否则为false
node obs_s(_:bool) returns (OK: bool);
let
  OK = (s(_) = s1(_));

--%MAIN;
--%PROPERTY OK;
tel

Check验证结果:
在这里插入图片描述

Simulate执行结果:
在这里插入图片描述

  • 对于不需要输入值的结点,我们使用下划线_来表示一个没有意义的输入
  • 进行Check验证时,代码中的–%PROPERTY OK;也可写成–%PROPERTY (s() = s1());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

print_Hyon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值