Prolog 练习
老农伯
技术
展开
-
Prolog 列表练习 1.
转载自:https://mp.weixin.qq.com/s/tkoV2byIhCCP1b-kOMmkeg1、获取列表中的最后一个元素my_last(X,[X]).%是最后一个元素则合一my_last(X,[_|L]) :-%X是列表L的最后一个元素my_last(X,L).%如果不是最后一个元素继续递归运行效果如下:?- my_last(A, [a,b,c,d,e,f,g]).A = g ;;false.2、获取列表的倒数...原创 2020-09-06 11:23:20 · 1281 阅读 · 0 评论 -
Prolog 列表练习 2
转载自:https://mp.weixin.qq.com/s/G1rBTwds5bkObtQfHq5YDw(注意:程序段行首的数字是为了注释单独编制的行号,后面的注释是对应行号写的)10、列表的游程编码encode(L1,L2):-通过游程长度编码从列表L1获得列表L2。元素的连续重复项被编码为项[N,E],其中N是元素E的重复项数。1encode(L1,L2) :-2 pack(L1,L),3 transform(L,L2).45 transfor...原创 2020-09-06 11:28:37 · 1173 阅读 · 0 评论 -
Prolog 列表练习 3.
转载自:https://mp.weixin.qq.com/s/jbKyrbClPMjVwQV3ELPHGg28、根据子列表的长度对列表中的子列表进行排序a)长度排序lsort(InList,OutList) :-假定InList是由子列表组成的列表。然后根据元素的长度对元素进行排序,从InList中得到排好序的列表OutList。lsort/2升序排序,lsort / 3允许升序或降序排序。lsort(InList,OutList) :-lsort(InList,OutList,as..原创 2020-09-06 11:33:58 · 604 阅读 · 0 评论 -
算术练习 1
1、确定给定的整数是否为质数。质数的定义:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。因数的定义:因数是指整数a除以整数b(b≠0)的商正好是整数而没有余数,我们就说b是a的因数。1 is_prime(2).2is_prime(3).3is_prime(P) :-4 integer(P),5 P> 3,6 Pmod2 =\=0,7 \+has_factor(P,3). 89has_factor(N...原创 2020-09-06 11:35:58 · 131 阅读 · 0 评论 -
算术练习 2
转载自:https://mp.weixin.qq.com/s/ejK-u7Sc-inTZAmUd9wfiQ4、在给定整数范围内,构造一个该范围的所有质数的列表。1:-ensure_loaded(p2_01). 23 prime_list(A,B,L) :-4 A=< 2, %5 !,6 p_list(2,B,L).7 prime_list(A,B,L) :-8 A1is(A// 2) * 2 + 1,9 p_list(A1,B...原创 2020-09-06 11:37:35 · 314 阅读 · 0 评论 -
逻辑与代码 1
转载自:https://mp.weixin.qq.com/s/kSCgQlrJw4h_tGW_MpFJBQ1、逻辑表达式的真值表(1)定义谓词and/2, or/2, nand/2, nor/2, xor/2, impl/2 and equ/2 (用于逻辑等价),这些谓词根据各自的运算结果而成功或失败;例如,且仅当A和B都成功时,and(A,B)才会成功。请注意,A和B可以成为Prolog目标(不仅是常数true和fail)。然后,可以使用前缀表示法编写两个变量中的逻辑表达式,如以下示例所示:a原创 2020-09-06 11:38:45 · 423 阅读 · 0 评论 -
逻辑与代码 2
转载自:https://mp.weixin.qq.com/s/jIVa_mmqHiqSloqyDhsimQ4、格雷码在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(GrayCode)下面看下格雷码和普通二进制码的区别十进制数 二进制码 4位格雷码0 0000 00001 0001 00012...原创 2020-09-06 11:49:40 · 184 阅读 · 0 评论 -
逻辑与代码 3
转载自:https://mp.weixin.qq.com/s/JkjTL5yGhNQaww6GMiwX1A5、哈夫曼码首先,研究一本有关离散数学或算法的好书,以详细描述霍夫曼代码,或者查阅维基百科。我们假设一组符号及其频率作为fr(S,F)项的列表给出。例如:[fr(a,45),fr(b,13),fr(c,12),fr(d,16),fr(e,9),fr(f,5)].我们的目标是构造一个列表hc(S,C)项,其中C是符号S的霍夫曼代码字。在我们的示例中,结果可能是[hc(a, '0...原创 2020-09-06 11:51:42 · 128 阅读 · 0 评论 -
二叉树练习 1
转载自:https://mp.weixin.qq.com/s/PSxuA0LmzuLhokc3p15V5Q二叉树不是空的,它是由一个根元素和两个后继者组成,它们本身又是二叉树。在Prolog中,我们用原子“ nil”表示空树,用项t(X,L,R)表示非空树,其中X表示根节点,L和R分别表示左子树和右子树。因此,相应示例树由以下Prolog项表示:T1 = t(a,t(b,t(d,nil,nil),t(e,nil,nil)),t(c,nil,t(f,t(g,nil,nil),nil)))..原创 2020-09-06 11:53:13 · 299 阅读 · 0 评论 -
二叉树练习 2
转载自:https://mp.weixin.qq.com/s/I2hjkWOV1e2qaQuE8ASwVg7、使用给定数量的节点构造高度平衡的二叉树考虑一个高度为H的高度平衡的二叉树。它可以包含的最大节点数是多少?显然,MaxN = 2 ** H-1。但是,最小数MinN是多少?这个问题比较困难。尝试找到一个递归语句并将其转换为谓词minNodes/2,定义为以下形式:minNodes(H,N):- N是高度为H的高度平衡二叉树中的最小节点数。另一方面,我们可能会问:具有N个节点的高度平衡的原创 2020-09-07 09:25:35 · 419 阅读 · 0 评论 -
二叉树练习 3
转载自:https://mp.weixin.qq.com/s/e6Mw5v3So-wgUPDsOixulQ13、布局二叉树(1)给定二叉树作为通常的Prolog项t(X,L,R)(或nil)。作为绘制树的准备工作,需要一种布局算法来确定每个节点在矩形网格中的位置。可以考虑几种布局方法,下图显示了其中一种。在此布局策略中,节点v的位置通过以下两个规则获得:x(v)等于节点v在有序序列中的位置y(v)等于树中节点v的深度为了存储节点的位置,我们将代表一个节点(及其后继节点)的Pro.原创 2020-09-07 09:29:45 · 439 阅读 · 0 评论 -
多路树 练习
转载自:https://mp.weixin.qq.com/s/I9rQ--HaVIhZ9-7STQ9AdA多路树多路树由根元素和一组(可能为空)后继者组成,后继者本身也是多路树。多路树永远不会为空。后继树的集合有时称为森林。在Prolog中,我们用项t(X,F)表示多路树,其中X表示根节点,F表示后继树的森林(Prolog列表)。因此,相应的示例树由以下Prolog项表示:T = t(a,[t(f,[t(g,[])]),t(c,[]),t(b,[t(d,[]),t(e,[])])].原创 2020-09-07 09:32:23 · 224 阅读 · 0 评论 -
图 练习 1
转载自:https://mp.weixin.qq.com/s/jkWcTwLV9tH8yfOjnzaE9A初步说明:图论中的词汇差异很大。一些作者使用相同的词具有不同的含义。有些作者用不同的词来表示同一件事。我希望我们的定义没有矛盾。图被定义为一组节点和一组边,其中每个边是一对节点。在Prolog中有几种表示图的方法。一种方法是将每个边分别表示为一个子句(事实)。以这种形式,相应的图表示为以下谓词: edge(h,g). edge(k,f)....原创 2020-09-07 09:34:10 · 182 阅读 · 0 评论 -
图 练习 2
转载自:https://mp.weixin.qq.com/s/lcWXPRSLLKHO-84g6AFdWg2、从一个节点到另一个节点的路径path(G,A,B,P) :- P是图G中的节点A到节点B的(非循环)路径。G以图项形式给出。1:-ensure_loaded(p6_01).23path(G,A,B,P) :-4 path1(G,A,[B],P).56 path1(_,A,[A|P1],[A|P1]).7path1(G,A,[Y...原创 2020-09-07 09:35:43 · 108 阅读 · 0 评论 -
图 练习 3
转载自:https://mp.weixin.qq.com/s/ymcl69qtM2sYA6O9wxv_JA3、从给定节点循环cycle(G,A,P) :- P是从图形G中的节点A开始的封闭路径。G以图项形式给出。1:-ensure_loaded(p6_01).% conversions2 :-ensure_loaded(p6_02).% adjacent/3 and path/434 cycle(G,A,P) :-5 adjacent(B,A,G),...原创 2020-09-07 09:37:08 · 151 阅读 · 0 评论 -
图 练习 4
转载自:https://mp.weixin.qq.com/s/ymcl69qtM2sYA6O9wxv_JA上一练习中所需文件p6_04.dat的内容:graph([a, b, c, d, e, f, g, h], [e(a, b), e(a, d), e(b, c), e(b, e), e(c, e), e(d, e), e(d, f), e(d, g), e(e, h), e(f, g), e(g, h)]).5、构造标记图的最小生成树ms_tree(G,T,S) :- T是图G的最.原创 2020-09-07 09:38:53 · 273 阅读 · 0 评论 -
图 练习 5
转载自:https://mp.weixin.qq.com/s/mGqpI81rdsxGyaz1K-l6jw7、节点的度和图形着色程序文件p6_07.pl:1:-ensure_loaded(p6_01).% conversions2 :-ensure_loaded(p6_02).% adjacent/33% a)编写确定给定节点度数的谓词degree(Graph,Node,Deg)% degree(Graph,Node,Deg) :- Deg是图Grap...原创 2020-09-07 09:42:57 · 320 阅读 · 0 评论 -
用Prolog解决数独
转载自:https://mp.weixin.qq.com/s/NE4j2Jc0vzw9pr2w4BF7hg我们先了解一下什么是数独数独(shù dú)是源自18世纪瑞士的一种数学游戏。它是一种运用纸、笔进行演算的逻辑游戏。数独有多种类型,我们仅以其中一种类型作为本文实例。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。方格水平方向有九横行,垂直方向有九纵列的矩形,画分八十一个小正方形,称为九宫格(.原创 2020-09-07 09:44:51 · 1526 阅读 · 0 评论 -
八皇后问题
转载自:https://mp.weixin.qq.com/s/Kdvo_yGFaYmw5TjNg6Bb8Q这是计算机科学中的经典问题。目的是在棋盘上放置八个皇后不会有两个皇后互相攻击。也就是说,在同一行,同一列或同一对角线中,没有两个皇后区。我们通过允许棋盘的任意尺寸N来概括这个原始问题。我们用数字1..N表示皇后的位置。例如: [4,2,7,3,6,8,5,1]表示第一列中的皇后在第4行中,第二列中的皇后在第2行中,依此类推。通过使用数字1..N的置换,我们保证没有两个皇后在同一行中...原创 2020-09-07 09:46:43 · 495 阅读 · 0 评论 -
骑士巡游
转载自:https://mp.weixin.qq.com/s/Mv1MAR0XTo-9eEZPSVXJGw国际象棋中马(骑士)的走法很特别:先横向或竖向走两格,再往左或往右走一格,并跳过路上的其他棋子。马(骑士)“L”形走法引出了很多数学趣题,其中最简单的是“骑士巡游”。马(骑士)要求进行一系列移动,使得它恰好访问国际象棋棋盘(或任何其他大小的棋盘)的每格各一次。下图表示一个5X5棋盘上的“巡游”,并显示了一条可能的路线。这条路线不是“闭合的”,即马的起点和终点不在同一格。你能在5X5棋盘上找出一条闭合原创 2020-09-08 09:36:41 · 980 阅读 · 0 评论 -
冯·科赫猜想
转载自:https://mp.weixin.qq.com/s/BnSalO-hEPI-E7jmL2Pqnw给定具有n节点的树(因此有n-1边)。找到一种方法,从枚举节点1到n,因此,从边1到边n-1以这样的方式,对于每个边k其节点号的差等于k。推测这总是可能的。这是一个例子,可以很清楚地说明这一点:我们的任务我们的代码将以一棵树作为输入,我们可以采用所需的格式,但是对于测试用例,我们将通过它们的弧和它们的节点列表来提供树。例如,这是图片中树的输入:[d-a,a-g,b-c,e-f原创 2020-09-08 09:37:20 · 156 阅读 · 0 评论 -
算术难题
转载自:https://mp.weixin.qq.com/s/wqbeHvQoafrGdpNBispMEA给定一个整数列表,找到插入算术符号(运算符)的正确方法,使结果为正确的等式。示例:使用数字列表[2,3,5,7,11],我们可以形成等式2-3+5+7 = 11或2=(3*5+7)/11(以及另外10个),解决这个问题的想法来自Roland Beuret。谢谢程序文件名:p7_04.pl% equation(L,LT,RT) :- L是数字列表,它们是算术项LT和RT中的叶子-从左...原创 2020-09-08 09:40:02 · 211 阅读 · 0 评论 -
非图
转载自:https://mp.weixin.qq.com/s/_2K_ONH8BWHCMQ67kv4l_Q1994年前后,一种智力游戏在英国非常流行。《星期日电讯报》写道:“无图是来自日本的谜语,目前每周只在《星期日电讯报》上发表。简单地用你的逻辑和技能来完成网格并展示一张图片或图表。”作为一个Prolog程序员,你的处境更好:你可以让你的计算机来完成这项工作!难题是这样的:本质上,矩形位图的每一行和每一列都用其占用的单元格的不同字符串的相应长度进行注释。解决难题的人必须仅根据这些长度来完成位.原创 2020-09-08 09:41:50 · 377 阅读 · 0 评论 -
英文数字单词、一筐鸡蛋的问题
转载自:https://mp.weixin.qq.com/s/Drd-HeLIRTZY25rsrbLsXA英文数字单词在财务文档(如支票)上,有时必须用全文字写数字。示例:175必须写成one-seven-five。编写谓词full_words / 1以全字显示(非负)整数。程序文件名: p7_05.pl% full_words(N) :- print the number N in full words (English)% (non-negative integer) (+).原创 2020-09-08 09:43:44 · 117 阅读 · 0 评论 -
填字游戏
转载自:https://mp.weixin.qq.com/s/PbopBAcQo9q37_sUanh4zw给定一个填字游戏和一组单词的空的(或几乎空的)框架。问题是将这些词放入框架中。特定的填字游戏在文本文件中指定,该文件首先以任意顺序列出单词(每行一个单词)。然后,在空行之后,定义填字游戏框架。在此框架规范中,空字符位置由点(.)表示。为了简化解决方案,字符位置还可以包含预定义的字符值。然而谜题在文件p7_09a.dat中定义,其它谜题示例为p7_09b.dat和p7_09d.dat。还有一个原创 2020-09-08 09:45:34 · 758 阅读 · 0 评论