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

定义第一个event状态类型及参数为该状态类型的函数

问题描述:创建一个event状态类型,这个状态类型的值只能是Bot或Top,并编写一个函数判断event的状态是否为Top

代码:

-- 通过type生成一个状态类型event,这个event的值只能是Bot或Top
type event = enum {Bot, Top} ;
-- 创建一个函数叫Pres,函数的格式和node结点的格式相同
function Pres(e: event) returns (b: bool) ;
let
-- 比较e和Top是否相等,并将比较结果赋值给b
  b = (e = Top) ;
tel

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

创建结点执行上述event相关的函数

问题描述:如果event的值为Top,则x的值为in的值, 如果event的值为Bot,则x当前时刻的值为false,以后时刻的值均为上一个时刻x的值,out输出每个时刻x的初始值

代码:

-- 通过type生成一个状态类型event,这个event的值只能是Bot或Top
type event = enum {Bot, Top} ;
-- 创建一个函数叫Pres,函数的格式和node结点的格式相同
function Pres(e: event) returns (b: bool) ;
let
-- 比较e和Top是否相等,并将比较结果赋值给b
  b = (e = Top) ;
tel

node Clocked(in: bool; clock: event) returns (out: bool) ;
  var x: bool ;
let
  out = x ;

  x = if Pres(clock) then in else (false -> pre x) ;
tel

Simulate执行结果:

在这里插入图片描述

创建一个布尔event,并在节点中进行调用

问题描述:创建一个结点Triggered,输入的状态中,如果in的status的值为Top,那么输出的out的值为输入的in的值,x的值为前一时刻的x的值加一,否则,输出的out的值的status为Bot,value的值为bool_choose()的返回值false,x的值为前一时刻的x的值

-- node imported表示辅助结点
-- 作用是在计算的每一步模拟两个布尔值之间的非确定性选择。
-- 默认情况下,调用该结点返回的布尔值为false
node imported bool_choose() returns (b: bool) ;

type event = enum {Bot, Top} ;
-- 创建一个函数叫Pres,函数的格式和node结点的格式相同
function Pres(e: event) returns (b: bool) ;
let
-- 比较e和Top是否相等,并将比较结果赋值给b
  b = (e = Top) ;
tel

-- 创建一个布尔event类型
-- 这个类型定义的状态的状态值有一个event类型的status和一个布尔类型的value
type bool_event = {status: event; value: bool } ;
-- 如果输入的状态e的status值等于Top,那么b的值为true,否则为false
function bool_Pres(e: bool_event) returns (b: bool) ;
let
  b = (e.status = Top) ;
tel

-- 创建一个结点Triggered,输入的状态中
-- 如果in的status的值为Top,那么输出的out的值为输入的in的值,x的值为前一时刻的x的值加一
-- 否则,输出的out的值的status为Bot,value的值为bool_choose()的返回值false,x的值为前一时刻的x的值
node Triggered(in: bool_event) returns (out: bool_event) ;
  var x: int ;
let
  out = if bool_Pres(in) then in 
        else bool_event {status = Bot; value = bool_choose() } ;

  x = 0 -> if bool_Pres(in) then pre x + 1 else pre x ;
tel




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

在Simulate执行结果中我们可以看到,在Time为1、2、5的时刻,我们对in.status赋值为Top,此时x的值会增加一;我们在Time为1、2、4的时刻,对in.value赋值为ture,但因为只有在 1、2时刻,in.status的值为Top,所以这两个时刻,out.value为true,其余时刻均为false

对存在event的结点进行验证

问题描述:输入两个event类型的状态req1、req2,根据输入的状态和多重if语句,对gra1和gra2进行赋值

代码:

-- node imported表示辅助结点
-- 作用是在计算的每一步模拟两个布尔值之间的非确定性选择。
-- 默认情况下,调用该结点返回的布尔值为false
node imported bool_choose() returns (b: bool) ;

type event = enum {Bot, Top} ;
-- 创建一个函数叫Pres,函数的格式和node结点的格式相同
function Pres(e: event) returns (b: bool) ;
let
-- 比较e和Top是否相等,并将比较结果赋值给b
  b = (e = Top) ;
tel

function Abs(e: event) returns (b: bool) ;
let
-- 比较e和Bot是否相等,并将比较结果赋值给b
  b = (e = Bot) ;
tel

-- 通过多重if语句对gra1和gra2进行赋值
node Arbiter(req1, req2: event) returns (gra1, gra2: event) ;
  var c: bool; 
let
  c = bool_choose();
  gra1 = if Abs(req1) then Bot
         else if Abs(req2) then Top 
         else if c then Top
         else Bot ;
  gra2 = if Abs(req2) then Bot
         else if Abs(req1) then Top 
         else if c then Bot 
         else Top ;

-- 期望提示错误的验证:

-- 当Pres(req1)和Pres(req2)都有效时,想要验证Pres(gra1)是否有效
-- 但因为Pres(req1)和Pres(req2)有效并不能保证Pres(gra1)或者Pres(gra1)也是有效的
-- 所以下面两个公式的验证结果均为非法的公式
--%PROPERTY "P1.1" Pres(req1) and Pres(req2) => Pres(gra1) ; 
--%PROPERTY "P1.2" Pres(req1) and Pres(req2) => Pres(gra2) ; 

-- 期望提示正确的验证:

-- 当Pres(req1)和Pres(req2)都有效时, Pres(gra1)或者Pres(gra2)一定是有效的
--%PROPERTY "P2" Pres(req1) and Pres(req2) => Pres(gra1) xor Pres(gra2) ; 
-- 当Pres(req1)和Abs(req2)都有效时,Pres(gra1)也是有效的
--%PROPERTY "P3.1" Pres(req1) and Abs(req2) => Pres(gra1) ; 
-- 当Pres(req2)和Abs(req1)都有效时,Pres(gra2)也是有效的
--%PROPERTY "P3.2" Pres(req2) and Abs(req1) => Pres(gra2) ; 

-- 当Pres(gra1)有效时,Pres(req1)也是有效的
--%PROPERTY "P4.1" Pres(gra1) => Pres(req1) ; 
-- 当Pres(gra2)有效时,Pres(req2)也是有效的
--%PROPERTY "P4.2" Pres(gra2) => Pres(req2) ; 

tel

Check运行结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

print_Hyon

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

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

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

打赏作者

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

抵扣说明:

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

余额充值