欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    第2章 人工智能程序设计语言课件.ppt

    • 资源ID:1824156       资源大小:1.08MB        全文页数:165页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第2章 人工智能程序设计语言课件.ppt

    第1页,第2章 人工智能程序设计语言,2.1 综述2.2 函数型程序设计语言LISP 2.3 逻辑型程序设计语言PROLOG 2.4 Turbo PROLOG程序设计,第2页,2.1 综述,2.1.1 函数型语言 LISP是一种函数型程序设计语言。LISP程序由一组函数组成,程序的执行过程就是一系列的函数调用和求值过程。但LISP还不是纯函数型语言,准确地讲,它是基于-函数的语言。除LISP外,20世纪70年代J.Backus还提出了一种称为FP的所谓纯函数型程序设计语言。但该语言现在还限于理论研究,实现上还存在一定困难。,第3页,2.1.2 逻辑型语言 逻辑型程序设计语言起源于PROLOG(PROgramminginLOGic的缩写)。PROLOG语言首先由法国马塞大学的Colmerauer和它的研究小组于1972年研制成功,后来在欧洲得到进一步发展。特别是1981年日本宣布要以PROLOG作为他们正在研制的新一代计算机智能计算机的核心语言,更使PROLOG举世瞩目,迅速风靡世界。,第4页,PROLOG语言是以Horn子句逻辑为基础的程序设计语言,它是目前最具代表性的一种逻辑程序设计语言。早期PROLOG版本都是解释型的,1986年美国的Borland公司推出了编译型PROLOG-TurboPROLOG,并很快成为PC机上流行的PROLOG。现在运行在Windows环境下的可视化编程语言VisualPROLOG也已面世。但这些PROLOG语言版本属顺序逻辑程序设计语言。,第5页,2.1.3 面向对象语言 20世纪80年代以来,面向对象程序设计(ObjectOrientedProgramming,简称OOP)异军突起,发展迅速,如今已日渐成熟,并越来越流行起来。面向对象程序以其信息隐蔽、封装、继承、多态、消息传递等一系列优良机制,大大改善了软件的复杂性、模块性、重用性和可维护性,有望从根本上解决软件的生产效率问题。另一方面,由于面向对象程序设计的类、对象、继承等概念,与人工智能特别是知识表示和知识库产生了天然的联系。,第6页,因而,现在面向对象程序设计语言也成为一种人工智能程序设计语言,面向对象程序设计也被广泛引入人工智能程序设计,特别是知识工程、专家系统程序设计。面向对象程序设计语言也种类繁多,已发展成为一个大家族。其中最纯正、最具面向对象风格的语言当推Smalltalk,而最流行的OOP语言是C+,Java则是适于网络(Internet)环境的一种面向对象语言。,第7页,2.1.4 混合型语言 以上三种语言都各有所长,但也都有其不足之处。为了扬长避短,于是便出现了基于这三种语言的混合型语言。 1. 函数型与逻辑型相结合的语言 函数型与逻辑型语言的结合方式有耦合型和统一型两类。统一型又可分为具有归结语义的函数型语言和集成式语言两个子类。,第8页,2. 函数型与面向对象相结合的语言 在LISP语言的基础上再扩充面向对象机制而产生的语言,称为函数型的面向对象程序设计语言(亦称为面向对象的LISP)。 3. 逻辑型与面向对象相结合的语言,第9页,2.2 函数型程序设计语言LISP,LISP语言的主要特点是: (1) LISP程序由一组函数组成,程序的执行过程是函数的调用过程。 (2) 程序和数据在形式上是相同的,即都是符号表达式,简称为S表达式。 (3) 递归是LISP语言的主要控制结构。 (4) 程序以交互方式运行。,第10页,2.2.1 LISP的程序结构与运行机制 LISP的程序一般由函数的定义和函数的调用两部分组成。其一般格式为: (DEFUN() (WB) () () () (),第11页,其中的“DEFUN”是定义函数的关键字,“函数名”可以是系统的内部函数(名),也可以是用户用DEFUN定义的函数(名)。例如下面就是一个LISP程序。 (DEFUNHANOI(a b c n) (COND(=n1)(MOVE-DISK a c) (T(HANOI a c b(-n1) (MOVE-DISK a c) (HANOI b a c(-n1),第12页,(DEFUNMOVE-DISK(from to)(TERPRI)(PRINCMove Disk From)(PRINC from)(PRINCTo)(PRINC to)(HANOIabc3),第13页,2.2.2 S表达式 从语法上看,LISP程序的基本单位是S表达式。S表达式又可分为原子和表两大类。 原子(atom)是由字母和数字组成的字符串,是S表达式的最简单情况。原子又可分为文字原子、串原子和数字原子三种。 文字原子又称符号(symbol),是以字母开头的字母数字串,用来表示常量、变量和函数的名字等。例如:ABC、X1等。,第14页,串原子是由双引号括起来的一串字符。如LISP Program。 数字原子由数字串组成。在其前面可以有符号“-”或“+”,中间可出现“.”,用来表示整数和实数。例如:256、-66、3.14159等。,第15页,S表达式可以递归定义如下: (1) 原子是S表达式。 (2) 若S1和S2是S表达式,则(S1S2)也是S表达式。由定义,下面的式子都是S表达式: X2 123 (AB) (A(BC),第16页,表(list)是LISP语言中最常用的数据类型,也是主要的处理对象。表是由圆括号括起来的由空格分开的若干个元素的集合。 表的一般形式为: (),第17页,例如: (X Y Z),(+12),(A (B C) 左括号后面的第一个元素称为表头,其余的元素组成的表称为表尾。例如,对于表 (+12)的头为+,尾为(12)。 特别地,元素个数为零的表为空表,记为()或NIL。 表是一种特殊的S表达式,每一个表都对应着一个S表达式。二者的关系由下面的例子说明。,第18页,表S -表达式 (A) (ANIL) (AB) (A(BNIL) (ABC) (A(B(CNIL) (AB)CD) (A(BNIL)(C(DNIL) 可以看出,表的S表达式的结构实际是一棵二叉树。,第19页,2.2.3 基本函数 LISP的函数都以表的形式出现,并一律使用前缀表示方式,即表头为函数名,并且每个函数都有一个返回值。LISP的函数可分为语言自身提供的内部函数(称为基本函数或系统函数)和用户自定义函数两类。基本函数的种类有十多个,下面仅给出其中主要的几类。 1. 表处理函数 表处理是LISP的主要特色,表处理的函数也很多,下面仅给出最常用的几个。,第20页,1) CAR函数格式(CAR)其中CAR为函数名,它是一个保留字(下同)。功能取出表中的表头。例如:(CAR(LISP Language Program)返回值为:LISP,第21页,2) CDR函数 格式(CDR) 功能取出表中的表尾。 例如:(CDR(LISP Language Program) 返回值为:(Language Program) 3) CONS函数 格式(CONS) 功能将S表达式作为一个元素加到表中去,并作为所构成新表中的第一个元素。 例如:(CONSMy(LISP Language Program) 返回值为:(My LISP Language Program),第22页,4) APPEND函数格式 (APPEND)功能 将n个表中的元素合并成一个新表。例如:(APPEND(TIGER LION)(DOG CAT)返回值为:(TIGER LION DOG CAT),第23页,5) LIST函数格式(LIST)功能把n个S表达式作为元素括在一起构成一张新表。例如:(LISTYELLOWREDBLUE)返回值为:(YELLOW RED BLUE),第24页,2.算术函数 LISP的算术表达式也是用函数表示的,称为算术函数。下面我们仅举例说明。 (+25) 表示2+5,返回值为7。 (-(*48)(/105)表示48-10/5,返回值为30。,第25页,3. 求值与赋值函数 在上面的函数中多次出现撇号,它的意思是禁止求值。为什么要禁止求值呢?原来,LISP总是试图对一切S表达式求值。表的值是通过函数运算而得到的,原子的值则是通过赋值函数实现的。撇号也是一个函数,它实际是禁止求值函数QUOTE的简写形式。 赋值函数有多个,其中SET函数是一个最基本的赋值函数。,第26页,格式(SET) 功能把S表达式赋给变量。 例如: (SETX8); X 得到值8 (SETY(a b c); Y 得到值(a b c) (SETZ(CDRY); Z 得到值(b c) 另外,赋值函数还有SETQ、SETF(COMMON LISP),其功能是类似的。,第27页,4. 谓词函数 返回值为逻辑值真或假的函数称为谓词函数,简称谓词。LISP中真和假分别用T和NIL表示,当函数的返回值为非NIL时,也表示为真。另外,NIL也表示空表。谓词函数也有多个,下面我们仅给出常用的几个。,第28页,(1) 原子谓词ATOM 格式 (ATOM) 功能检测其参数是否为原子,是则返回T,否则返回NIL。 例如: (ATOMa);返回T (ATOM(a b);返回NIL,第29页,(2) 相等谓词EQUAL 格式(EQUAL) 功能判断两个参数是否逻辑相等。 例如: (EQUALaa); 返回T (EQUAL(a b)(ac); 返回NIL (EQUAL(a b)(CONSa(b); 返回T 还有一种相等谓词,其格式为:(EQ),但它只是用来判断两个原子是否相等。例如:(EQaa),则返回T,第30页,(3)判空表函数NULL 格式(NULL) 功能判断参数是否为空表,是则返回T,否则返回NIL。,第31页,5.条件函数 条件函数也称分支函数,类似于其他语言中的分支语句,其作用是控制程序的流程。 格式 (COND(P1 e1) (P2e2) (Pnen) 其中Pi(i=1,.,n)为谓词,ei(i=1,.,n)为一个或多个S表达式。,第32页,功能如果P1为真,则COND函数的值为e1(当e1为多个S表达式时,取最后一个S表达式的值,下同)。否则,判断P2,直到某个Pi真为止,然后将对应的ei作为函数值。若没有一个Pi的值为非NIL,则COND的返回值为NIL。特别地,Pi也可以为逻辑常量T,这时则对其对应的各表达式求值,并把最后一个表达式的值作为COND的返回值。,第33页,例如: (COND(NULL x)0) (ATOM x)1) (LISTP x)(LENGTH x) 其语义是,若x的值为NIL,则COND的返回值为0;若x为原子,则COND的返回值为1;若x的值为表,则COND的返回值为表的长度。,第34页,2.2.4 自定义函数 基本函数是LISP提供的基本处理功能,要用LISP编程解决实际问题,仅有基本函数还是不够的,用户还必须根据问题的需要,利用基本函数自定义所需的函数。 自定义函数的格式为: (DEFUN() ),第35页,其中函数体,又可能是用户自定义的函数或LISP基本函数的某种组合。所以,一般来讲,LISP自定义函数就是由其基本函数组合而成的。常用的组合方法有复和、分支、递归、迭代等。其中最具特色的构造方法是递归。,第36页,例2.1 定义求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),第37页,可以看出,该函数的最后一行中又调用了它自己。所以,这个函数N!是递归定义的。 需说明的是,一个函数是否能递归定义,要取决于以下两条: (1)函数的求值存在最简的情形,在这种情形下函数值是显然的或已知的; (2)该函数对于其参数的求值,可以归结为对另一些参数的求值,而且后者比前者更容易求值,即使问题朝最简情形逼近了一步。,第38页,2.2.5 程序举例 例2.2 符号微分程序。 这里是指数学上的一元函数求导。我们用D(ex)表示数学上的de/dx,这里e为需求导的函数表达式,x为自变量。程序如下: (DEFUND(ex) (COND(ATOM e)(IF(Eq e x)1 0) (T(APPLY(D-RULE(CAR e) (APPEND(CDR e) (LIST x),第39页,其中D-RULE是一个获取给定操作符的微分规则的LISP函数。微分规则的存放,是通过为相应操作符建立d特性的方法完成的。D-RULE的定义为 (DEFUN D-RULE(operator) (GET operatord) 其中操作符d的特性值需事先用SETF函数建立好。例如对于操作符加和乘,在数学上有 d(uv)/dxdu/dxdv/dx d(uv)/dxvdu/dxudv/dx ,第40页,用LISP表示就是 (SETF(GET+D)(LAMBDA(u v x)(+,(Dux),(D v x) (SETF(GET*D)(LAMBDA(u v x)(+(*,(Dux),v)(*,(D v x),u),第41页,有了这些函数,我们就可以用机器求符号微分了。例如,给出如下的函数调用(D(+(*2x)(*x x)x);即求一元函数2x+x2关于x的导函数则得到返回值为 (+(+(* 0 x)(* 1 2)(+(* 1 x)(*1 x) 即2+2x,结果正确。,第42页,由于篇幅所限,上面我们对LISP语言仅做了简要介绍。需进一步学习的读者,可参阅有关专门著作。实际上,以此为入门和基础,读者就可以参照某一具体的LISP语言资料,进行LISP程序设计了。经过30多年的发展,LISP的方言和版本也很多。目前比较流行的有INTERLISP、MACLISP、COMMONLISP。其中COMMONLISP将成为一种标准,以统一各种LISP方言。,第43页,2.3 逻辑型程序设计语言PROLOG,2.3.1 PROLOG的语句 PROLOG语言只有三种语句,分别称为事实、规则和问题。 1.事实(fact) 格式(). 其中谓词名是以小写英文字母打头的字母、数字、下划线等组成的字符串,项表是以逗号隔开的项序列。,第44页,PROLOG中的项包括由常量或变量表示的简单对象以及函数、结构和表等,即事实的形式是一个原子谓词公式。 例如: student(john). like( mary ,music). 就是PROLOG中的两个合法事实。,第45页,功能 一般表示对象的性质或关系。 例如上面的两个事实就分别表示“约翰是学生”和“玛丽喜欢音乐”。 作为特殊情形,一个事实也可以只有谓词名而无参量。 例如: abc. repeat. 等也是允许的。,第46页,2. 规则(rule) 格式():-(),(). 其中“:-”号表示“if”(也可以直接写为if),其左部的谓词是规则的结论(亦称为头),右部的谓词是规则的前提(亦称为体),表示零次或多次重复,逗号表示and(逻辑与),即规则的形式是一个逻辑蕴含式。,第47页,例如: bird(X):-animal(X),has(X,feather). grandfather(X,Y):-father(X,Z),father(Z,Y). 就是PROLOG的合法规则。,第48页,功能一般表示对象间的因果关系、蕴含关系或对应关系。 例如,上面的第一条规则就表示“如果X是动物,并且X有羽毛,则X是鸟”;第二条规则就表示“X是Y的祖父,如果存在Z,X是Z的父亲并且Z又是Y的父亲”。作为特殊情形,规则中的谓词也可以只有谓词名而无参量。 例如: run:-start,step1(X),step2(X),end. 也是一个合法规则。,第49页,3.问题(question) 格式?-(),(). 例如: ?-student(john). ?-like(mary,X). 就是两个合法的问题。 功能 问题表示用户的询问,它就是程序运行的目标。,第50页,2.3.2 PROLOG程序 PROLOG程序一般由一组事实、规则和问题组成。问题是程序执行的起点,称为程序的目标。 例如下面就是一个PROLOG程序。 likes(bell,sports). likes(mary,music). likes(mary,sports). likes(jane ,smith). friend(john,X):-likes(X,reading),likes(X,music). friend(john,X):-likes(X,sports),likes(X,music). ?-friend(john,Y).,第51页,可以看出,这个程序中有四条事实、两条规则和一个问题。其中事实、规则和问题都分行书写。规则和事实可连续排列在一起,其顺序可随意安排,但同一谓词名的事实或规则必须集中排列在一起。问题不能与规则及事实排在一起,它作为程序的目标要么单独列出,要么在程序运行时临时给出。,第52页,这个程序的事实描述了一些对象(包括人和事物)间的关系;而规则则描述了john交朋友的条件,即如果一个人喜欢读书并且喜欢音乐(或者喜欢运动和喜欢音乐),则这个人就是john的朋友(当然,这个规则也可看作是john朋友的定义);程序中的问题是“约翰的朋友是谁?” 当然,PROLOG程序中的目标可以变化,也可以含有多个语句(上例中只有一个)。如果有多个语句,则这些语句称为子目标。例如对上面的程序,其问题也可以是,第53页,?-likes(mary,X). 或 ?-likes(mary,music). 或 ?-friend(X,Y). 或 ?-likes(bell,sports), likes(mary,music), friend(john,X). 等等。当然,对于不同的问题,程序运行的结果一般是不一样的。,第54页,2.3.3 PROLOG程序的运行机理 既然PROLOG程序是基于Horn子句的逻辑程序,那么其运行机理自然就是基于归结原理的演绎推理(归结原理将在第3章介绍)。下面我们就来看PROLOG程序是怎样运行的。 PROLOG程序的运行是从目标出发,并不断进行匹配、合一、归结,有时还要回溯,直到目标被完全满足或不能满足时为止。那么,什么是匹配、合一和回溯呢?下面我们就先介绍这几个概念。,第55页,1. 自由变量与约束变量 PROLOG中称无值的变量为自由变量,有值的变量为约束变量。一个变量取了某值就说该变量约束于某值,或者说该变量被某值所约束,或者说该变量被某值实例化了。,第56页,2. 匹配合一 两个谓词可匹配合一,是指两个谓词的名相同,参量项的个数相同,参量类型对应相同,并且对应参量项还满足下列条件之一: (1)如果两个都是常量,则必须完全相同。 (2)如果两个都是约束变量,则两个约束值必须相同。 (3)如果其中一个是常量,一个是约束变量,则约束值与常量必须相同。 (4)至少有一个是自由变量。,第57页,例如:下面的两个谓词 pre1(ob1,ob2,Z) pre1(ob1,X,Y) 只有当变量X被约束为ob2,且Y、Z的约束值相同或者至少有一个是自由变量时,它们才是匹配合一的。,第58页,3. 回溯 所谓回溯,就是在程序运行期间,当某一个子目标不能满足(即谓词匹配失败)时,控制就返回到前一个已经满足的子目标(如果存在的话),并撤消其有关变量的约束值,然后再使其重新满足。成功后,再继续满足原子目标。如果失败的子目标前再无子目标,则控制就返回到该子目标的上一级目标(即该子目标谓词所在规则的头部)使它重新匹配。回溯也是PROLOG的一个重要机制。,第59页,下面,我们介绍PROLOG程序的运行过程。我们仍以上面的程序为例。设所给的询问是 ?-friend(john,Y).(john和谁是朋友?) 则求解目标为 friend(john,Y). 这时,系统对程序进行扫描,寻找能与目标谓词匹配合一的事实或规则头部。显然,程序中前面的四条事实均不能与目标匹配,而第五个语句的左端即规则,第60页,friend(john,X):-likes(X,reading),likes(X,music). 的头部可与目标谓词匹配合一。但由于这个语句又是一个规则,所以其结论要成立则必须其前提全部成立。于是,对原目标的求解就转化为对新目标 likes(X,reading),likes(X,music). 的求解。这实际是经归结,规则头部被消去,而目标子句变为 ?-likes(X,reading),likes(X,music). 现在依次对子目标 likes(X,reading)和likes(X,music) 求解。,第61页,子目标的求解过程与主目标完全一样,也是从头对程序进行扫描,不断进行测试和匹配合一等,直到匹配成功或扫描完整个程序为止。可以看出,对第一个子目标like(X,reading)的求解因无可匹配的事实和规则而立即失败,进而导致规则 friend(john,X):-likes(X,reading),likes(X,music). 的整体失败。于是,刚才的子目标 likes(X,reading)和likes(X,music),第62页,被撤消,系统又回溯到原目标friend(john,X)。这时,系统从该目标刚才的匹配语句处(即第五句)向下继续扫描程序中的子句,试图重新使原目标匹配,结果发现第六条语句的左部,即规则 friend(john,X):-likes(X,sports),likes(X,music). 的头部可与目标为谓词匹配。但由于这个语句又是一个规则,于是,这时对原目标的求解,就又转化为依次对子目标 likes(X,sports)和likes(X,music),第63页,的求解。这次子目标likes(X,sports)与程序中的事实立即匹配成功,且变量X被约束为bell。于是,系统便接着求解第二个子目标。由于变量X已被约束,所以这时第二个子目标实际上已变成了 likes(bell,music). 由于程序中不存在事实likes(bell,music),所以该目标的求解失败。于是,系统就放弃这个子目标,并使变量X恢复为自由变量,然后回溯到第一个子目标,重新对它进行求解。由于系统已经记住了刚才已同第一子目标谓词匹配过的事实的位置,所以重新求解时,便从下一个事实开始测试。,第64页,易见,当测试到程序中第三个事实时,第一个子目标便求解成功,且变量X被约束为mary。这样,第二个子目标也就变成了 likes(mary,music). 再对它进行求解。这次很快成功。 由于两个子目标都求解成功,所以,原目标friend(john,Y)也成功,且变量Y被约束为mary(由Y与X的合一关系)。于是,系统回答: Y=mary 程序运行结束。 上面只给出了问题的一个解。如果需要和可能的话,系统还可把john的所有朋友都找出来。我们把上述程序的运行过程再用示意图(图21)描述如下:,第65页,图21 PROLOG程序运行机理示例,第66页,上述程序的运行是一个通过推理实现的求值过程。我们也可以使它变为证明过程。 例如,把上述程序中的询问改为 friend(john,mary) 则系统会回答:yes 若将询问改为: friend(john,smith) 则系统会回答:no,第67页,从上述程序的运行过程可以看出,PROLOG程序的执行过程是一个(归结)演绎推理过程。其特点是:推理方式为反向推理,控制策略是深度优先,且有回溯机制。其具体实现方法是:匹配子句的顺序是自上而下;子目标选择顺序是从左向右;(归结后)产生的新子目标总是插入被消去的目标处(即目标队列的左部)。PROLOG的这种归结演绎方法被称为SLD(LinearresolutionwithSelectionfunctionforDefiniteclause)归结,或SLD反驳-消解法。SLD归结就是PROLOG程序的运行机理,它也就是所谓的PROLOG语言的过程性语义。,第68页,2.4 Turbo PROLOG程序设计,2.4.1 Turbo PROLOG的程序结构 一个完整的Turbo PROLOG(2.0版)程序一般包括常量段、领域段、数据库段、谓词段、目标段和子句段等六个部分。各段以其相应的关键字constants、domains、database、predicates、goal和clauses开头加以标识。:,第69页,另外,在程序的首部还可以设置指示编译程序执行特定任务的编译指令;在程序的任何位置都可设置注解。总之,一个完整的TurboPROLOG(2.0版)程序的结构如下 /*/ constants domains database,第70页, predicates goal clauses ,第71页,当然,一个程序不一定要包括上述所有段,但一个程序至少要有一个predicates段、clauses段和goal段。在大多数情形中,还需要一个domains段,以说明表、复合结构及用户自定义的域名。如若省略goal段,则可在程序运行时临时给出,但这仅当在开发环境中运行程序时方可给出。若要生成一个独立的可执行文件,则在程序中必须包含goal段。另一方面,一个程序也只能有一个goal段。,第72页,例2.3 如果把上节中的程序要作为TurboPROLOG程序,则应改写为: /*例子程序-1*/ DOMAINS name=symbol PREDICATES likes(name,name). friend(name,name) GOAL friend(john,Y),write(Y=,Y).,第73页,CLAUSESlikes(bell,sports).likes(mary,music).likes(mary,sports).likes(jane,smith).friend(john,X):-likes(X,sports),likes(X,music).friend(john,X):-likes(X,reading),likes(X,music).,第74页,结合上例,我们再对上述程序结构中的几个主要段的内容和作用加以说明(其余段在后面用到时再作说明): 领域段该段说明程序谓词中所有参量项所属的领域。领域的说明可能会出现多层说明,直到最终说明到Turbo PROLOG的标准领域为止(如上例所示)。Turbo PROLOG的标准领域即标准数据类型,包括整数、实数、符号、串和符号等,其具体说明如表2.1所示。,第75页,表2.1 Turbo PROLOG的标准领域,第76页,谓词段该段说明程序中用到的谓词的名和参量项的名(但Turbo PROLOG的内部谓词无须说明)。 子句段该段是Turbo PROLOG程序的核心,程序中的所有事实和规则就放在这里,系统在试图满足程序的目标时就对它们进行操作。,第77页,目标段 该段是放置程序目标的地方。目标段可以只有一个目标谓词,例如上面的例子中就只有一个目标谓词;也可以含有多个目标谓词,如: goal readint(X),Y=X+3,write(Y=,Y). 就有三个目标谓词。这种目标称为复合目标。 另外,一般称程序目标段中的目标为内部目标,而称在程序运行时临时给出的目标为外部目标。,第78页,2.4.2 Turbo PROLOG的数据与表达式 1.领域 1)标准领域 Turbo PROLOG中不定义变量的类型,只说明谓词中各个项的取值域。 2)结构 结构也称复合对象,它是TurboPROLOG谓词中的一种特殊的参量项(类似于谓词逻辑中的函数)。,第79页,结构的一般形式为 () 其中函子及参量的标识符与谓词相同。注意,这意味着结构中还可包含结构。所以,复合对象可表达树形数据结构。例如下面的谓词 likes(Tom,sports(football,basketball,table-tennis). 中的 sports(football,basketball,table-tennis) 就是一个结构,即复合对象。,第80页,又如: person(张华,student(西安石油学院),address(中国,陕西,西安). reading(王宏,book(人工智能技术基础教程,西安电子科技大学出版社). friend(father(Li),father(Zhao). 这几个谓词中都有复合对象。,第81页,复合对象在程序中的说明,需分层进行。例如,对于上面的谓词 likes(Tom,sports(football,basketball,table-tennis). 在程序中可说明如下: domains name=symbol sy=symbol sp=sports(sy,sy,sy) predicates likes(name,sp),第82页,3) 表 表的一般形式是 x1,x2,xn 其中xi(i=1,2,n)为PROLOG的项,一般要求同一个表的元素必须属于同一领域。 不含任何元素的表称为空表,记为。例如下面就是一些合法的表。,第83页,1,2,3 apple,orange,banana,grape,cane PROLOG,MAENS,PROGRAMMING,in logic a,b,c,d,e 表的最大特点是其元素个数可在程序运行期间动态变化。表的元素也可以是结构或表,且这时其元素可以属于不同领域。,第84页,例如: name(Li Ming),age(20),sex(male),address(xi an) 1,2,3,4,5,6,7 都是合法的表。后一个例子说明,表也可以嵌套。 实际上,表是一种特殊的结构。它是递归结构的另一种表达形式。这个结构的函数名取决于具体的PROLOG版本。这里我们就用一个圆点来表示。,第85页,下面就是一些这样的结构及它们的表表示形式:结构形式 表形式(a,) a(a,(b,) a,b(a,(b,(c,) a,b,c,第86页,表的说明方法是在其组成元素的说明符后加一个星号*。如: domains lists=string* predicates pl(lists) 就说明谓词pl中的项lists是一个由串string组成的表。,第87页,对于由结构组成的表,至少得分三步说明。例如对于下面谓词p中的表 p(name(Liming),age(20) 则需这样说明: domains rec=seg* seg=name(string);age(integer) predicates p(rec),第88页,2. 常量与变量 由上面的领域可知,Turbo PROLOG的常量有整数、实数、字符、串、符号、结构、表和文件这八种数据类型。同理,Turbo PROLOG的变量也就有这八种取值。另外,变量名要求必须是以大写字母或下划线开头的字母、数字和下划线序列,或者只有一个下划线。这后一种变量称为无名变量。,第89页,3. 算术表达式 Turbo PROLOG提供了五种最基本的算术运算:加、减、乘、除和取模,相应运算符号为+、-、*、/、mod。这五种运算的顺序为:*、/、mod优先于+、-。同级从左到右按顺序运算,括号优先。算术表达式的形式与数学中的形式基本一样。例如: 数学中的算术表达式 PROLOG中的算术表达式 x+y z X+Y*Z ab-c/d A*B-C/D u mod v U mod V(表示求U除 以V所得的余数),第90页,即是说,Turbo PROLOG中算术表达式采用通常数学中使用的中缀形式。这种算术表达式为PROLOG的一种异体结构,若以PROLOG的结构形式来表示,则它们应为 +(X,*(Y,Z) -(*(A,B),/(C,D) mod(U,V) 所以,运算符+、-、*、/和mod实际也就是PROLOG内部定义好了的函数符。,第91页,在Turbo PROLOG程序中,如果一个算术表达式中的变元全部被实例化(即被约束)的话,则这个算术表达式的值就会被求出。求出的值可用来实例化某变量,也可用来同其他数量进行比较,用一个算术表达式的值实例化一个变量的方法是用谓词“is”或“=”来实现。例如: Y is X+5 或 Y=X+5 (*),第92页,就使变量Y实例化为X+5的值(当然X也必须经已被某值实例化),可以看出,这里对变量Y的实例化方法类似于其他高级程序语言中的“赋值”,但又不同于赋值。例如,在PROLOG中下面的式子是错误的: X=X+1,第93页,4. 关系表达式 Turbo PROLOG提供了六种常用的关系运算,即小于、小于或等于、等于、大于、大于或等于和不等于,其运算符依次为 ,=, Turbo PROLOG的关系表达式的形式和数学中的也基本一样,例如: 数学中的关系式 Turbo PROLOG中的关系式 X+1Y X+1=Y XY XY,第94页,即是说,Turbo PROLOG中的关系式也用中缀形式。当然,这种关系式为Turbo PROLOG中的异体原子。若按Turbo PROLOG中的原子形式来表示,则上面的两个例子为 =(X+1,Y)和(X,Y) 所以上述六种关系运算符,实际上也就是Turbo PROLOG内部定义好了的六个谓词。这六个关系运算符可用来比较两个算术表达式的大小。,第95页,所以上述六种关系运算符,实际上也就是Turbo PROLOG内部定义好了的六个谓词。这六个关系运算符可用来比较两个算术表达式的大小。例如: brother(Name1,Name2):-person(Name1,man,Age1), person(Name2,man,Age2), mother(Z,Name1),mother(Z,Name2), Age1Age2. 需要说明的是,“=”的用法比较特殊,它既可以表示比较,也可以表示约束值,即使在同一个规则中的同一个“=”也是如此。,第96页,例如: p(X,Y,Z):-Z=X+Y. 当变量X、Y、Z全部被实例化时,“=”就是比较符。如:对于问题 Goal:p(3,5,8). 机器回答:yes。而对于 Goal:p(3,5,7). 机器回答:no。 即这时机器把X+Y的值,与Z的值进行比较。,第97页,但当X,Y被实例化,为Z未被实例化时,“=”号就是约束符。如: Goal:p(3,5,Z).机器回答:Z=8这时,机器使Z实例化为X+Y的结果。,第98页,2.4.3 输入与输出 虽然PROLOG能自动输出目标子句中的变量的值,但这种输出功能必定有限,往往不能满足实际需要;另一方面,对通常大多数的程序来说,运行时从键盘上输入有关数据或信息也是必不可少的。为此每种具体PROLOG一般都提供专门的输入和输出谓词,供用户直接调用。例如,下面就是TorboPROLOG的几种输入输出谓词:,第99页,(1) readln (X)。 这个谓词的功能是从键盘上读取一个字符串,然后约束给变量X。 (2) readint (X)。 这个谓词的功能是从键盘上读取一个整数,然后约束给变量X,如果键盘上打入的不是整数则该谓词失败。 (3) readreal (X)。 这个谓词的功能是从键盘上读取一个实数,然后约束给变量X,如果键盘上打入的不是实数则该谓词失败。,第100页,(4) readchar(X)。 这个谓词的功能是从键盘上读取一个字符,然后约束给变量X,如果键盘上打入的不是单个字符,则该谓词失败。 (5) write(X1,X2,Xn)。 这个谓词的功能是把项Xi(i=1,2,n)的值显示在屏幕上或者打印在纸上,当有某个Xi未实例化时,该谓词失败,其中的Xi可以是变量,也可以是字符串或数字。,第101页,(6) nl换行谓词。它使后面的输出(如果有的话)另起一行。另外,利用write的输出项n也同样可起换行作用。例如: write(name), n l ,write(age) 与 write(name,n,age) 的效果完全一样。,第102页,例2.4用上面的输入输出谓词编写一个简单的学生成绩数据库查询程序。 PREDICATES student(integer,string,real) grade GOAL grade. CLAUSES,第103页,student(1,张三,90.2).student(2,李

    注意事项

    本文(第2章 人工智能程序设计语言课件.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开