1.11k likes | 1.25k Views
第二章 人工智能程序设计语言. 目录. 2 .1 综述 2.2 函数型程序设计语言 LISP 2.3 逻辑型程序设计语言 PROLOG 2.4Turbo PROLOG 程序设计. 2.1 综述 ( 1 ). 人工智能解决的问题 人工智能解决的问题是实现对脑功能的模拟和再现,人工智能程序要面向问题、面向逻辑,要能支持知识表示,能描述逻辑关系和抽象概念,其处理对象更多是知识,或者说是符号。 第一个程序设计语言 1960 年美国麦卡锡和他的研究小组设计实现 LISP ( LISt Processing ),是一种表处理语言。. 2.1 综述. 函数型语言 逻辑型语言
E N D
目录 • 2.1综述 • 2.2函数型程序设计语言LISP • 2.3逻辑型程序设计语言PROLOG • 2.4Turbo PROLOG程序设计
2.1综述(1) • 人工智能解决的问题 人工智能解决的问题是实现对脑功能的模拟和再现,人工智能程序要面向问题、面向逻辑,要能支持知识表示,能描述逻辑关系和抽象概念,其处理对象更多是知识,或者说是符号。 • 第一个程序设计语言 1960年美国麦卡锡和他的研究小组设计实现LISP(LISt Processing),是一种表处理语言。
2.1综述 • 函数型语言 • 逻辑型语言 • 面向对象语言 • 混合型语言
2.1.1函数型语言 • 典型代表LISP • LISP程序由一组函数组成,程序的执行过程就是一系列的函数调用和求值过程。 • 纯函数型程序设计语言FP
2.1.2逻辑型语言 • 典型代表PROLOG(PROgramming in LOGic) • PROLOG程序是陈述性语言,不需要告诉计算机“怎么做”,只需要告诉计算机“做什么”。 • PROLOG语言是以Horn子句逻辑为基础的程序设计语言,是目前最具代表性的一种逻辑程序设计语言。 • PARLOG、Concurrent PROLOG、GHC
2.1.3面向对象语言 • 面向对象语言信息隐蔽、封装、继承、多态、消息传递,改善了软件的复杂性、模块性、重用性和可维护性。 • 面向对象程序设计的类、对象、继承等概念与人工智能的知识表示和知识库联系紧密。 • Smalltalk、C++、Java
2.1.4混合型语言(1) • 函数型与逻辑型相结合 • 耦合型 • LOGLISP。在LISP的基础上增加了表达合一、回溯机制的系统函数。 • FUNLOG。在PROLOG的基础上怎家了函数定义机制,系统以归结语义执行PROLOG程序。 • POPLOG。是POP-11、PROLOG、LISP的混合型语言。 • 统一型 • 具有归结语义的函数型语言 • 集成式语言(LEAF、APPLOG)
2.1.4混合型语言(2) • 函数型与面向对象相结合的语言 • Flavors • LOOPS • CommonLoops • CLOS • CommonObjects • OBJ2
2.1.4混合型语言(3) • 逻辑型与面向对象相结合的语言 • SPOOL • Orient 84k • Vulan
2.2函数型程序设计语言LISP(1) • LISP的特点 • LISP程序由一组函数组成,程序的执行过程时函数的调用过程。 • 程序和数据在形式上是相同的,都是符号表达式,简称为S-表达式。 • 递归是LISP语言的主要控制结构,适于过程描述和问题求解。 • 程序以交互形式运行,便于开发各类程序。
2.2函数型程序设计语言LISP(2) • LISP的程序结构与运行机制 • S-表达式 • 基本函数 • 自定义函数 • 程序举例
2.2.1LISP的程序结构与运行机制(1) • LISP程序结构 • 函数的定义 (DEFUN(<函数名>(<形参表>)<函数名>) (<函数名>(<形参表>)<函数名>) … (<函数名>(<形参表>)<函数名>) (<函数名> <实参表>) … (<函数名> <实参表> ) • 函数的调用
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)
2.2.2S-表达式(1) • 原子 • 文字原子 由字母和数字组成得字符串,是S-表达式得最简单的情况,用来表示常量、变量和函数的名字等。 • 串原子 由双引号括起来的一串字符。 • 数字原子 数字串组成。 • S-表达式的定义 • 原子是s-表达式。 • 若S1和S2是S-表达式,则(S1•S2)是S-表达式。
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))
2.2.3 基本函数(1) • 表处理函数 • CAR函数 • 格式 (CAR<表>) • 功能 取出表中的表头。 • CDR函数 • 格式 (CDR<表>) • 功能 取出表中的表尾。 • CONS函数 • 格式 (CONS<S-表达式><表>) • 功能 将S-表达式作为一个元素加到表中去, 并作为所构成新表中的第一个元素。
2.2.3 基本函数(2) • APPEND函数 • 格式 (APPEND<表1> <表2>…… <表n> ) • 功能 将n个表中的元素合并成一个新表。 • LIST函数 • 格式 (LIST<S-表达式1> <S-表达式1> <S-表 达式1> ) • 功能 将n个表中的元素合并成一个新表。
2.2.3 基本函数(3) • 算术函数 LISP的算术表达式也是用函数表示,称为算术函数。 • 求值与赋值函数 • SET • 格式 (SET<变量><S-表达式>) • 功能 把S-表达式赋给变量。 • SETQ • SETF(COMMON LISP)
2.2.3 基本函数(4) • 谓词函数 • 原子谓词ATOM • 格式 (ATOM<参数>) • 功能 检测其参数是否为原子,是则返回T,否则返回NIL。 • 相等谓词EQUAL • 格式 (EQUAL<参数><参数>) • 功能 判断两个参数是否逻辑相等。 • 判空表函数NULL • 格式 (NULL<参数>) • 功能 判断参数是否为空表,是则返回T,否则返回NIL
2.2.3 基本函数(5) • 条件函数 • 格式 (COND(P1e1) (P2e2) …… (Pnen) • 功能控制程序流程
2.2.4 自定义函数(1) • 自定义函数的格式为: (DEFUN<函数名>(<形参表>) <函数体>) • 函数体,是用户自定义的函数或LISP基本函数的某种组合。 • 一般来讲,LISP自定义函数就是由其基本函数组合而成的。常用的组合方法有复合、分支、递归、迭代等。其中最具特色的构造方法是递归。
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))))))
2.2.4 自定义函数(3) • 一个函数是否能递归定义,要取决于以下两条: • 函数的求值存在最简的情形,在这种情形下函数值是显然的或已知的; • 该函数对于其参数的求值,可以归结为对另一些参数的求值,而且后者比前者更容易求值,即使问题朝最简情形逼近了一步。
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)))))
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
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+x2关于x的导函数则得到返回值为 (+(+(* 0 x)(* 1 2))(+(* 1 x)(*1 x))) 即2+2x,结果正确。
2.3 逻辑型程序设计语言PROLOG • PROLOG的语句 • PROLOG程序 • PROLOG程序的运行机理
2.3.1PROLOG的语句(1) • 事实 • 格式<谓词名>(<项表>). • 谓词名是以小写英文字母打头的字母、数字、下划线等组成的字符串 • 项表是以逗号隔开的项序列。 • 项包括由常量或变量表示的简单对象以及函数、结构和表。 • 事实的形式是一个原子谓词公式。 • 例如: student(john). like( mary ,music).
2.3.1PROLOG的语句(2) • 功能 一般表示对象的性质或关系。 • 作为特殊情形,一个事实也可以只有谓词名而无参量。 例如: abc. repeat.
2.3.1PROLOG的语句(3) • 规则(rule) • 格式<谓词名>(<项表>):-<谓词名>(<项表>){,<谓词名>(<项表>)}. • 其中“:-”号表示“if”(也可以直接写为if), • 其左部的谓词是规则的结论(亦称为头), • 右部的谓词是规则的前提(亦称为体), • {}表示零次或多次重复, • 逗号表示and(逻辑与), • 规则的形式是一个逻辑蕴含式。
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的合法规则。 • 功能 一般表示对象间的因果关系、蕴含关系或对应关系。 • 特殊情况规则中的谓词也可以只有谓词名而无参量。
2.3.1PROLOG的语句(5) • 问题(question) • 格式?-<谓词名>(<项表>){,<谓词名>(<项表>)}. • 例如: ?-student(john). ?-like(mary,X). 就是两个合法的问题。 • 功能 问题表示用户的询问,它就是程序运行的目标。
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).
2.3.2PROLOG程序(2) • PROLOG程序中的目标可以变化,也可以含有多个语句(上例中只有一个)。如果有多个语句,则这些语句称为子目标。 ?-likes(mary,X). 或 ?-likes(mary,music). 或 ?-friend(X,Y). 或 ?-likes(bell,sports), likes(mary,music), friend(john,X).
2.3.2PROLOG程序的运行机理(1) • POROLOG程序运行机理是基于归结原理的演绎推理。PROLOG程序的运行是从目标出发,并不断进行匹配、合一、归结,回溯,直到目标被完全满足。 • 自由变量与约束变量 • 无值的变量为自由变量。 • 有值的变量为约束变量。 • 一个变量取了某值就说该变量约束于某值,或者说该变量被某值所约束,或者说该变量被某值实例化了。
2.3.2PROLOG程序的运行机理(2) • 匹配合一 • 两个谓词可匹配合一,是指两个谓词的名相同,参量项的个数相同,参量类型对应相同,并且对应参量项还满足下列条件之一: • 如果两个都是常量,则必须完全相同。 • 如果两个都是约束变量,则两个约束值必须相同。 • 如果其中一个是常量,一个是约束变量,则约束值与常量必须相同。 • 至少有一个是自由变量。 • 合一操作 • 两个自由变量 • 一个自由变量一个常量
2.3.2PROLOG程序的运行机理(3) • 例如:下面的两个谓词 pre1("ob1","ob2",Z) pre1("ob1",X,Y) 只有当变量X被约束为"ob2",且Y、Z的约束值相同或者至少有一个是自由变量时,它们才是匹配合一的。
2.3.2PROLOG程序的运行机理(4) • 回溯, • 回溯就是在程序运行期间,当某一个子目标不能满足(即谓词匹配失败)时,控制就返回到前一个已经满足的子目标(如果存在的话),并撤消其有关变量的约束值,然后再使其重新满足。 • 成功后,再继续满足原子目标。 • 如果失败的子目标前再无子目标,则控制就返回到该子目标的上一级目标(即该子目标谓词所在规则的头部)使它重新匹配。
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).
2.3.2PROLOG程序的运行机理(6) • 系统对程序进行扫描,寻找能与目标谓词匹配合一的事实或规则头部。规则 friend(john,X):-likes(X,reading),likes(X,music). 的头部可与目标谓词匹配合一,对原目标的求解就转化为对新目标 likes(X,reading),likes(X,music).的求解。
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)。
2.3.2PROLOG程序的运行机理(8) • 系统从该目标刚才的匹配语句处(即第五句)向下继续扫描程序中的子句,试图重新使原目标匹配,结果发现第六条语句的左部,即规则 friend(john,X):-likes(X,sports),likes(X,music). 的头部可与目标为谓词匹配。但由于这个语句又是一个规则,于是,这时对原目标的求解,就又转化为依次对子目标 likes(X,sports)和likes(X,music) 的求解。
2.3.2PROLOG程序的运行机理(9) • 子目标likes(X,sports)与程序中的事实立即匹配成功,且变量X被约束为bell。于是,系统便接着求解第二个子目标。由于变量X已被约束,所以这时第二个子目标实际上已变成了 likes(bell,music). 由于程序中不存在事实likes(bell,music),所以该目标的求解失败。
2.3.2PROLOG程序的运行机理(10) • 系统就放弃这个子目标,并使变量X恢复为自由变量,然后回溯到第一个子目标,重新对它进行求解。由于系统已经记住了刚才已同第一子目标谓词匹配过的事实的位置,所以重新求解时,便从下一个事实开始测试。 易见,当测试到程序中第三个事实时,第一个子目标便求解成功,且变量X被约束为mary。这样,第二个子目标也就变成了 likes(mary,music). 再对它进行求解。
2.3.2PROLOG程序的运行机理(11) • 由于两个子目标都求解成功,所以,原目标friend(john,Y)也成功,且变量Y被约束为mary(由Y与X的合一关系)。于是,系统回答: Y=mary 程序运行结束。
2.3.2PROLOG程序的运行机理(11) 图2─1 PROLOG程序运行机理示例
2.3.2PROLOG程序的运行机理(12) • PROLOG程序的执行过程是一个归结演绎的过程。 • 特点是推理方式为反向推理,控制策略是深度优先,且有回溯机制。 • 具体实现为匹配子句的顺序是自上而下;子目标选择顺序是从左向右;(归结后)产生的新子目标总是插入被消去的目标处(即目标队列的左部)。 • PROLOG的这种归结演绎方法被称为SLD(LinearresolutionwithSelectionfunctionforDefiniteclause)归结,或SLD反驳-消解法。 SLD归结也就是所谓的PROLOG语言的过程性语义。
2.4Turbor PROLOG程序设计 • Turbor PROLOG的程序结构 • Turbor PROLOG的数据与表达式 • 输入与输出 • 分支和循环 • 动态数据库 • 表处理和递归 • 回溯控制 • 程序举例
2.4.1Turbor PROLOG的程序结构(1) • 一般包括常量段、领域段、数据库段、谓词段、目标段和子句段等六个部分。各段以其相应的关键字constants、domains、database、predicates、goal和clauses开头加以标识。