【Kind2(基于SMT的自动模型检查器)入门教程】基础范例

255 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

范例一: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());