人工智能实验报告 华北电力大学 刘丽

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 页共 页
华北电力大学科技学院实验报告
在 Prolog 中,当某个谓词的目标中包含了此谓词本身时,Prolog 将进 行递归调用
递归技术在表处理中特别有用,几乎所有的表处理程序都用到递归,但 在一般程序中,使用递归要谨慎,或尽量不用,因为递归很容易导致堆栈溢 出
到目前为止,我们都一直在使用 Prolog 内建的回溯功能。使用此功能 可以方便地写出结构紧凑的谓词来
* 封面左侧印痕处装订
华北电力大学科技学院实验报告
一、实验目的及要求
1. 熟悉 PROLOG 的运行环境,进行 prolog 的基本编程练习。
了解 PROLOG 语言中常量、变量的表示方法。PROLOG 的简单程序结构,掌握分析问
题、询问解释技巧;进行事实库、规则库的编写,并在此基础上进行简单的询问。
legal1(X), %分别判断两岸的状态是否合法。 legal1(Y).
legal1((X,Y)):X=:=0,Y>=0,!. %牧师人数为 0,野人的人数大于 0,合法。
legal1((X,Y)):Y=:=0,X>=0,!. %野人人数为 0,牧师的人数大于 0,合法。
legal1((X,Y)):X>=Y,X>=0,Y>=0. %牧师数大于或等于野人数,且都大于 0,合法。
五、求解的问题与程序
第 页共 页
华北电力大学科技学院实验报告
如果要移动 N 个盘子,就要分三步走:
把 N-1 个盘子移动到中间的杆子上(把中间的杆子作为临时存放盘子的
位置)
把最后一个盘子直接移到右边的杆子上
最后把中间杆子上的盘子移到右边的杆子上(把左边的杆子作为临时存
放盘子的位置)
对于汉诺塔问题,实现的代码如下: hanoi(N):-move(N,left,middle,right). move(1,A,_,C):-inform(A,C),!. move(N,A,B,C):-N1 is N-1,move(N1,A,C,B),inform(A,C),move(N1,B,A,C). inform(Loc1, Loc2):-nl, write('Move a disk from '-Loc1-' to '-Loc2). 运行结果如下:
一、实验目的及要求 二、所用仪器、设备 三、实验原理 四、实验方法与步骤 五、实验结果与数据处理 六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问 题等进行分析和讨论,对实验的进一步想法或改进意见) 七、所附实验输出的结果或数据 设计性实验报告应含的主要内容: 一、设计要求 二、选择的方案 三、所用仪器、设备 四、实验方法与步骤 五、实验结果与数据处理 六、结论(依据“设计要求”) 七、所附实验输出的结果或数据
在 PROLOG 中,常用的结构形式有: (1)函子(分量 1,分量 2,……,分量 n) (2)表:Prolog 语言中最常用的数据结构,由一些有序分量组成,长度可任意 含 有 3 个 分 量 a , b , c 的 表 可 写 成 [a , b , c] , 如 用 函 数 的 方 式 可 写 成·(a · (b · (c[ ])))。其中符号“.”是表的函子 (3)表达式 PROLOG 语言提供了各种运算,如算术、比较运算等 运算可以是中缀形式,简明直观,符合人们的习惯 算术表达式 X+Y-Z 中,“+”、“-”便是运算符,该表达式如用函数结构形式来表示就 是-(+(XY)Z) 表示对象间的因果关系、蕴含关系或对应关系 格式: head :- body head 是谓词的定义部分,与事实一样,也包括谓词名和谓词的参数说明 :- 连接符,一般可以读作‘如果’ body 一个或多个目标,与查询相同 bird(X):-annimal(X),has(X,feather). grandfather(X,Y):-father(X,Z),father(Z,Y).
华北电力大学科技学院
实验报告
| |
实验名称 PROLOG 语言编程练习及图搜索问题求解
课程名称 人工智能及应用
| |
专业班级:计算机 09k1 学生姓名:
学 号:
成 绩:
指导教师:
实验日期:
(实验报告如打印,纸张用 A4,左装订;页边距:上下 2.5cm,左 2.9cm, 右 2.1cm;字体:宋体小四号,1.25 倍行距。) 验证性、综合性实验报告应含的主要内容:
对于过河问题实现的代码如下: move(1,0). %表示船上有一位牧师,没有野人。 move(0,1). move(0,2). move(2,0). move(1,1).
%判断移动后两岸状态是否合法
第 页共 页
华北电力大学科技学院实验报告
legal((X,Y,_)):- %X 为左岸状态,Y 为右岸状态。_取 0 或 1,0 代表左岸,1 代表右岸
具体实验课上相关内容,练习例 1 到例 6 的内容。
2. 图搜索问题求解。
任选以下实际应用题目:爱因斯坦的超级问题、字谜问题、汉诺塔问题、八数码问
题、八皇后问题、过河问题等,选两Leabharlann Baidu。
要求实验报告中包括:程序及其注释和说明、console 表单中的程序运行结果。
二、所用仪器、设备
PC 机和 trinc prolog 编译软件
%update 谓词能够完成把合理的移动作用的某个状态上,从而到达新的状态。 update((X,Y,0),Move,Statu1):- %船在左岸时
(A,B)=X, (C,D)=Y, (E,F)=Move, C1 is C+E, D1 is D+F, A1 is A-E, B1 is B-F, Statu1=((A1,B1),(C1,D1),1). update((X,Y,1),Move,Statu1):- %船在右岸时 (A,B)=X, (C,D)=Y, (E,F)=Move, C1 is C-E, D1 is D-F, A1 is A+E, B1 is B+F, Statu1=((A1,B1),(C1,D1),0). %有了以上的三个谓词 move,update,legal 我们就可以很容易的做出判断两个 合法的状态相邻的谓词。 connect(Statu,Statu1):move(X,Y), update(Statu,(X,Y),Statu1), legal(Statu1). %判断对象 X 是表的成员 member(X,[X|Tail]). member(X,[Head|Tail]):-member(X,Tail). %再使用深度搜索方法就可以找到答案了。由查找的目标状态 X: ((0,0),(3,3),1),开始向前查找直到与查找前的初始状态 Y:((3,3),(0,0),0)相匹配, 查找结束。 findroad(X,X,L,L). %递归的边界条件。 findroad(X,Y,L,L1):- % L 为储存的路径表。
并不是所有的回溯都是必须的,这时我们需要能够人工地控制回溯过程 Prolog 提供了完成此功能的谓词,叫做 cut,使用符号!来表示 Cut 能够有效地剔除一些多余的搜索。如果在 cut 处产生回溯,它会自 动地失败,而不去进行其它的选择 若将“!”插在子句体内作为一个子目标,它总是立即成功
2.若“!”位于子句体的最后,则它就阻止对它所在字句的头谓词的 所有子句的回溯访问,而让回溯跳过该头谓词,去访问前一个子目标
三、实验原理
PROLOG 语言是一种以逻辑推理为基础的逻辑型程序设计语言,是一种陈述性语言而
不是过程性语言。PROLOG 语言能够自动实现模式匹配和回溯、具备递归技术,而且语法
简明,可以简化复杂问题求解。
四、实验方法与步骤
熟悉环境 Trinc-Prolog,用来编译各个逻辑新非常强的问题,从中选择汉诺塔和过 河问题进行解决。
3.若“!”位于其他位置,则当其后发生回溯且回溯到“!”处时,就 在此失败,并且“!”还使它所在子句的头谓词整个失败
cut 不符合纯逻辑学,是出于实用的考虑,过多地使用 cut 将降低程序 的易读性和易维护性。它就像是其它语言中的 goto 语句
当能够确信在谓词中的某一点只有一个答案,或者没有答案时,使用 cut 可以提高程序的效率,另外,如果在某种情况下想让某个谓词强制失败, 而不让它去寻找更多的答案时,使用 cut 也是个不错的选择
第 页共 页
华北电力大学科技学院实验报告
规则中的谓词也可以无参数: run:-start ,step1(X),step2(X),end. Prolog 的查询工作靠模式匹配完成 查询的模板叫做目标(goal) 如果有某个事实与目标匹配,那么查询成功,解释器会回显‘yes.’ 如果没有匹配的事实,查询失败,解释器回显'no.‘ Prolog 的模式匹配工作叫做联合(unification),以下三个条件是使联合成功的必 要条件 目标谓词名与数据库中的某个谓词名相同 这两个谓词的参数数目相同 所有的参数也相同 在查询目标中还可以使用 Prolog 的变量 这种变量和其他语言中的不同,叫它逻辑变量更合适 变量可以代替目标中的一些参数 变量给联合操作带来了新的意义。以前联合操作只有在谓词名和参数都相同时才能 成功。但是引入了变量之后,变量可以和任何的条目匹配 当联合成功之后,变量的值将和它所匹配的条目的值相同。这叫做变量的绑定 (binding)。当带变量的目标成功的和数据库中的事实匹配之后,Prolog 将返回变量绑 定的值 当 Prolog 试图与某一个目标匹配时,例如:location/2,它就在数据库中搜寻所有 用 location/2 定义的子句,当找到一条与目标匹配时,它就为这条子句作上记号。当用 户需要更多的答案时,它就从那条作了记号的子句开始向下查询 我们来看一个例子: 用户询问:location(X,kitchen). Prolog 找到数据库中的第一条 location/2 子句,并与目标比较 用户输入回车,Prolog 开始寻找其他的答案 首先它必须释放(unbinds)变量 X。然后从上一次成功的位置的下一条子句开始继 续搜索。这个过程叫做回溯(backtracking) 在本例中就是第三条子句 子句#3 location(flashlight, desk). 匹配失败,直到第六条子句时匹配又成功 Prolog 的目标有四个端口用来控制运行的流程 调用(call) 退出(exit) 重试(redo) 失败(fail) 一开始使用 Call 端口进入目标,如果匹配成功就到了 exit 端口,如果失败就到了 fail 端口,如果用户输入回车,则又从 redo 端口进入目标
第 页共 页
华北电力大学科技学院实验报告
每个端口的功能如下: call 开始使用目标搜寻子句 exit 目标匹配成功,在成功的子句上作记号,并绑定变量 redo 试图重新满足目标,首先释放变量,并从上次的记号开始搜索 fail 表示再找不到更多的满足目标的子句了 :- ?- location(X, kitchen). 用 start step 观察 程序第一次执行,与第一个事实匹配,输出,回车换行,number=1,不 匹配,引起回溯 与第二个事实匹配,输出,回车换行,number=2,不匹配,引起回溯 与第三个事实匹配,输出,回车换行,number=3,匹配,最后一个语句 成功,程序段结束 ?-print2.(观察结果) 表是有若干元素的有序序列,表中元素也可以为表 表最大的特点是长度不固定,在程序运行中可以动态的变化 PROLOG 中采用一对方括号[ ]把表元素括起来,每个元素间用逗号或空 格分开 谓词 append 是递归定义的
输入:- hanoi(4).后得出 Move a disk from - left - to - middle Move a disk from - left - to - right Move a disk from - middle - to - right Move a disk from - left - to - middle Move a disk from - right - to - left Move a disk from - right - to - middle Move a disk from - left - to - middle Move a disk from - left - to - right Move a disk from - middle - to - right Move a disk from - middle - to - left Move a disk from - right - to - left Move a disk from - middle - to - right Move a disk from - left - to - middle Move a disk from - left - to - right Move a disk from - middle - to – right
相关文档
最新文档