人工智能程序设计语言-Linux公社.PPT

  1. 1、本文档共70页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
人工智能程序设计语言-Linux公社

* 华北电力大学 * 截断 直到目前为止,我们都一直在使用Prolog内建的回溯功能。使用此功能可以方便地写出结构紧凑的谓词来 但是,并不是所有的回溯都是必须的,这时我们需要能够人工地控制回溯过程 Prolog提供了完成此功能的谓词,叫做cut,使用符号!来表示,如果在cut处产生回溯,它会自动地失败,而不去进行其它的选择 * 华北电力大学 * 截断—例子 p(a). p(b). q(b). r1(X):-p(X),q(X). r1(c). ?-r1(X). p(a). p(b). q(b). r2(X):-!,p(X),q(X). r2(c). ?-r2(X). p(a). p(b). q(b). r3(X):-p(X),!,q(X). r3(c). ?-r3(X). p(a). p(b). q(b). r4(X):-p(X),q(X),!. r4(c). ?-r4(X). X=b,X=c. X=b. X=b. 无解 ①程序调用cut总是成功;②当某个子目标失败回溯时,不允许越过!回溯 * 华北电力大学 * 截断—例子 cut是不符合纯逻辑学的,不过出于实用的考虑,它还是必须的 过多地使用cut将降低程序的易读性和易维护性 它就像是其它语言中的goto语句 * 华北电力大学 * 例:Hanoi塔 如图,目的是把左边的所有盘子移到右边的杆子上。一次只能移动一个盘子,你可以使用中间的杆子作为临时存放盘子的地方。小盘子必须放在大盘子之上 * 华北电力大学 * 例:Hanoi塔 如果要移动N个盘子,就要分三步走: 把N-1个盘子移动到中间的杆子上(把中间的杆子作为临时存放盘子的位置) 把最后一个盘子直接移到右边的杆子上 最后把中间杆子上的盘子移到右边的杆子上(把左边的杆子作为临时存放盘子的位置) * 华北电力大学 * 例:Hanoi塔 hanoi(N):-move(N,left,middle,right). move(1,A,_,C):-inform(A,C),!. move(N,A,B,C):-N1 is N-1, move(N1,A,C,B),inform(A,C),move(N1,B,A,C). inform(Loc1, Loc2):-nl, write(Move a disk from -Loc1- to -Loc2). 主程序为hanoi/1,它的参数为盘子的数目。它调用递归谓词move来完成任务。三个杆子的名字分别为left、middle、right * 华北电力大学 * 例:Hanoi塔 第一个move/4子句是边界情况,即只有一个盘子时,直接调用inform/2显示移动盘子的方法。后面使用cut,是因为:如果只有一个盘子,就是边界条件,无需再对第二条子句进行匹配了 第二个move/4子句为递归调用,首先把盘子数目减少一个,再递归调用move/4,把N-1个盘子从A杆通过C杆移到B杆,再把A杆上的最后一个盘子直接从A杆移到C杆上,最后再递归调用move/4,把B杆上的N-1个盘子通过A杆移到C杆上 inform/2,把移动过程通过write/1谓词写出,由于write/1只能有一个参数,所以使用“-”操作符相连 ?-hanoi(3). * 华北电力大学 * The End lambda函数也叫匿名函数,即,函数没有具体的名称。先来看一个最简单例子: def?f(x): ????return?x**2 print?f(4) Python中使用lambda的话,写成这样: g?=?lambda?x?:?x**2 print?g(4) lambda表达式在很多编程语言都有对应的实现。比如C#: var?g?=?x?=?x**2 Console.WriteLine(g(4)) * 华北电力大学 * 例 定义求N!的LISP函数 阶乘的公式是 n!=n×(n-1)! 1!=1 0!=1 其LISP函数如下: (DEFUNN!(n) (COND((=n 0)1) ((=n 1)1) (T(* n(N!(- n 1)))))) 该函数的最后一行中又调用了它自己→这个函数N!是递归定义的 * 华北电力大学 * 例 HANOI (DEFUN HANOI(a b c n) 当只有一个盘子时,直接将a上的盘子移动到c上   (COND((=n 1)(MOVE-DISK a c)) 其他情况,通过递归,先将柱a上的n-1个盘子通过柱c移到柱b上   (T(HANOI a c b(-

文档评论(0)

laolao123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档