简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题。
数独是一个很经典的游戏:
玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-n,不重复。
当然数独的阶有很多,9×9是最常见的,我们就以它做例子。在用Prolog解决之前先想想如果我们用C#或Java来做或怎么做?无非就是数据结构加算法,我们先得用一个数据结构表示数独,然后我们要在这个数据结构上“施加”算法进行求解。采用Prolog的第一步是相同的,我们得找一个数据结构表示数独,毫无疑问在Prolog中我们只能选择列表或元组,这里列表是更好的选择,因为列表可以进行[Head|Tail]解析,后面你就知道为什么了。我们像下面这样表示一个数独:
“_”代表未知的数字,需要玩家填空的地方。
接下来的步骤跟命令式语言就截然不同了,我们不是描述算法,而是要描述数独这个游戏的规则:
Ok,这就是整个游戏的规则。你可能觉得第一条规则没什么用,实际上第一条规则定义了“解”的形式,就像在C#中我们确定了方法的签名一样:
事实上这个规则已经可以工作了:
当然这只是第一步,这个规则对于输入的数独形式没有任何限制,事实上可以是任意的列表,Prolog都返回yes:
我们需要规定下数独的形式:
我们接着看第二条规则:“填充完空格后,每一个空格内的数字均在1~9之内” 。上一篇文章中我们介绍了Prolog中有一个内置谓词叫,这时候就可以派上用场了:
好了现在我们只能输入9×9并且每个每个位置上只能是1~9之间的数的列表了。
好了,现在到整个游戏的关键规则,事实上2,3,4这三个规则才决定了数独的难度,1,2只不过是基础,我们来统一考虑这三个问题。这里其实比想象的简单多了。我们首先要做的就是需要定义出来行、列、宫格:
上一篇文章中我还提到一个谓词叫fd_all_different:检查列表中是否有重复元素,接下来我们只要证明每一列,每一行,每一个宫格列表内没有重复元素就可以了:
其实到此这个解数独的程序已经结束了,不过最后这几行代码太土了,我们可以采用用递归“优化”下,像下面这样:
不管你信不信,我们已经搞定了,最终完整的代码如下:
反正我信了,我们来试试吧,就以上面我从百度上找到的那个图为例:
美化后的结果是这样的:
Ok,有了数独问题作为铺垫,下面看八皇后问题应该就应该没那么难了,请保持用Prolog思考问题的方式,解决后你会发现Prolog真是这方面的“专家”,Let's Go!
八皇后问题也是一个非常经典的问题:
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
老套路我们先描述游戏规则。
在了解规则之后我们梳理一下这个问题,对照上面这个图:
我们给棋盘上每一个位置设定一个坐标(x,y),八个皇后的坐标分别为(x1,y1),(x2,y2)……我们以回溯的角度看问题,假设如图已经得到了最后解,那么这8个坐标满足:x1,x2……各不相同,y1,y2……个不相同,找出(x1,y1),(x2,y2)……中属于对角线1上的和对角线2上的位置,它们坐标应该个不相同。
所以整个问题的难点在于给定类似下面这样一个列表,我们需要找出其中的所有的行号,列号,和在对角线上的坐标:
找出行号和列号稍微简单点,这里直接给出答案,大家也可以自己思考下:
把上面的列表代进去简单验证下:
关键是如何验证对角线上的元素,而且两条对角线是不一样的,提醒下因为我们最后会还是会利用fd_all_different这个谓词。
好吧,我们回过头观察下上面那个棋盘的坐标图(注意我标红的地方),有没有发现什么规则呢?
OK,我们可以定义下面这样两个谓词diags1和diags2:
如果坐标在对角线上,那么抓取到的列表元素都是相等的。
好了,到目前为止我们已经完成了最难的部分,剩下的都是一些验证性工作。我们最终的“程序入口”应该是这样的:
我们还需要一些验证性工作:
1.给定列表里的皇后是不是合法的,即横纵坐标都在1~8之内,这用到了我上一篇中提到的member谓词:
2.验证给定的列表是不是八个皇后,这里用到一个length谓词,顾名思义:
3.需要递归的验证给定的列表中的每个元素是不是“皇后”:
Ok,下面就是八皇后问题的答案的完整代码:
没错,答案已经出来,但事实上上面这个程序运行的非常慢,我在我i7的笔记本上的GNU Prolog中执行下面这个问题,半天没有响应:
其实我们可以对这个问题进行一个简化。我们可以肯定棋盘上八行每行肯定有一个皇后,又因为互不能在一行,因此我们假设八皇后的坐标分别为:(1,A),(2,B),(3,C),(4,D),(5,E),(6,F),(7,G),(8,H)。那么我们可以对上面的代码进行优化,去掉所有对行的操作,优化后代码如下:
?后跟a可以一次性询问所有答案,可以看到还是相当的慢,这也算是声明式语言的一个劣势吧。
好了,今天介绍的两个问题就到此结束了。问题本身并不是重点,重点是我们思考问题的方式。
最后提供:,希望大家可以喜欢Prolog这门小巧简单,功能强大的语言。
[版权声明] 本站所有资料由用户提供并上传,若内容存在侵权,请联系邮箱。资料中的图片、字体、音乐等需版权方额外授权,请谨慎使用。网站中党政主题相关内容(国旗、国徽、党徽)仅限个人学习分享使用,禁止广告使用和商用。
来源:互联网05-27编辑:MR阅读()
我学的是园林专科但自考过是汉语言文学考研是能选择园林吗/
理论上可以,实际上要看你想报考的学校,研究生招生简章
理论上:考研究生是,大专毕业满x年,具有大学本科同等学力(就是你的自考)
但关键是你考的学校说了算,去看看你的学校要求是如何
一名初中生,请问各位好心人想自考汉语言文学需要了解些什么?
可以 , 专11科 ,有 就看你吃的起苦不,这要看你的水平了 我看来一般要2年半
自考很苦 你要想好啊 我也是考汉语言的
很多东西 不是单单靠兴趣 最主要是坚持不懈
关于自考汉语言文学的问题
你好,自考不需要选择学校,专业与主考院校都对应的。二外课程自己根据考试计划选择,具体按照课程教材和考试大纲考试。
汉语言文学自考课程可以保留多久
你好,目前多数省市规定自考成绩长期有效,只要不是连续多年没有报考,已经通过的成绩不会作废。还有部分省市规定自考合格成绩有效期八年,从通过考试的时间算起。
函授会计可以参加自考汉语言文学吗?
是可以考的。只是你到时候得加考而已。具体的考试科目如下:
中国近现代纲要,马克思主义基本原理概论,英语二,中国古代文学史一,中国古代文学史二,中国现代文学史,语言学概论,外国文学史,美学,毕业论文;加考三门:古代汉语,现代汉语,中国文化概论。具体加考科目要以考试省份而定,我上面说的是以湖南为例子的。
汉语言文学教育(是教育)自考专科历年试卷去哪里找
你好, 自考真题及其答案可以网上看看有没有,自考答案是不好找的。一般自考辅导试卷有专门的历次考试试题的。自考书籍主要是教材、大纲和辅导书模拟题历次考试真题,可以网上试试,或是有卖那种历次考试真题的试卷的辅导资料的可以,或是模拟试题都是可以的。
山东自考汉语言文学本科考哪些科目?
山东自考汉语言文学(本科)课程设置
专业名称:汉语言文学(本科)
主考院校:山东师范大学、济南大学
课程设置及学分:本专业共设置11门和毕业论文
1、马克思主义政治经济学原理(3)
2、毛泽东思想概论(2)
3、英语(二)(14)
4、中国现代文学史(6)
5、中国古代文学史(一)(7)
6、中国古代文学史(二)(7)
10、中国现当代作家作品专题研究(4);中国文化概论(5),外国作家作品专题研究(4),中国古代文论选读(4),现代汉语语法研究(4),以上5门任选2门
1、电大的计算机网络专科毕业证,可以用来报考自考汉语言文学本科。
2、自考报名:需要去当地教育考试院(自考办)报名自考。有些地方要先在当地教育考试院网上进行网上报名,再到当地教育考试院自考办的现场点确认。
3、自考的整个流程是:预订或买教材(书)——拿到书,自己看书学习——自考报名(选择所要考的专业和课程)——按期参加考试……(按每年的自考周期循环前面各环节多次)……全部课程考出——申请毕业——拿到自考本科学历。(其中:先报名后考试是固定不变的;而先报名还是先买教材,考生根据情况可以自己灵活进行的)。
4、自考中所需的某门考试课程的教材(书)是指定的,一般在报名的地方预订或购买教材。也可以去别的地方购买自考教材,在当地省级教育考试院网(自考网)上是有教材信息(用书目录)发布的,您要按照这个教材用书目录中的教材信息,如书名、主编、出版社、版本等去买,请不要买错。