采用 PAT工具及CSP语言,对一个问题进行自动机 建模

pat是新加坡国立开发的工具,需要的去官网下http://www.comp.nus.edu.sg/~pat/

,学了一天,是个不错的自动机验证工具,感觉还不错啊。

验证一个数是否为斐波那契数且为质数

方法

先验证是否为斐波那契数,然后再判断质数

代码

/*验证是否为  斐波那契数且是质数*/

#define goal (b==13 && f==1); //是斐波那契数且是质数

#define no1goal(b==21 && f==1);// 是斐波那契数不是质素

#define no2goal(b==22 && f==1);// 不是斐波那契数

var a = 0;

var b = 1;

var t = 0;

var s = 2;

var f = 0;

FBNQ() =

[ b>0 ]

fbnq1{t=b;b=a+b;a=t;}->FBNQ()

[][b>1]

fbnq2{s = 2;}->ZHISHU();

 ZHISHU() =

if( s*s <= b && b%s==0 )

{

 zhishu1{f=0;}->FBNQ()

}

else if(s*s <= b)

{

  zhishu2{s=s+1;}->ZHISHU()

}

else

{

  zhishu3{f=1;}->ZHISHU()

};

#assert FBNQ() reaches goal;

#assert FBNQ() reaches no1goal;

#assert FBNQ() reaches no2goal;

验证过程和结果

1、是斐波那契数且是质数

#define goal (b==13 && f==1);

2、   是斐波那契数不是质素

#define no1goal(b==21 && f==1);

3、   不是斐波那契数

#define no2goal(b==22 && f==1);//

总结

验证成功。

PAT工具及CSP语言,对一个问题进行自动机建模,的确是个强大的工具。

还有一个农夫过河的问题,ppt上写的,也很不错:

状态是:

1 农夫过河
– 农夫在河边,狼和羊、羊
和菜不能同时在河边
– 农夫到对岸
• 2农夫带狼过河
– 农夫、狼在河边, 羊和菜
不能同时在河边
– 农夫、狼到对岸
• 3农夫带羊过河
– 农夫、羊在河边
– 农夫、羊到对岸
• 4农夫带菜过河
– 农夫、菜在河边,狼和羊
不能同时在河边
– 农夫、菜到对岸
• 1 农夫回来
– 农夫在对岸,狼和羊、羊和
菜不能同时在对岸
– 农夫回到河边
• 2农夫带狼回来
– 农夫、狼在对岸,羊和菜不
能同时在对岸
– 农夫、狼回到河边
• 3农夫带羊回来
– 农夫、羊在对岸
– 农夫、羊回到河边
• 4农夫带菜回来
– 农夫、菜在对岸,狼和羊不
能同时在对岸
– 农夫、菜回到河边

