2023年人工智能大作业实验_第1页
2023年人工智能大作业实验_第2页
2023年人工智能大作业实验_第3页
2023年人工智能大作业实验_第4页
2023年人工智能大作业实验_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

湖南中医药大学本科课程实验教学大纲

《人工智能》

计算机科学与技术专业

执笔人:丁长松

审定人:***

学院负责人:***

湖南中医药大学教务处

二。一四年三月

一、课程性质和教学目的

《人工智能》是计算机专业本科生的一门专业必修课,适应于计算机科学

与技术专业、医药信息工程专业。本课程是关于人工智能领域的引导性课程,通

过本课程的学习,是使学生了解和掌握人工智能的基本概念、原理和方法,培

养学生在计算机领域中应用人工智能技术提高分析和解决较复杂问题的能力,

启发学生对人工智能的爱好,培养知识创新和技术创新能力。

《人工智能》重要研究智能信息解决技术、开发具有智能特性的各类应用

系统的核心技术。本课程重要介绍人工智能的基本理论、方法和技术,重要涉

及常用的知识表达、逻辑推理和问题求解方法、人工智能发展学派以及重要理

论。

先修课程:高等数学、数据结构、数据库原理、算法设计与分析、数理逻辑

二、课程目的

人工智能实验应在一种为高效率开发专家系统而设计的高级程序系统或高

级程序设计语言环境中进行。在目前开来,专家系统开发工具和环境可分为5

种重要类型:程序设计语言、知识工程语言、辅助型工具、支持工具及开发环

境。在这里重要是规定学生能用相关术语描述、表达一些问题;用程序设计语言

如:C、C++、JAVA编程来实现一些基本的算法、推理、搜索等过程。

三'实验内容与规定

实验一:谓词表达

【实验内容】

设农夫、狼、山羊、白菜都在河的左岸,现在要把它们运送到河的右岸去,

农夫有条船,过河时,除农夫外船上至多能载狼、山羊、白菜中的一种。狼要吃

山羊,山羊要吃白菜,除非农夫在那里。试设计出一个保证所有都能过河的方案。

【实验目的】

让学生加深对谓词逻辑和谓词知识表达的理解。

【实验规定】

写出所用谓词的定义,并给出每个谓词的功能及变量的个体域,然后编程

来实现。

【参考学时】

1.定义状态的谓词

2.定义变元的个体域

3.描述问题的初始和目的状态

4.定义动作

5.解释过程

解:(1)先定义描述状态的谓词

AL(x):x在左岸

rAL(x)表达x在右岸。

(2)定义个体域

x的个体域:{农夫,船,狼,羊,白菜}。

(3)定义初始状态和目的状态

问题的初始状态:AL(农夫),AL(船),AL(狼),AL(羊),AL(白菜),

问题的目的状态:"L(农夫),RL(船),-AL(狼),rAL(羊)「AL(白菜)

(4)定义动作

4个动作:

农夫不带来回

农夫带来回

L-R:农夫自己划船从左岸到右岸

L-R(x):农夫带着x划船从左岸到右岸

R-L:农夫自己划船从右岸到左岸

R-L(x):农夫带着x划船从右岸到左岸

x的个体域是{狼,羊,白菜}。

L-R:农夫划船从左岸到右岸

条件:AL(船),AL(农夫),rAL(狼)V”L(羊),-AL(羊)VrAL(白菜)

动作:删除表:AL(船),AL(农夫)

添加表:「AL(船),-AL(农夫)

L-R(狼):农夫带着狼划船从左岸到右岸

条件:AL(船),AL(农夫),AL(狼),rAL(羊)

动作:删除表:AL(船),AL(农夫),AL(狼)

添加表:ML(船)「AL(农夫),血(狼)

L-R(羊):农夫带着羊划船从左岸到右岸

条件:AL(船),AL(农夫),AL(羊),AL(狼),AL(白菜)

或:AL(船),AL(农夫),AL(羊),ML(狼)「AL(白菜)

动作:删除表:AL(船),AL(农夫),AL(羊)

添加表:「AL(船),(农夫),FL(羊)

L-R(白菜):农夫带着白菜划船从左岸到右岸

