当前位置: 首页 > news >正文

万江仿做网站/西安seo服务商

万江仿做网站,西安seo服务商,西地那非片说明书,茶叶网站建设一般的风格第二个例子DieHard 这是一个倒水的例子,初始一个3升容量的桶,一个5升容量的桶,水不限,如何倒出一个容量刚好是4升的水。在一部老电影DieHard中主角就面临这个问题,这里就将module名命名为DieHard。 如果要倒出一个4升…

第二个例子DieHard

这是一个倒水的例子,初始一个3升容量的桶,一个5升容量的桶,水不限,如何倒出一个容量刚好是4升的水。在一部老电影DieHard中主角就面临这个问题,这里就将module名命名为DieHard。

如果要倒出一个4升容量的水,那这4升水最后一定在5升的桶里。具体实现方式不止一种,这里举一个例子说明倒水的过程:假设5升桶为big,3升桶为small

1、装满small桶,将small水倒入big桶中:此时small为0,big为3

2、装满small桶,将small水倒入big桶中:此时small为1,big为5

3、将big桶倒掉,big=0,将small桶中水倒入big桶,此时,small=0,big=1

4、装满small桶,将small桶中水倒入big桶,此时,small=0,big=4。 big桶中就有了4升水。

TLA+实现过程

假设small表示3升桶,big表示5升桶,初始化桶中无水,即都等于0。

VARIABLES big , small
Init == big = 0 /\ small = 0
TypeOK == small \in 0..3 /\ big \in 0..5  \* 这是一个检查项,用TypeOK检查small与big的值是否正确

将上述倒水的过程进行拆解,可能的操作为:

1、装满small桶,big桶不变

FillSmallJug == small' = 3 /\ big' = big  
\* 这里用 small',big'表示变更后的状态,=左边不能使用small,big这样的原变量

2、装满big桶,small桶不变

FillBigJug ==  big' = 5  /\ small' = small  \* 逻辑同上

3、将small桶中水倒掉

EmptySmallJug == small' = 0 /\ big' = big  \* 逻辑同上

4、将big桶中水倒掉

EmptyBigJug == big' = 0 /\ small' = small  \* 逻辑同上

5、将small桶中水倒入big桶中

Min(m,n) == IF m < n THEN m ELSE n  \* 定义一个取小函数SmallToBig ==  big' = Min(big + small, 5) /\ small' = small - (big' - big)
\* small桶倒入big桶时,有可能溢出,因此需要判断一下
\* 对于big桶,if small+big < 5,THEN big' = big + small ELSE 5
\* 对于small桶,剩余水为减去倒入到big桶的量(big'-big),即 small' = small - (big'-big)

6、将big桶中水倒入small桶中

BigToSmall == small' = Min(big + small, 3) /\ big'   = big - (small' - small) \* 逻辑同上

上述6种操作覆盖了所有的可行操作,其他的如倒水的时候即没倒满也没倒完这样的情况是无法达到目标的,因此不需要考虑。因此基于初始化状态,可行的动作就是上述6中操作中的一种。

上述代码汇总如下:

------------------------------ MODULE DieHard ------------------------------- 
EXTENDS Naturals    \* 这里使用Integers Module替代 Naturals Module也是可以的VARIABLES big, small  Init == big = 0 /\ small = 0TypeOK == small \in 0..3 /\ big \in 0..5  \* 这是一个检查项,用TypeOK检查small与big的值是否正确
\* 需要将TypeOK添加到model的Invariants中来实现TLC的自动检查
\* 删除TypeOK不会对此Module有影响FillSmallJug == small' = 3 /\ big' = big  
\* 这里用 small',big'表示变更后的状态,=左边不能使用small,big这样的原变量FillBigJug ==  big' = 5  /\ small' = small  \* 逻辑同上EmptySmallJug == small' = 0 /\ big' = big  \* 逻辑同上EmptyBigJug == big' = 0 /\ small' = small  \* 逻辑同上Min(m,n) == IF m < n THEN m ELSE n  \* 定义一个取小函数SmallToBig ==  big' = Min(big + small, 5) /\ small' = small - (big' - big)
\* small桶倒入big桶时,有可能溢出,因此需要判断一下
\* 对于big桶,if small+big < 5,THEN big' = big + small ELSE 5
\* 对于small桶,剩余水为减去倒入到big桶的量(big'-big),即 small' = small - (big'-big)BigToSmall == small' = Min(big + small, 3) /\ big'   = big - (small' - small) \* 逻辑同上Next ==  \/ FillSmallJug \/ FillBigJug    \/ EmptySmallJug \/ EmptyBigJug    \/ SmallToBig    \/ BigToSmall    ==================================================================

检查与运行

新建一个model,在Init处输入Init,在Next处输入Next

在Invariants处增加TypeOK 和 big # 4。 如果上述TLA+代码中删除了TypeOK,这里就不用添加TypeOK的检查。

添加big # 4是为了将状态转换过程 通过 Error-trace打印出来:基于初始状态Init,经过多次Next的状态变化,当出现big == 4 时将会停机,并将从Init状态出发到big == 4时的过程打印出来。
在这里插入图片描述
点击运行,可以看到Error-trace的状态变化过程。
在这里插入图片描述
经过多次运行,会出现Error-trace跟上面图中不一样的情况,那是另外一种实现方法。

http://www.jmfq.cn/news/5197357.html

相关文章:

  • 广州开发小程序/seo的公司排名
  • 外国网站邀请做编辑/如何给网站做推广
  • 做网站怎么让字居右/百度搜索一下
  • wordpress主题离线编辑/seo是什么意思 为什么要做seo
  • 广西上林县住房城乡建设网站/重庆疫情最新情况
  • 网站描文本怎么做/网站seo关键词排名推广
  • 电商网站如何做优化/免费建网站软件下载
  • 做一个网站的价钱/深圳seo网络推广
  • 浙江建设报名网站/一键制作网站
  • 专业手机网站建设哪家好/推推蛙seo顾问
  • 南京做企业网站公司哪家好/免费网页制作成品
  • 重庆万州网站建设费用/自助建站系统破解版
  • 怎样做简易局域网站点/百度指数手机版
  • 做网站客服的工作流程/bt磁力链好用的引擎
  • 做外贸建网站多少钱/上海空气中检测出病毒
  • 公司官网网站建设想法/网站生成
  • 网易企业邮箱价格/山东网站seo
  • 设计服务网络建设方案/优化网站排名
  • 西安企业网站建设/网站统计分析工具的主要功能
  • 怎么做原创电影视频网站/百度seo排名优化是什么
  • 北京网站开发公司电话/推广产品引流的最佳方法
  • 提供网站建设商家/推广优化厂商联系方式
  • 厦门市网站建设公司/seo优化推广流程
  • 岗顶做网站公司/南京百度关键字优化价格
  • 莱芜市网站建设设计/google chrome浏览器
  • 做婚礼网站的公司简介/销售网络平台
  • html表格菜鸟教程/seo管理软件
  • 宜昌网站seo收费/html友情链接代码
  • 长沙做个网站多少钱/网络广告策划书案例
  • 学网站制作多少钱/学计算机哪个培训机构好