• /*0表示在河边, 1表示在对岸*/
• var farmer=0;
• var wolf=0;
• var goat=0;
• var carbage=0;
• Cross() =[ farmer==0 && ((! (wolf==0 && goat==0) ) && (! (goat==0 &&
carbage==0))) ] farmer_cross{farmer=1;}->Return()
• [] [ farmer==0 && wolf==0 && (! (goat==0 && carbage ==0)) ]
farmer_wolf_cross{farmer=1;wolf=1;}->Return()
• [] [ farmer==0 && goat==0] farmer_goat_cross{farmer=1;goat=1;}->Return()
• [] [ farmer==0 && carbage==0 && (! (wolf==0 && goat==0)) ]
farmer_carbage_cross{farmer=1;carbage=1;}->Return();
• Return() =[ farmer==1 && ((! (wolf==1 && goat==1)) && (! (goat==1 &&
carbage==1))) ] farmer_return{farmer=0;}->Cross()
• [] [ farmer==1 && wolf==1 && (! (goat==1 && carbage ==1)) ]
farmer_wolf_return{farmer=0;wolf=0;}->Cross()
• [] [ farmer==1 && goat==1] farmer_goat_return{farmer=0;goat=0;}->Cross()
• [] [ farmer==1 && carbage==1 && (! (wolf==1 && g

  

时间: 2024-08-14 20:44:39

采用 PAT工具及CSP语言,对一个问题进行自动机 建模的相关文章

怎样学好C语言,一个成功人士的心得!

今天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人:克劳德.香农和约翰.冯.诺依曼,是他们发现了全部的数字化信息,不论是一段程序,一封email,一部电影都是用一连串的1和0进行编码的:是他们发现了我们能够利用一个预先编写好的程序控制机器,并使之完毕我们期望它完毕的动作.建议大家在心里默念三遍他们的名字,以示敬仰.当然,假设让你们带着如今的知识回到他们的那个时代,那么就没有什么图灵奖了.C语言程序设计是我们的专业基础课,可是C语言本身却是一个非常强大的工具,它是到

Swift语言编写一个简单的条形码扫描APP

swift语言编写一个简单的条形码扫描APP 原文地址:appcoda 在处理职员在杂货店的收银台排了很长的队伍,在机场帮助检查背包和旅客,或者在主要的食品供应商,协助处理乏味的存货清单过程,条形码扫描是很简单的处理工具.实际上,他们已经用了这个办法来解决消费者在智能购物,图书分类,等其他目的.因此,让我们来制作一个iPhone版本的条形码扫描工具吧! 对我们来说幸运的是,苹果已经制作了条形码扫描的程序,实现它是一件很简单的事情.我们将要研究进入AV Foundation框架的世界,组建APP,

大胆采用开源工具(转)

下面为书籍第11章<开源世界>的读书笔记: 一.大胆采用开源工具 选择开源框架和工具需遵循的原则:1. 普适性原则:选用开源项目时需要考虑项目成员的整体技术水平,不能有太大的跨度或跳跃性,要确保大部分成员都比较熟悉.2. 唯一性原则:相同的工具只能选择一个或一种,这样避免重复.3. “大树纳凉”原则:最好选用比较有名的开源项目,这样出现bug时能够较快地解决.4. 精而专原则:选用开源项目时最好选用“对口”的项目,这样的项目相对做得更加专业些.5. 高热度原则:项目的热度越高,更新就会越频繁,

如何选择编程入门语言?一个让很多人纠结的问题

用心分享,共同成长 没有什么比你每天进步一点点更实在了 本文已经收录至我的github,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 点关注,不迷路!!! 为什么会出这样一篇文章? ?本来想写点最近学习的东西,但是最近好多粉丝再问我一个问题. image-20200105164345384 于是我决定把我这个过来人的一些建议给到你们,希望大家少一些不必要的迷茫,多花点时间去学习该学习的东西,去做一些重要的事情. 刚开始学习

用c语言统计一个字符串中有多少个数字字符

用c语言统计一个字符串中有多少个数字字符. #include<stdio.h>int main(){    char ch;     int count=0;    while((ch=getchar())!='\n')     {        if(ch>'0'&&ch<'9')              count++;     }     printf("%d\n",count);     return 0; }

使用L脚本语言开发一个XML访问库

XML目前是应用最广泛的数据交换格式 那么我们就来使用L脚本语言开发一个XML访问库 下面这个脚本文件是一个简单的XML文件访问库,它能够生成简单的XML文件 #scplib 定义:类,XML文件 开始:类,XML文件 定义:字符串,XML文件头 定义:字符串,文件体 定义:字符串,开始标签,"<" 定义:字符串,行结束标签,"/>" 定义:字符串,结束标签,">" 定义:字符串,段落结束标签 定义:函数,插入文件头,文件头 开

用GO语言实现一个简单的搜索引擎

用GO语言实现一个简单的搜索引擎 项目地址是:https://github.com/wyh267/FalconEngine 对搜索引擎感兴趣的可以去看看这本书,比较浅并且也比较完整的介绍了一个搜索引擎的全部机能. 我的这个搜索引擎原始数据是MySql数据库的,大家可以根据需要进行二次开发,用来支持其他数据库或者本地文件,Detail文件是存储在Redis数据库中,同样这部分也可以根据自己的需要二次开发,使用本地文件或者其他数据库,倒排索引和正排索引本地存储的时候使用的json格式,比较耗磁盘,第

采用fpm工具制作rpm包

本次rpm包的制作,采用fpm工具完成,FPM非常易用,此命令可以把rpm包的安装.卸载做得更加优雅,在安装前可以做一些准备工作,安装后可以做一些收尾工作,在卸载前也可以做一些准备,比如检测一下相应的服务是否停止了,在卸载软件再做一些扫尾的工作,只要把这些定义成一个个脚本,fpm中指定相应的选项即可轻松实现.这里涉及的参数是:--pre-install FILE:表示安装之前所要运行的脚本--post-install FILE:表示安装之后所要运行的脚本--pre-uninstall FILE:

用R语言实现一个求导的简单例子

在学习导数的时候,老师都会这样解释,假设y=f(x),对点(x0,y0)的求导过程如下:设dx是一个很小的数=> y0+dy=f(x0+dx)=> dy=f(x0+dx)-y0则在这一点的导数a=dy/dx这样假设的前提是dx很小,所以x0至(x0+dx)很短,可以近似为一条直线,则dy/dx可以看成是点(x0,y0)和点(x0+dx,y0+dy)连成直线的斜率因此关于某个点的导数,其意义也可以解释成在该点的变化率 下面用R语言实现一个简单例子:假设:y=1/x,求点(1,1)的导数 x<