1 / 111

第二章 人工智能程序设计语言

第二章 人工智能程序设计语言. 目录. 2 .1 综述 2.2 函数型程序设计语言 LISP 2.3 逻辑型程序设计语言 PROLOG 2.4Turbo PROLOG 程序设计. 2.1 综述 ( 1 ). 人工智能解决的问题 人工智能解决的问题是实现对脑功能的模拟和再现,人工智能程序要面向问题、面向逻辑,要能支持知识表示,能描述逻辑关系和抽象概念,其处理对象更多是知识,或者说是符号。 第一个程序设计语言 1960 年美国麦卡锡和他的研究小组设计实现 LISP ( LISt Processing ),是一种表处理语言。. 2.1 综述. 函数型语言 逻辑型语言

lilika
Download Presentation

第二章 人工智能程序设计语言

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第二章 人工智能程序设计语言

  2. 目录 • 2.1综述 • 2.2函数型程序设计语言LISP • 2.3逻辑型程序设计语言PROLOG • 2.4Turbo PROLOG程序设计

  3. 2.1综述(1) • 人工智能解决的问题 人工智能解决的问题是实现对脑功能的模拟和再现,人工智能程序要面向问题、面向逻辑,要能支持知识表示,能描述逻辑关系和抽象概念,其处理对象更多是知识,或者说是符号。 • 第一个程序设计语言 1960年美国麦卡锡和他的研究小组设计实现LISP(LISt Processing),是一种表处理语言。

  4. 2.1综述 • 函数型语言 • 逻辑型语言 • 面向对象语言 • 混合型语言

  5. 2.1.1函数型语言 • 典型代表LISP • LISP程序由一组函数组成,程序的执行过程就是一系列的函数调用和求值过程。 • 纯函数型程序设计语言FP

  6. 2.1.2逻辑型语言 • 典型代表PROLOG(PROgramming in LOGic) • PROLOG程序是陈述性语言,不需要告诉计算机“怎么做”,只需要告诉计算机“做什么”。 • PROLOG语言是以Horn子句逻辑为基础的程序设计语言,是目前最具代表性的一种逻辑程序设计语言。 • PARLOG、Concurrent PROLOG、GHC

  7. 2.1.3面向对象语言 • 面向对象语言信息隐蔽、封装、继承、多态、消息传递,改善了软件的复杂性、模块性、重用性和可维护性。 • 面向对象程序设计的类、对象、继承等概念与人工智能的知识表示和知识库联系紧密。 • Smalltalk、C++、Java

  8. 2.1.4混合型语言(1) • 函数型与逻辑型相结合 • 耦合型 • LOGLISP。在LISP的基础上增加了表达合一、回溯机制的系统函数。 • FUNLOG。在PROLOG的基础上怎家了函数定义机制,系统以归结语义执行PROLOG程序。 • POPLOG。是POP-11、PROLOG、LISP的混合型语言。 • 统一型 • 具有归结语义的函数型语言 • 集成式语言(LEAF、APPLOG)

  9. 2.1.4混合型语言(2) • 函数型与面向对象相结合的语言 • Flavors • LOOPS • CommonLoops • CLOS • CommonObjects • OBJ2

  10. 2.1.4混合型语言(3) • 逻辑型与面向对象相结合的语言 • SPOOL • Orient 84k • Vulan

  11. 2.2函数型程序设计语言LISP(1) • LISP的特点 • LISP程序由一组函数组成,程序的执行过程时函数的调用过程。 • 程序和数据在形式上是相同的,都是符号表达式,简称为S-表达式。 • 递归是LISP语言的主要控制结构,适于过程描述和问题求解。 • 程序以交互形式运行,便于开发各类程序。

  12. 2.2函数型程序设计语言LISP(2) • LISP的程序结构与运行机制 • S-表达式 • 基本函数 • 自定义函数 • 程序举例

  13. 2.2.1LISP的程序结构与运行机制(1) • LISP程序结构 • 函数的定义 (DEFUN(<函数名>(<形参表>)<函数名>) (<函数名>(<形参表>)<函数名>) … (<函数名>(<形参表>)<函数名>) (<函数名> <实参表>) … (<函数名> <实参表> ) • 函数的调用

  14. 2.2.1LISP的程序结构与运行机制(2) • LISP程序 (DUFUN HANOI(a b c n) (COND((=n 1)(MOVE_DISK a c)) (T (HANOI a c b (- n 1)) (MOVE-DISK a c) (HANOI b a c(- n 1)))) (DEFUN MOVE-DISK(from to) (TERPRI) (PRINC”Movie Disk From”) (PRINC from) (PRINC “To”) (PRINC to)) (HONOI ‘a ‘b ‘c 3)

  15. 2.2.2S-表达式(1) • 原子 • 文字原子 由字母和数字组成得字符串,是S-表达式得最简单的情况,用来表示常量、变量和函数的名字等。 • 串原子 由双引号括起来的一串字符。 • 数字原子 数字串组成。 • S-表达式的定义 • 原子是s-表达式。 • 若S1和S2是S-表达式,则(S1•S2)是S-表达式。

  16. 2.2.2 S-表达式(2) • 表 • 表是LISP语言中最常用的数据类型,也是主要的处理对象。 • 表由圆括号括起来得由空格分开的若干元素的集合。 • 表的一般形式为: (<S-表达式>< S-表达式>…< S-表达式>) • 表是一种特殊的S-表达式 (A ) (A•NIL) (A B) (A • (B•NIL)) (A B C) (A • B •(C•NIL)) (A B C D) (A • B •C(D•NIL))

  17. 2.2.3 基本函数(1) • 表处理函数 • CAR函数 • 格式 (CAR<表>) • 功能 取出表中的表头。 • CDR函数 • 格式 (CDR<表>) • 功能 取出表中的表尾。 • CONS函数 • 格式 (CONS<S-表达式><表>) • 功能 将S-表达式作为一个元素加到表中去, 并作为所构成新表中的第一个元素。

  18. 2.2.3 基本函数(2) • APPEND函数 • 格式 (APPEND<表1> <表2>…… <表n> ) • 功能 将n个表中的元素合并成一个新表。 • LIST函数 • 格式 (LIST<S-表达式1> <S-表达式1> <S-表 达式1> ) • 功能 将n个表中的元素合并成一个新表。

  19. 2.2.3 基本函数(3) • 算术函数 LISP的算术表达式也是用函数表示,称为算术函数。 • 求值与赋值函数 • SET • 格式 (SET<变量><S-表达式>) • 功能 把S-表达式赋给变量。 • SETQ • SETF(COMMON LISP)

  20. 2.2.3 基本函数(4) • 谓词函数 • 原子谓词ATOM • 格式 (ATOM<参数>) • 功能 检测其参数是否为原子,是则返回T,否则返回NIL。 • 相等谓词EQUAL • 格式 (EQUAL<参数><参数>) • 功能 判断两个参数是否逻辑相等。 • 判空表函数NULL • 格式 (NULL<参数>) • 功能 判断参数是否为空表,是则返回T,否则返回NIL

  21. 2.2.3 基本函数(5) • 条件函数 • 格式 (COND(P1e1) (P2e2) …… (Pnen) • 功能控制程序流程

  22. 2.2.4 自定义函数(1) • 自定义函数的格式为: (DEFUN<函数名>(<形参表>) <函数体>) • 函数体,是用户自定义的函数或LISP基本函数的某种组合。 • 一般来讲,LISP自定义函数就是由其基本函数组合而成的。常用的组合方法有复合、分支、递归、迭代等。其中最具特色的构造方法是递归。

  23. 2.2.4 自定义函数(2) 例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))))))

  24. 2.2.4 自定义函数(3) • 一个函数是否能递归定义,要取决于以下两条: • 函数的求值存在最简的情形,在这种情形下函数值是显然的或已知的; • 该函数对于其参数的求值,可以归结为对另一些参数的求值,而且后者比前者更容易求值,即使问题朝最简情形逼近了一步。

  25. 2.2.5 程序举例(1) 例2.2 符号微分程序。 这里是指数学上的一元函数求导。 我们用D(ex)表示数学上的de/dx, 这里e为需求导的函数表达式, x为自变量。程序如下: (DEFUN D(ex) (COND((ATOM e)(IF(Eq e x)1 0)) (T(APPLY(D-RULE(CAR e)) (APPEND(CDR e)) (LIST x)))))

  26. 2.2.5 程序举例(2) • D-RULE是一个获取给定操作符的微分规则的 LISP函数。微分规则的存放,是通过为相应操作符建立d特性的方法完成的。D-RULE的定义为 (DEFUN D-RULE(operator) (GET operator′d)) • 其中操作符d的特性值需事先用SETF函数建立好。例如对于操作符加+和乘·,在数学上有 d(u+v)/dx=du/dx+dv/dx d(u·v)/dx=v·du/dx+u·dv/dx 

  27. 2.2.5 程序举例(3) 用LISP表示就是 (SETF(GET′+′D)′(LAMBDA(u v x)′(+,(Dux),(D v x)))) (SETF(GET′*′D)′(LAMBDA(u v x)′(+(*,(D u x),v)(*,(D v x),u))))) 给出如下的函数调用(D′(+(*2x)(*x x))′x);即求一元函数2x+x2关于x的导函数则得到返回值为 (+(+(* 0 x)(* 1 2))(+(* 1 x)(*1 x))) 即2+2x,结果正确。

  28. 2.3 逻辑型程序设计语言PROLOG • PROLOG的语句 • PROLOG程序 • PROLOG程序的运行机理

  29. 2.3.1PROLOG的语句(1) • 事实 • 格式<谓词名>(<项表>). • 谓词名是以小写英文字母打头的字母、数字、下划线等组成的字符串 • 项表是以逗号隔开的项序列。 • 项包括由常量或变量表示的简单对象以及函数、结构和表。 • 事实的形式是一个原子谓词公式。 • 例如: student(john). like( mary ,music).

  30. 2.3.1PROLOG的语句(2) • 功能 一般表示对象的性质或关系。 • 作为特殊情形,一个事实也可以只有谓词名而无参量。 例如: abc. repeat.

  31. 2.3.1PROLOG的语句(3) • 规则(rule) • 格式<谓词名>(<项表>):-<谓词名>(<项表>){,<谓词名>(<项表>)}. • 其中“:-”号表示“if”(也可以直接写为if), • 其左部的谓词是规则的结论(亦称为头), • 右部的谓词是规则的前提(亦称为体), • {}表示零次或多次重复, • 逗号表示and(逻辑与), • 规则的形式是一个逻辑蕴含式。

  32. 2.3.1PROLOG的语句(4) • 例如: bird(X):-animal(X),has(X,feather). “如果X是动物,并且X有羽毛,则X是鸟” grandfather(X,Y):-father(X,Z),father(Z,Y). “X是Y的祖父,如果存在Z,X是Z的父亲并且Z 又是Y的父亲”。 就是PROLOG的合法规则。 • 功能 一般表示对象间的因果关系、蕴含关系或对应关系。 • 特殊情况规则中的谓词也可以只有谓词名而无参量。

  33. 2.3.1PROLOG的语句(5) • 问题(question) • 格式?-<谓词名>(<项表>){,<谓词名>(<项表>)}. • 例如: ?-student(john). ?-like(mary,X). 就是两个合法的问题。 • 功能 问题表示用户的询问,它就是程序运行的目标。

  34. 2.3.2PROLOG程序(1) • 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).

  35. 2.3.2PROLOG程序(2) • PROLOG程序中的目标可以变化,也可以含有多个语句(上例中只有一个)。如果有多个语句,则这些语句称为子目标。 ?-likes(mary,X). 或 ?-likes(mary,music). 或 ?-friend(X,Y). 或 ?-likes(bell,sports), likes(mary,music), friend(john,X).

  36. 2.3.2PROLOG程序的运行机理(1) • POROLOG程序运行机理是基于归结原理的演绎推理。PROLOG程序的运行是从目标出发,并不断进行匹配、合一、归结,回溯,直到目标被完全满足。 • 自由变量与约束变量 • 无值的变量为自由变量。 • 有值的变量为约束变量。 • 一个变量取了某值就说该变量约束于某值,或者说该变量被某值所约束,或者说该变量被某值实例化了。

  37. 2.3.2PROLOG程序的运行机理(2) • 匹配合一 • 两个谓词可匹配合一,是指两个谓词的名相同,参量项的个数相同,参量类型对应相同,并且对应参量项还满足下列条件之一: • 如果两个都是常量,则必须完全相同。 • 如果两个都是约束变量,则两个约束值必须相同。 • 如果其中一个是常量,一个是约束变量,则约束值与常量必须相同。 • 至少有一个是自由变量。 • 合一操作 • 两个自由变量 • 一个自由变量一个常量

  38. 2.3.2PROLOG程序的运行机理(3) • 例如:下面的两个谓词 pre1("ob1","ob2",Z) pre1("ob1",X,Y) 只有当变量X被约束为"ob2",且Y、Z的约束值相同或者至少有一个是自由变量时,它们才是匹配合一的。

  39. 2.3.2PROLOG程序的运行机理(4) • 回溯, • 回溯就是在程序运行期间,当某一个子目标不能满足(即谓词匹配失败)时,控制就返回到前一个已经满足的子目标(如果存在的话),并撤消其有关变量的约束值,然后再使其重新满足。 • 成功后,再继续满足原子目标。 • 如果失败的子目标前再无子目标,则控制就返回到该子目标的上一级目标(即该子目标谓词所在规则的头部)使它重新匹配。

  40. 2.3.2PROLOG程序的运行机理(5) • 运行过程 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).

  41. 2.3.2PROLOG程序的运行机理(6) • 系统对程序进行扫描,寻找能与目标谓词匹配合一的事实或规则头部。规则 friend(john,X):-likes(X,reading),likes(X,music). 的头部可与目标谓词匹配合一,对原目标的求解就转化为对新目标 likes(X,reading),likes(X,music).的求解。

  42. 2.3.2PROLOG程序的运行机理(7) • 子目标的求解过程与主目标完全一样,也是从头对程序进行扫描,不断进行测试和匹配合一等,直到匹配成功或扫描完整个程序为止。可以看出,对第一个子目标like(X,reading)的求解因无可匹配的事实和规则而立即失败,进而导致规则 friend(john,X):-likes(X,reading),likes(X,music). 的整体失败。于是,刚才的子目标 likes(X,reading)和likes(X,music) 被撤消,系统又回溯到原目标friend(john,X)。

  43. 2.3.2PROLOG程序的运行机理(8) • 系统从该目标刚才的匹配语句处(即第五句)向下继续扫描程序中的子句,试图重新使原目标匹配,结果发现第六条语句的左部,即规则 friend(john,X):-likes(X,sports),likes(X,music). 的头部可与目标为谓词匹配。但由于这个语句又是一个规则,于是,这时对原目标的求解,就又转化为依次对子目标 likes(X,sports)和likes(X,music) 的求解。

  44. 2.3.2PROLOG程序的运行机理(9) • 子目标likes(X,sports)与程序中的事实立即匹配成功,且变量X被约束为bell。于是,系统便接着求解第二个子目标。由于变量X已被约束,所以这时第二个子目标实际上已变成了 likes(bell,music). 由于程序中不存在事实likes(bell,music),所以该目标的求解失败。

  45. 2.3.2PROLOG程序的运行机理(10) • 系统就放弃这个子目标,并使变量X恢复为自由变量,然后回溯到第一个子目标,重新对它进行求解。由于系统已经记住了刚才已同第一子目标谓词匹配过的事实的位置,所以重新求解时,便从下一个事实开始测试。 易见,当测试到程序中第三个事实时,第一个子目标便求解成功,且变量X被约束为mary。这样,第二个子目标也就变成了 likes(mary,music). 再对它进行求解。

  46. 2.3.2PROLOG程序的运行机理(11) • 由于两个子目标都求解成功,所以,原目标friend(john,Y)也成功,且变量Y被约束为mary(由Y与X的合一关系)。于是,系统回答: Y=mary 程序运行结束。

  47. 2.3.2PROLOG程序的运行机理(11) 图2─1 PROLOG程序运行机理示例

  48. 2.3.2PROLOG程序的运行机理(12) • PROLOG程序的执行过程是一个归结演绎的过程。 • 特点是推理方式为反向推理,控制策略是深度优先,且有回溯机制。 • 具体实现为匹配子句的顺序是自上而下;子目标选择顺序是从左向右;(归结后)产生的新子目标总是插入被消去的目标处(即目标队列的左部)。 • PROLOG的这种归结演绎方法被称为SLD(LinearresolutionwithSelectionfunctionforDefiniteclause)归结,或SLD反驳-消解法。 SLD归结也就是所谓的PROLOG语言的过程性语义。

  49. 2.4Turbor PROLOG程序设计 • Turbor PROLOG的程序结构 • Turbor PROLOG的数据与表达式 • 输入与输出 • 分支和循环 • 动态数据库 • 表处理和递归 • 回溯控制 • 程序举例

  50. 2.4.1Turbor PROLOG的程序结构(1) • 一般包括常量段、领域段、数据库段、谓词段、目标段和子句段等六个部分。各段以其相应的关键字constants、domains、database、predicates、goal和clauses开头加以标识。

More Related