首页 > 编程知识 正文

人工智能报告5000字,强人工智能

时间:2023-05-06 20:19:05 阅读:114240 作者:3571

文章目录实验主题实验目的实验平台实验内容实验步骤具体设计1 .主题细节2 .主题分析3. Prolog代码4 .执行结果Prolog表相关知识Prolog的安装和使用探讨与结论1 .重难点探讨2 .实验成果

实验的主题

Prolog编程求解图检索问题

目的:熟悉Prolog运行环境,进行Prolog基本编程练习

了解Prolog语言中常量、变量的表达方法。 Prolog的简单程序机制是分析问题,听取说明技巧; 进行基于事实、基于规则的创建,并在此基础上进行简单的提问。

解图检索问题

请选择以下实用主题之一: 爱因斯坦的超级问题、谜题问题、感人的帽子问题、八数字问题、八皇后问题、农夫过河问题、泰达和野人问题。

实验平台硬件:计算机软件: windows/Linux操作系统APP应用: Prolog实验内容熟悉Prolog语言的使用,实现求解图检索问题

实验步骤编译用于创建安装Prolog集成开发环境的Prolog中选定问题的源程序的程序,并输出查询问题的结果或数据。 设计1 .主题细节这次实验选择了第一个主题——爱因斯坦的超问题。 我在网上找到了两个版本的主题,虽然内容不太一样,但是框架是一致的。 以下是我制作的版本的主题。

有五个颜色的房子,每个房主国籍不同。每个人只喝一种饮料,只抽一种烟,只养一只宠物。 没有人有同样的宠物,抽同样品牌的香烟,喝同样的饮料。 已知:

)1)英国人住在红房子里

)2)瑞典人养狗

)3)丹麦人喝茶

)4)绿色的房子在白色房子的左边

)5)绿房子的主人喝咖啡

)6) PALL MALL抽烟的人养鸟;

)7)黄房子主人抽烟DUNHILL

)住在中间房子里的人喝牛奶

)9)挪威人住在第一所房子里

(10 )抽混合烟的人住在养猫人旁边。

(11 )养马的人住在DUNHILL抽烟的人旁边。

) 12 )吸蓝大师烟的人喝啤酒;

(13 )德国人吸烟PRINCE;

) 14 )挪威人住在蓝房子旁边

) 15 )混合烟邻居喝矿泉水;

问:谁在养鱼?

2 .主题分析使用面向目标的分析,我们需要编写Prolog程序来解决这个问题。 那么,首先明确Prolog程序的构成部分。 Prolog程序一般由3358www.Sina.com/、事实规则组成。 所以,首先要弄清楚在爱因斯坦的超问题中,事实、规则、问题分别是什么。

“事实”其实很清楚。 主题详细给出的第一个词和15个已知信息。 问题也很明确。 我会找到养鱼的人。 但是,在这个问题上,所有人的国籍、饲养的宠物、房子的颜色、喝的饮料、香烟都可以匹配。 因此,问题在于寻求使所有事实成立的五个匹配。

比较“事实”和“问题”的话,“规则”是隐藏的,所以必须从主题上深入挖掘。

从已知信息(4)可以看出,必须定义规则“a在b的左侧)相邻”。 共有5间房子,从左到右依次标记为1-5,则“规则a相当于b的左(旁)、2、3 )、3、4 )、4、5 )”。 从已知的信息(8)可知,有必要定义“a家在中间”的规则。 如果让5户人家挪用上面1-5的号码的话,只有“a家的标签是3”符合规则“a家是中间”。 从已知信息(9)可以看出,有必要定义“a家是第一家”的规则。 如果让5户人家挪用上面1-5的号码,只有“a家的标签是1”符合规则“a家是第一家”。 从已知信息(10 )、(11 )和(14 )中可以看出,必须定义规则“a在b旁边”。 那么“(a,b )分别是) 1、2 )、2、3 )、3、4 )、4、5 )、2、1 )、3、2 )、4、3 )、5, 4 )”符合规则“a在b旁边”:房主的国籍、房主饲养的宠物、房屋颜色、房主喝的饮料、房主抽的烟都是一致的,使用与这五个属性之一相关的规则时,其他四条但是,这一整体中除了与规则相关的属性以外,还有其他属性。 因为所有属性都与人相关,所以可以设置谓词people(country、Pet、Color、Drink、Smoke )。 五间房子从左到右又有五个位置,所以可以设置谓词house(a,Houses )。 其中,a是一个成立事实的people实例,house ) a,Houses )表示a家在五个房子中的相对位置,共有五种。 Houses代表五个房子的布局。 因为五家有从左到右的顺序,所以很容易将Prolog的时钟用于Houses (知识介绍放在最后)。 最后一条规则是在所有事实成立时得到布局。 根据以上分析,我们很快就能写出解决这个问题所需的规则。

3 .日志代码

ESP.pl文件:(ESP即Einstein’s super problem,注意文件名后缀)

