人工智能实验一指导
- 格式:doc
- 大小:91.50 KB
- 文档页数:7
实验1: Prolog语言程序设计
人工智能(AI)语言是一类适应于人工智能和知识工程领域的、具有符号处理和逻辑推理能力的计算机程序设计语言。能够用它来编写求解非数值计算、知识处理、推理、规划、决策等具有智能的各种复杂问题。
Prolog是当代最有影响的人工智能语言之一,由于该语言很适合表达人的思维和推理规则,在自然语言理解、机器定理证明、专家系统等方面得到了广泛的应用,已经成为人工智能应用领域的强有力的开发语言。
尽管Prolog语言有许多版本,但它们的核心部分都是一样的。Prolog的基本语句仅有三种,即事实、规则和目标三种类型的语句,且都用谓词表示,因而程序逻辑性强,方法简捷,清晰易懂。另一方面,Prolog是陈述性语言,一旦给它提交必要的事实和规则之后,Prolog就使用内部的演绎推理机制自动求解程序给定的目标,而不需要在程序中列出详细的求解步骤。
一、实验目的
1、加深学生对逻辑程序运行机理的理解。
2、掌握Prolog语言的特点、熟悉其编程环境。
3、为今后人工智能程序设计做好准备。
二、实验内容
1、编写一个描述亲属关系的Prolog程序,然后再给予出一些事实数据,建立一个小型演绎数据库。
提示:可以以父亲和母亲为基本关系(作为基本谓词),再由此来描述祖父、祖母、兄弟、姐妹以及其他所属关系。
2、编写一个路径查询程序,使其能输出图中所有路径。
提示:程序中的事实描述了下面的有向图,规则是图中两节点间通路的定义。
e
3、一个雇主在发出招聘广告之后,收到了大量的应聘申请。为了从中筛选出不量的候选人,该雇主采用下列判据:申请者必须会打字、开车,并且住在伦敦。
(a)用Prolog规则表述这个雇主的选择准则。
(b)用Prolog事实描述下列申请者的情况:
史密斯住在剑桥,会开车但不会打字。
布朗住在伦敦,会开车也会打字。
简住在格拉斯哥,不会开车但会打字。
埃文斯住在伦敦,会开车也会打字。
格林住在卢顿,会开车也会打字。
(c)要求Prolog提供一个候选人名单。
4、实现递归谓词remove(X,Y,Z),它用于从表Y中除去所有整型数X的倍数值后得到新表Z。例如,对于询问
remove(2,[3,4,5,6,7,8,9,10],Z).
的回答为:
Z=[3,5,7,9]
三、实验建议
1、首先运行Prolog安装目录中PROGRAM目录下的示例程序,对Prolog功能有一个感性认识。
(1)HANOI.PRO
实现汉诺塔演示的程序。
程序运行界面如图所示。
可以修改程序运行目标
GOAL hanoi(10)
把hanoi(10),改为hanoi(6),hanoi(3)等,查看程序运行结果。
(2)FWGC.PRO
农夫过河问题,程序执行界面如图所示。
四、Prolog 相关知识介绍
1、Prolog 环境
注:(1)使用命令方式。
(2)使用Alt+E 切换到编辑窗口。
(3)使用Alt+R 执行程序。
2、Prolog 的语句
Prolog 语言只有三种语句,分别称为事实、规则和问题。
(1)事实(fact)
事实用来说明一个问题中书籍的对象和它们之间的关系。在Prolog 程序中,事实由谓词名及用括号括起来的一个或几个对象组成。谓词和对象可由用户自己定义。
例如:谓词likes(jack,football)
是一个名为like的关系,表示对象jack和football之间有喜欢的关系。
(2)规则
规则由几个互相有依赖性的简单句(谓词)组成,用来描述事实之间的依赖关系。从形式上看,规则由左边表示结论的后件谓词和右边表示条件的前提谓词组成。
例如,规则bird(X):-animal(X),has(X,feather).
表示凡是动物并且有羽毛,那么它就是鸟。
(3)目标(问题)
把事实和规则写进Prolog程序中后,询问的问题就是程序运行的目标。目标分为内、外两种,内部目标写在程序中,外部目标在程序运行时由用户手工键入。
例如:
GOAL
friend(john,Y).
表示询问john的朋友是谁。
3、Prolog编程注意事项
(1) 每条语句后面的小圆点不能丢。
(2) 同名谓词的语句要放在一起。
(3) 变量名的第一个字符必须大写。对象和谓词名的第一个字符必须小写。
(4) 逗号—它的意思是“与”,是用来连接两个或多个目标,以形成目标的合取。
(5) 拼写错误。
五、程序设计指导
1、编写一个描述亲属关系的Prolog程序。
提示:可以定义描述以下谓词
father(dali,xiaoli);
father(laoli,dali);
grandfather(X,Z):-father(X,Y),father(Y,Z).
2、编写一个路径查询程序,使其能输出图中所有路径。
提示:关键是描述图中蕴含的事实和规则。
定义road, path谓词
例如:road(a,b).
path的定义是本题的难点。
path(X,Y):-road(X,Z),path(Z,Y).
path(X,Y):-road(X,Y).
3、招聘
提示:需要把提供的事实表示成Rrolog语句。
例:史密斯住在剑桥,会开车但不会打字。
定义live, drive谓词。
live(smith,jianqiao).
drive(smith).
4、实现递归谓词remove(X,Y,Z)
提示:(1)用[H|T]来表示一个表,其中H、T都是变量,H为表头,T为表尾。
(2)Prolog中一般用递归的谓词来处理表。
(3)Prolog表处理示例一:
例:实现判断某个项目是否在列表中的谓词member。
首先考虑边界条件,即最简单的情况。某项目是列表中的元素,如果此项目是列表的表头。写成Prolog语言就是:
member(H,[H|T]).
从这个子句可以看出含有变量的事实可以当作规则使用。
第二个子句用到了递归,其意义是:如果项目是某表的表尾tail的元素,那么它也是此列表的元素。
member(X,[H|T]) :- member(X,T).
由于这个子句中的T也是一个列表,所以可以递归地进行下去。
(4)Prolog表处理示例二:
实现append谓词,将两个列表连接成一个列表。此谓词有三个参数。第一个参数和第二个参数连接的表为第三个参数。例如:
?- append([a,b,c],[d,e,f],X).
X = [a,b,c,d,e,f]
这个地方有一个小小的麻烦,因为最基本的列表操作只能取得列表的头部,而不能在内表尾部添加项目。append/3使用递归地减少第一个列表长度的方法来解决这个问题。
边界条件是:如果空表与某个表连接就是此表本身。