条件:AL(船),AL(农夫),AL(白菜),-AL(狼)

动作:删除表:AL(船),AL(农夫),AL(白菜)

添加表「AL(船),rAL(农夫),rAL(白菜)

R-L:农夫划船从右岸到左岸

条件:rAL(船),rAL(农夫),AL(狼)VAL(羊),AL(羊)VAL(白菜)

或:rAL(船),rAL(农夫),rAL(狼)「AL(白菜),AL(羊)

动作:删除表:rAL(船),-AL(农夫)

添加表:AL(船),AL(农夫)

R-L(羊):农夫带着羊划船从右岸到左岸

条件:rAL(船),rAL(农夫),rAL(羊),rAL(狼)JAL(羊),AL(白菜)

动作:删除表:rAL(船),rAL(农夫),rAL(羊)

添加表:AL(船),AL(农夫),AL(羊)

(3)问题求解过程

AL(农夫A1

AL(狼)。AL(农夫WAL旧菜A

AL(船户L-R(羊*AL(白菜).,R-L〃AL(船)"L-R(狼W-AL(农R.L(羊)

ALQ艮尸,f-AIX农「oAL(狼)"t=>夫>---->

AL(羊W

夫户AL(白菜WrAL(船A

AL旧菜)“

、AL(船》rAL佯州rAL(狼)“

L(农夫),

A♦AL佯AAL(农夫”--«AIZ农

AL(船)川L-R(白菜)「山(农R-L"AL(船AL-R(羊)p%仅

AY,»、1-----------------r,二夫)川

AM干尸天A>AL(羊”

AL(白菜V■'AI/白

3(船),■*AL(羊A

血(狼)“(白菜),

rALrAL(白

代码如下

#inc1ude<stdio.h>

#include<malloc.h>

typedefintdatatype;//datatype定义

structseqque//队列结构体

1ntmaxnum;

intf,r;。。〃存放头尾下标

datatype*q;

);

typedefstructseqque*pseqque;

/*创建一个新的队列*/

pseqquecreatemptyqueue(intm)

(

pseqquepaqu=(pseqque)malloc(sizeof(structseqque));。〃申请结构体动

态空间

oif(paqu!=NULL)

。(

«paqu->q=(datatype*)ma1loc(sizeof(datatype)*m);〃申请datatype动态空

Mf(paqu->q)

(

paqu->maxnum=m;

a叩aqu->f=O;〃置头下标为0

。。paqu->r=O;“/置尾下标为0

。returnpaqu;

00J

elsefree(paqu);

°)

printf("超过存储空间!”);

returnNULL;

)

/*入队运算函数*/

voidenque(pseqquepaqu,datatypex)

if((paqu->r+1)%(paqu->maxnum)==paqu->f)

Printf("队列已满!”);

oelse

°{

epaqu->q[paqu->r]=x;

paqu->r=(paqu->r+l)%(paqu->maxnum);

°}

)

/*出队运算函数*/

voiddeque(pseqquepaqu)

(

•if(paqu—>f==paqu—>r)

Printf("空队列!");

•else

。paqu->f=(paqu->f+1)%(paqu->maxnum);

)

/*取队列头元素*/

datatypefrontque(pseqquepaqu)

(

Af(paqu->f==paqu->r)

printf("队列为空!");

•e1se

•return(paqu—>q[paqu->f]);

)

/*判断是否为空队列函数*/

intisemptyque(pseqquepaqu)

。if(paqu->f==paqu->r)

ooreturn1;

oelse

return0;

)

/*判断农夫位置*/

intfarmer(int1ocation)

(

return(0!=(location&0x08));

)

/*判断狼位置*/

intwo1f(int1ocation)

(

©return(0!=(location&0x04));

)

/*判断白菜位置*/

intcabbage(intlocation)

(

return(0!=(location&0x02));

)

/*判断羊位置*/

intgoat(int1ocation)

®return(0!=(location&0x01));

)

/*安全状态的判断函数*/

intsafe(int1ocation)

(

♦f((goat(1ocation)==cabbage(location))&&(goat(location)!=farmer(locati

on)))

oreturn0产〃羊吃白菜

if((goat(location)==wolf(1ocation))&&(wolf(location)!=farmer(loca

tion)))

好eturn0;。“/狼吃羊

return1;

)

/*解决农夫问题函数*/

voidfarmerprob1em(void)

(

inti,movers,location,newlocation;

“ntroutel!6];〃记录已走过的环节

pseqquemoveto;g〃存放安全的环节

0moveto二ereatemptyqueue(16);。//创建新队列

oenque(moveto,0x00);。//置状态初值

for(i=0;i<l6;i++)。//置已走过环节初值

8route[i]=-l;

route[0]=0;

owhile(!isemptyque(moveto)&&(route[15]==-1))

o®1ocation=frontque(moveto);//取头状态为当前状态

。deque(moveto);6//删除队列头状态

for(movers=1;movers<=8;movers<<=1)〃依次考虑羊、白菜、狼、

农夫的移动

((0!=(location&0x08))==(0!=(1ocation&movers)))。〃判断是否和农夫同

Ob{

e“new1ocation=locationA(0xO8|movers);。“/移动后的状态

*if(safe(newlocation)&&(route[new1ocation]==-1))。〃判断是否为安全状

0{

。。。好oute[newlocation]=location;。”/将新的安全状态赋给1ocation

goenque(moveto,new1ocation);。〃新的状态入队列

6}

。}

if(route[15]!=-1)»//到达最终状态

(

。printf("过程是:\n");。//输出过程和位置

for(location=15;location>=0;location=routeElocation])

00|

oprintf("位置是:%d\n",location);

。«>if(location==0)

一xit(0);

)

oelseprintf("此问题无解!”);

/*主函数*/

voidmain()

(

ofarmerprob1em();

实验二:一个用于动物辨认的产生式系统

【实验内容】

设计该系统,让其实现可以辨认老虎、金钱豹、斑马、长颈鹿、企鹅、信天

翁这6种动物。

【实验目的】

让学生进一步加深对产生式系统的结识和理解。

【实验规定】

其规则库中应包含至少15条规则,假设推理开始时综合数据库中存放有以

下事实:

动物有暗斑,有长脖子,有长腿,有奶,有蹄。

【参考学时】

6课时:上机实验6课时。

设计如下:

(1)IDENTIFIER产生式规则

规则11:假如该动物有毛发

那么它是哺乳动物

规则12:假如。该动物有奶

那么它是哺乳动物

规则I3:假如该动物有羽毛

那么它是鸟类动物

规则14:假如该动物能生蛋

它能飞行

那么它是鸟类动物

给出的六种动物除了哺乳动物即是鸟类动物,故11-14这一组规则可用于

区分这两类动物。

规则I5:假如。该动物是哺乳动物

它吃肉

那么它是肉食动物

规则16:假如该动物是哺乳动物

它长有爪子

它长有利齿

它眼睛前视

那么。它是肉食动物

规则I7:假如该动物是哺乳动物

它长有蹄

那么。它是有蹄动物

规则瓜假如该动物是哺乳动物

它反刍

那么。它是有蹄动物,并且是偶蹄动物

I5-I8用于区分哺乳动物中的食肉动物和有蹄动物。

规则I9:假如。该动物是食肉动物

它有暗斑

那么它是金钱豹

规则H0:假如该动物是食肉动物

它没有暗斑

它有黄色条纹

那么它是老虎

19—110用于区分肉食动物。

规则Ill:假如。该动物是有蹄动物

它有长脖子

那么。它是长颈鹿

规则112:假如。该动物是有蹄动物

它没有长脖子

它有黑白条纹

那么。它是斑马

I11-H2用于区分蹄型动物。

规则II3:假如该动物是鸟类

它有能游水

那么他是会水鸟类

规则114:假如。该动物是鸟类

它有长腿

它会飞

那么它是信天翁

规则115:假如该动物是会水鸟类

它不会飞

它是黑色和白色的

那么它是信企鹅

113-115用于区分鸟类动物。

代码如下:

#include<stdio.h>

#include<std1ib.h>

intmain()

(

»inta[5]={0,0,0,0,0};

printf("请输入该动物的特性有的特性输入1无的特性输入0\n\n");

for(intk=0;k<5;k++)

°{

gif(k==0)

。printf("该动物是否有奶?\n");

oelseif(k==l)

。printf("该动物是否有蹄?\n");

“elseif(k==2)

。printf("该动物是否有长腿?'n");

。。eIseif(k==3)

printf("该动物是否有暗斑?\n");

e1seif(k==4)

。。printf("该动物是否有长脖子?\n");

。scanf("%d",&a[k]);

。}

0

Trintf("输入的序列为:");

for(intj=O;j<5;j++)

(

printf("%d",a[j]);

叩rintf(

»intb=-l;

for(inti=0;i<5;i++)

(

oif(i==0){

。oif(a[i]==1){

pintf("该动物是哺乳动物\n");

8b=1;

Ob}

。oif(a[i]==o){

甲rintf("该动物不是哺乳动物\n");

。ob=0;

00}

}

if(i==l){

08if(a[i]==1&&b==1){

。printf("该动物是有蹄动物\n”);

ob=ll;

00}

8“f(a[i]==0&&b==1){

»printf(n该动物不是有蹄动物\n”);

。。ob=l0;

0bj

°}

sif(i==2){

°if(a[i]==1&&b==0){

ggprintf("该动物有长腿\n");

。b=01,信天翁

)

8,if(a[i]==0&&b==0){

。"rintf("该动物没有长腿\n");

。»b=00;//企鹅

°}

}

。if(i==3){

°if(a[i]==l&&b==10){

«printf("该动物有暗斑\n");

°,b=l()1;〃猎豹

666}

。if(a[i]==0&&b==10){

sprintf("该动物无暗斑\nn");

"gb=100;〃老虎

00J

60)

8if(i==4){

。®if(a[i]==l&&b==l1){

“叩rintf("该动物有长脖子\n”);

o由二111;〃长颈鹿

0)

。。if(a[i]==O&&b==11){

“printf("该动物没有长脖子\n)

。8b=110;//斑马

)

。}

}

®if(b==01)

。Printf("该动物是信天翁\n”);

®elseif(b==00)

-printf("该动物是企鹅\n)

©elseif(b==101)

。叩rintf("该动物是猎豹\n“);

©elseif(b==l00)

“printf("该动物是老虎\n");

elseif(b==111)

Printf("该动物是长颈鹿\n");

elseif(b==110)

“printf("该动物是斑马\n)

else

叩rintf("该动物不存在\n”);

system(npauseM);

return0;

}

实验三:子句消解

代码如下

#include<stdio.h>

#inc1ude<iostream.h>

#inc1ude<string.h>

#inc1ude<std1ib.h>

#defineN50

#defineM50

voidReplaceString(char*Src,char*a,char*b)

(

char*ptr;

int1en=str1en(Src);

ptr=(char*)ma11oc(sizeof(char)*1en+10);

strcpy(ptr,Src);

intsubLen_a=strlen(a);

ointsubLen_b=str1en(b);

ointj;intk=subLen_b-subLen_a;

for(inti=0;i<len;i++)

(

0

。时f(O==strncmp(&ptr[i],a,subLen—a))

00

00for(j=i+subLen—a;j<len;j++)

。»ptr[j+k]=ptr[j];

。。。strncpy(&ptr[i],b,subLen_b);

1

)

ptr[len+k]='\0';

strepy(Src,ptr);

)

voidxiaojie(charaE],charblJ)

(

»charA[NJ[NJ,B[N][N];

intn=0,m=0,i,j;

»intlenth_a=strIen(a),lenth_b=strlen(b);

•for(i=0;i<lenth_a;i++)

°(

if(a[i]!='V)

00I

A[n][m]=a[i];

6m++;

)

else

6{

o^A[n][m]='\0';

m=0;

00n++;

A[n][m]='\O,;

ointk=n;//A的记录行数

n=0,m=0;

ofor(i=0;i<1enth_b;i++)

{

oif(b[i]!=Y)

°{

]=b[i];

3m++;

^else

6(

oB[n][mJ^XO';

m=0;

n++;。

。}

B[n][m]='\0,;

。intr=n;//B的记录行数

0

。//检查两子句是否具有互补对

for(n=0;n<=k;n++)

(

。for(m=0;m<=r;m++)

•o«if((B[m][0]=='~,)&&(B[m][1]==A[n]⑼))//出现互补对

00I

//置换

。charx[N][N],y[N][N];

intg=0,h=0;

。lenth_a=str1en(A[n]);

®1enth_b=strien(B[m]);

。for(i=2;i<1enth_a-1;i++)

aa(

if(A[n][i]!=';)

。x[g][h]=A[n]Li];

soeh++;

)

else

00|

8ox[g][h]-\0*;

ooooh=0;

og++;

}

®}

-x[g][h]='\0,;

8g=0,h=0;

“for(i=3;i<lenth_b-1;i++)

|

f(B[n][i]!=;)

8gy[g][h]=B[n][i];

。由++;

b)

o1se

00I

。y[g][h]='\o';

。h=0;

og++;

08)

00)

'y[g][h]='\0';

,for(inti=0;i<=g;i++)//置换

0{

if(strlen(x[i])>=strlen(y[i]))

°{

606C0ut«x[i]v<”/"《y[i]«endl;

。。for(j=0;j<=r;j++)

»»®Rep1aceString(B[j],y[i],x[i]);

d0I

8if(strlen(x[i])<str1en(y[i]))

(

8。cOUt«y[i]«,7,'«x[i]«endl;

a。。for(j=0;j〈=k;j++)

®Rep1aceString(A[j],x[i],y[i]);

)

000

1()

for(i=n;i<=k;i++)//消去互补对

strcpy(A[i],A[i+l]);

“k=k-1;

for(i=m;i<=r;i++)

strcpy(B[i],B[i+1]);

oor=r-1;

)

e1seif((A[n][0]=~)&&(A[n][l]==B[m][0]))

°{

■charx[N][N],y[N][N];

intg=0,h=0;

31enth_a=strlen(A[n]);

g1enth_b=strlen(B[m]);

for(i=3;i<lenth—a;i++)

。{

。if(A[n][i]!=7)

{

°x[g][h]=A[n][i];

a0h++;

b°}

。else

(

。•X[g][h]=,\0';

OOoh=0;

g++;

。}

Obb}

x[g][h]=z\0';

gg=0,h=0;

。gfor(i=2;i<1enth_b;i++)

DObb{

oooooif(B[n][“!=?)

00b(

0000y[g]Eh]=B[n][i];

obeh++;

。}

。b«>else

0000{

。y[g][h]=,\cr;

。。h=0;

008Q++•

"y[g][h]='\0';

OD

。for(i=0;i<=g;i++)〃置换

if(strlen(x[i])>=strlen(y[i]))

000I

尔out«x[i]«Vn«y[i]«end1;

0000for(j=O;jv=r;j++)

Rep1aceString(B[j],y[i],x[i]);

}

。。if(strlen(x[i])<strlen(y[i]))

g“coutV<”&&&&**«endl;

。。。cout«y[i]<<7"«xEi]«end1;

。。。for(j=0;j<=k;j++)

g®ReplaceString(A[j],xLi],y[i]);

000}

80for(i=n;i<=k;i++)//消去互补对

。8strcpy(A[i],A[i+1]);

。k=k-l;

。匕for(i=m;i<=r;i++)

gostrcpy(B[i],B[i+11);

gr=r-l;

Odd}

gge1secontinue;

00}

。}

。〃输出结果

。,cout«"消解后的字句为:"<<endl;

。for(n=0;n<=k;n++)

ocout«A[n]«,,Vn;

for(m=0;m<r;m++)

ooocout«B[m]«nVu;

。®cout<<B[m]«endl;

voidmain()

chara[N],b[N];

coUtv<”请输入所要消解的第一个子句:"<<endl;

cin»a;

cout<<”请输入所要消解的第二个子句:endl;

ocin>>b;

xiaojie(a,b);

运营结果:

•D:\学习软件\MSDev98\MyPrqjects\子句消魁De…W2—T

请输入所要消解的第一个子句:

P[x,f(y)]VQ(x)VR(f(a),y)

请输入所要消解的第二个子句:

^P[f(f(a)),z]VR(z,w)

f(f(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论