/* *表[_,_,_,_,_]为Houses *表中每个元素都是people *这个表即表明这五个人的房子的布局 */ /******规则部分******//***规则1:A在B的左边***/left(A,B,[A,B,_,_,_]).left(A,B,[_,A,B,_,_]).left(A,B,[_,_,A,B,_]).left(A,B,[_,_,_,A,B])./***规则2:A在中间***/middle(A,[_,_,A,_,_])./***规则3:A是第一个***/first(A,[A,_,_,_,_])./***规则4:A在B的旁边***/neighbor(A,B,[A,B,_,_,_]).neighbor(A,B,[_,A,B,_,_]).neighbor(A,B,[_,_,A,B,_]).neighbor(A,B,[_,_,_,A,B]).neighbor(A,B,[B,A,_,_,_]).neighbor(A,B,[_,B,A,_,_]).neighbor(A,B,[_,_,B,A,_]).neighbor(A,B,[_,_,_,B,A])./***规则5:房子A有五个位置可选***/house(A,[A,_,_,_,_]).house(A,[_,A,_,_,_]).house(A,[_,_,A,_,_]).house(A,[_,_,_,A,_]).house(A,[_,_,_,_,A])./***整体people,属性包括Country,Pet,Color,Drink,Smoke***/people(Country,Pet,Color,Drink,Smoke)./******事实、规则******/all_houses(Houses) :- house(people(british,_,red,_,_), Houses),/*事实1*/ house(people(swedish,dog,_,_,_), Houses),/*事实2*/house(people(danish,_,_,tea,_),Houses),/*事实3*/left(people(_,_,green,_,_), people(_,_,white,_,_), Houses),/*事实4*/house(people(_,_,green,coffee,_),Houses),/*事实5*/house(people(_,bird,_,_,pallmall),Houses),/*事实6*/house(people(_,_,yellow,_,dunhill),Houses),/*事实7*/middle(people(_,_,_,milk,_), Houses),/*事实8*/ first(people(norway,_,_,_,_), Houses),/*事实9*/neighbor(people(_,_,_,_,blend),people(_,cat,_,_,_),Houses),/*事实10*/neighbor(people(_,horse,_,_,_),people(_,_,_,_,dunhill),Houses),/*事实11*/house(people(_,_,_,beer,bluemaster),Houses),/*事实12*/house(people(german,_,_,_,prince),Houses),/*事实13*/neighbor(people(norway,_,_,_,_),people(_,_,blue,_,_),Houses),/*事实14*/neighbor(people(_,_,_,_,blend),people(_,_,_,mineralwater,_),Houses),/*事实15*//*问题是谁养鱼,虽然鱼在上面的事实中都没有出现,但是一定有一个人养鱼*/house(people(_,fish,_,_,_),Houses). 4. 运行结果 Prolog表相关知识

  表是Prolog中一种非常有用的数据结构。表的表述能力很强,数字中的序列、集合,通常语言中的数组、记录等均可用表来表示。表的最大特点是其长度不固定,在程序的运行过程中可动态地变化。具体来讲,就是在程序运行时,可对表实行一些操作,如给表中添加一个元素,或从中删除一个元素,或者将两个表合并为一个表等。用表还可以方便地构造堆栈、队列、链表、树等动态数据结构。

  表还有一个重要特点,就是它可以分为头和尾两部分。表头是表中第一个元素,而表尾是表中除第一个元素外的其余元素按原来顺序组成的表。

  在程序中是用“|”来区分表头和表尾的,而且还可以使用变量.例如一般地用"[H|T]"来表示一个表,其中 H、T 都是变量,H 为表头,T为表尾。注意,此处 H 是一个元素(表中第一个元素),而 T 则是一个表(除第一个元素外表中的其余元素按原来顺序组成的表)。表的这种表示法很有用,它为表的操作提供了极大的方便 。

表的匹配合一

  如下面的表所示即为用这种表示法通过匹配合一提取表头和表尾的例子.。

表1表2合一后的变量值[X | Y][a, b, c]X = a, Y = [b, c][X | Y][a]X = a, Y = [][刻苦的爆米花][X, b]X = a, Y = [b][X, Y, Z][a, b, c]X = a, Y = b, Z = c[[a, Y] | Z][[X, b], [c]]X = a, Y = b, Z = [[c]]

  还需说明的是,表中的“|”后面只能有一个变量。例如写法 [X | Y, Z] 就是错误的,但竖杠前面的变量可以多于一个:例如写法 [ X, Y | Z] 是允许的。这样,这个表同 [a, b, c] 匹配合一后,有:X = a, Y = b, Z =[c]。

  另外,竖杠的前面和后面也可以是常量,例如 [刻苦的爆米花] 和 [X | b] 都是允许的,但需要注意,后一个表称为无尾表,如果它同表 [刻苦的爆米花] 匹配,则有:X = a, Y = b (而不是 Y = [b])

  更多Prolog相关知识

Prolog安装及使用

本次实验我是在Ubuntu16.04下完成的。在终端键入

sudo apt-get install swi-prolog

安装成功后,键入

prolog XXX.pl

swipl XXX.pl

即可执行写好的Prolog程序。

此外,还可以使用命令行交互运行程序:

键入

swipl

prolog

在 “?-” 符号后面敲 [user]. (注意别把 “.” 丢掉,. 在 prolog 程序里面是结束符,类似 C 的 ;)敲两下回车看到 “|:” 符号,即可写入事实与规则。输入完成后,按ctrl+D退出代码编辑,当再次出现“?-”时,就可以针对刚刚输入的内容进行询问了。

讨论与结论 1. 重难点讨论

  本次实验重点在于理解题意,难点在于学习Prolog语言语法以及Prolog的安装与使用,并根据题意写出正确的Prolog程序。理解题意是根本,这个题目本身也比较清晰。Prolog语言语法、安装与使用的方法主要通过网络资料、博客获取。刚开始我没有系统地学习Prolog语言语法就上手写,导致报了一堆错误,后来学习后才知道,原子与函子都要以小写字母为开头。

2. 实验收获

  通过本次实验,我学会了使用SWI-prolog、了解了Prolog语言的一些语法,也锻炼了自己分析题目、编写Prolog程序的能力。但是由于刚刚入门,所以对Prolog各方面知识的运用都还不太熟练,掌握的也不是那么全面,只对自己使用到的部分和一些基础部分有所了解。因此在实验后需要我加以巩固,更多地去运用Prolog工具,提升熟练度,比较系统全面的学习Prolog的语法。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。