第2章人工智能程序设计语言课件.ppt
《第2章人工智能程序设计语言课件.ppt》由会员分享,可在线阅读,更多相关《第2章人工智能程序设计语言课件.ppt(150页珍藏版)》请在三一办公上搜索。
1、第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(
2、PROgramminginLOGic的缩写)。PROLOG语言首先由法国马塞大学的Colmerauer和它的研究小组于1972年研制成功,后来在欧洲得到进一步发展。特别是1981年日本宣布要以PROLOG作为他们正在研制的新一代计算机智能计算机的核心语言,更使PROLOG举世瞩目,迅速风靡世界。,第4页,PROLOG语言是以Horn子句逻辑为基础的程序设计语言,它是目前最具代表性的一种逻辑程序设计语言。早期PROLOG版本都是解释型的,1986年美国的Borland公司推出了编译型PROLOG-TurboPROLOG,并很快成为PC机上流行的PROLOG。现在运行在Windows环境下的可视化
3、编程语言VisualPROLOG也已面世。但这些PROLOG语言版本属顺序逻辑程序设计语言。,第5页,2.1.3 面向对象语言 20世纪80年代以来,面向对象程序设计(ObjectOrientedProgramming,简称OOP)异军突起,发展迅速,如今已日渐成熟,并越来越流行起来。面向对象程序以其信息隐蔽、封装、继承、多态、消息传递等一系列优良机制,大大改善了软件的复杂性、模块性、重用性和可维护性,有望从根本上解决软件的生产效率问题。另一方面,由于面向对象程序设计的类、对象、继承等概念,与人工智能特别是知识表示和知识库产生了天然的联系。,第6页,因而,现在面向对象程序设计语言也成为一种人工
4、智能程序设计语言,面向对象程序设计也被广泛引入人工智能程序设计,特别是知识工程、专家系统程序设计。面向对象程序设计语言也种类繁多,已发展成为一个大家族。其中最纯正、最具面向对象风格的语言当推Smalltalk,而最流行的OOP语言是C+,Java则是适于网络(Internet)环境的一种面向对象语言。,第7页,2.1.4 混合型语言 以上三种语言都各有所长,但也都有其不足之处。为了扬长避短,于是便出现了基于这三种语言的混合型语言。 1. 函数型与逻辑型相结合的语言 函数型与逻辑型语言的结合方式有耦合型和统一型两类。统一型又可分为具有归结语义的函数型语言和集成式语言两个子类。,第8页,2. 函数
5、型与面向对象相结合的语言 在LISP语言的基础上再扩充面向对象机制而产生的语言,称为函数型的面向对象程序设计语言(亦称为面向对象的LISP)。 3. 逻辑型与面向对象相结合的语言,第9页,2.2 函数型程序设计语言LISP,LISP语言的主要特点是: (1) LISP程序由一组函数组成,程序的执行过程是函数的调用过程。 (2) 程序和数据在形式上是相同的,即都是符号表达式,简称为S表达式。 (3) 递归是LISP语言的主要控制结构。 (4) 程序以交互方式运行。,第10页,2.2.1 LISP的程序结构与运行机制 LISP的程序一般由函数的定义和函数的调用两部分组成。其一般格式为: (DEFU
6、N() (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)(HANOIab
7、c3),第13页,2.2.2 S表达式 从语法上看,LISP程序的基本单位是S表达式。S表达式又可分为原子和表两大类。 原子(atom)是由字母和数字组成的字符串,是S表达式的最简单情况。原子又可分为文字原子、串原子和数字原子三种。 文字原子又称符号(symbol),是以字母开头的字母数字串,用来表示常量、变量和函数的名字等。例如:ABC、X1等。,第14页,串原子是由双引号括起来的一串字符。如LISP Program。 数字原子由数字串组成。在其前面可以有符号“-”或“+”,中间可出现“.”,用来表示整数和实数。例如:256、-66、3.14159等。,第15页,S表达式可以递归定义如下:
8、(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表达式。二者的关
9、系由下面的例子说明。,第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的主要特色,表处理的函数也很多,下面仅给出最常用的几个。,第2
10、0页,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),第
11、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.
12、求值与赋值函数 在上面的函数中多次出现撇号,它的意思是禁止求值。为什么要禁止求值呢?原来,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. 谓
13、词函数 返回值为逻辑值真或假的函数称为谓词函数,简称谓词。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);
14、 返回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真
15、为止,然后将对应的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编程解决实际问题,仅有基本函数还是不够的,用户还必须根据问题的需要,利
16、用基本函数自定义所需的函数。 自定义函数的格式为: (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!是递归
17、定义的。 需说明的是,一个函数是否能递归定义,要取决于以下两条: (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) (LIS
18、T 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)
19、(*,(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
20、。其中COMMONLISP将成为一种标准,以统一各种LISP方言。,第43页,2.3 逻辑型程序设计语言PROLOG,2.3.1 PROLOG的语句 PROLOG语言只有三种语句,分别称为事实、规则和问题。 1.事实(fact) 格式(). 其中谓词名是以小写英文字母打头的字母、数字、下划线等组成的字符串,项表是以逗号隔开的项序列。,第44页,PROLOG中的项包括由常量或变量表示的简单对象以及函数、结构和表等,即事实的形式是一个原子谓词公式。 例如: student(john). like( mary ,music). 就是PROLOG中的两个合法事实。,第45页,功能 一般表示对象的性质或
21、关系。 例如上面的两个事实就分别表示“约翰是学生”和“玛丽喜欢音乐”。 作为特殊情形,一个事实也可以只有谓词名而无参量。 例如: abc. repeat. 等也是允许的。,第46页,2. 规则(rule) 格式():-(),(). 其中“:-”号表示“if”(也可以直接写为if),其左部的谓词是规则的结论(亦称为头),右部的谓词是规则的前提(亦称为体),表示零次或多次重复,逗号表示and(逻辑与),即规则的形式是一个逻辑蕴含式。,第47页,例如: bird(X):-animal(X),has(X,feather). grandfather(X,Y):-father(X,Z),father(Z,
22、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). 就是两个合法的问题。 功能 问题表示用户的询问,它就是程序运行的目
23、标。,第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页,可以看出,这个程序中有四条事实、
24、两条规则和一个问题。其中事实、规则和问题都分行书写。规则和事实可连续排列在一起,其顺序可随意安排,但同一谓词名的事实或规则必须集中排列在一起。问题不能与规则及事实排在一起,它作为程序的目标要么单独列出,要么在程序运行时临时给出。,第52页,这个程序的事实描述了一些对象(包括人和事物)间的关系;而规则则描述了john交朋友的条件,即如果一个人喜欢读书并且喜欢音乐(或者喜欢运动和喜欢音乐),则这个人就是john的朋友(当然,这个规则也可看作是john朋友的定义);程序中的问题是“约翰的朋友是谁?” 当然,PROLOG程序中的目标可以变化,也可以含有多个语句(上例中只有一个)。如果有多个语句,则这些
25、语句称为子目标。例如对上面的程序,其问题也可以是,第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程序的运行是从目标
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 程序设计语言 课件
链接地址:https://www.31ppt.com/p-1824839.html