人工智能实验一指导

  • 格式:doc
  • 大小:91.50 KB
  • 文档页数:7

下载文档原格式

  / 7
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验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使用递归地减少第一个列表长度的方法来解决这个问题。

边界条件是:如果空表与某个表连接就是此表本身。