人工智能实验报告
人工智能课内实验报告 (8次)
学
院:
自动化学院
班
级:
智能1501
姓
名:
刘少鹏(34)
学
号:
目 录 课内实验 1: 猴子摘香蕉问题得 VC 编程实现„„„„„„„„1 课内实验 2: 编程实现简单动物识别系统得知识表示„„„5 课内实验 3:盲目搜索求解8数码问题„„„„„„„„„18 课内实验 4:回溯算法求解四皇后问题„„„„„„„„„33 课内实验 5:编程实现一字棋游戏„„„„„„„„„„„37 课内实验 6:字句集消解实验„„„„„„„„„„„„ „46
课内实验 7:简单动物识别系统得产生式推理„„„„„„66
课内实验8:编程实现D-S证据推理算法„„„„„„„ „78
人工智能课内实验报告 实验 1:猴子摘香蕉问题得 VC 编程实现 学
院:
自动化学院
班
级:
智能 1501
姓
名:
刘少鹏 (33)
学
号:
06153034
日
期: 2017—3—8 10:15-12:00
实验 1: 猴子摘香蕉问题得 C VC 编程实现
一、实验目得 (1)熟悉谓词逻辑表示法; (2)掌握人工智能谓词逻辑中得经典例子—-猴子摘香蕉问题得编程实现. 二、编程环境 VC 语言 三、问题描述 房子里有一只猴子(即机器人),位于 a 处。在c处上方得天花板上有一串香蕉,猴子想吃,但摘不到。房间得 b 处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。如图1 所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。要求通过 VC 语言编程实现猴子摘香蕉问题得求解过程。
图 1
猴子摘香蕉问题 四、源代码 #include〈stdio、h〉 unsigned int i; void Monkey_Go_Box(unsigned char x, unsigned char y) {
猴示表x//;)y ,x ,i++ ,"n\c%到走c%从yeknom:d% petS"(ftnirpﻩ子得位置,y为箱子得位置 } void Monkey_Move_Box(char x, char y)
{
printf("Step %d:monkey把箱子从%c运到%c\n", ++i, x, y);//x表示箱子得位置,y为香蕉得位置 } void Monkey_On_Box() {
printf(”Step %d:monkey爬上箱子\n", ++i); } void Monkey_Get_Banana() {
printf(”Step %d:monkey摘到香蕉\n", ++i); } void main() {
;ananaB ,xoB ,yeknoM
rahc dengisnuﻩ
;)"n\**********班1051能智********”(ftnirpﻩ
printf(”********06153034************\n”);
;)"n\**************鹏少刘********”(ftnirpﻩ
;)"n\置位得蕉香子箱子猴示表来c b a用请"(ftnirpﻩ
;)”n\ananabt\xobt\yeknoM”(ftnirpﻩ
scanf(”%c”, &Monkey);
;)(rahctegﻩ
;)”t\”(ftnirpﻩscanf(”%c", &Box);
getchar();
;)"t\t\"(ftnirpﻩ
;)ananaB& ,”c%"(fnacsﻩ
getchar();
printf("\n操作步骤如下\n”);
)xoB =! yeknoM( fiﻩ
{
;)xoB ,yeknoM(xoB_oG_yeknoMﻩ
}
if (Box != Banana)
{
ﻩ
;)ananaB ,xoB(xoB_evoM_yeknoMﻩ }
ﻩ
Monkey_On_Box();
;)(ananaB_teG_yeknoMﻩ
printf(”\n");
;)(rahctegﻩ} 五、实验结果相关截图
六、心得体会
通过本次实验,我初步了学会了使用VC得新建工程,并且进行简单得程序编写。此外我还学会如何使用一些谓词来解决生活中得一些简单问题,并且用VC 编程给出具体得操作步骤,感觉对 VC 编程有了新得认识。在实验中我也遇到过许多问题,比如在我写完代码进行编译时总就是会出现一个错误“ fatal error C1010: 在查找预编译头时遇到意外得文件结尾,就是否忘记了向源中添加“#include ‘stdafx、h’”关于这个错误我我问了几个同学得不出答案后,我决定通过上网查找,最终找到了解决方法,需要在该项目得每一个cpp结尾得文件属性中设置不使用预编译头即可。在这个过程中也锻炼了自己解决问题得能力。
人工智能课内实验报告 实验 2:编程实现简单动物识别系统得知识表示 学
院:
自动化学院
班
级:
智能1501
姓
名:
刘少鹏(33)
学
号:
06153034
日
期: 2017-3—13 10:15—12:00
实验2:编程实现 简单动物识别系统得知识 表示
一、实验目得 1、理解与掌握产生式知识表示方法; 2、能够通过 VC 编程语言实现产生式系统得规则库。
二、实验内容 1、以动物识别系统得产生式规则为例; 2、用选定得编程语言建造规则库与综合数据库,并能对它们进行增加、删除与修改操作. 三、实验步骤 1、确定需要识别得动物及其属性 本次实验得简单动物识别系统总共能识别 7 种动物,即:老虎、金钱豹、斑马、长颈鹿、企鹅、鸵鸟与信天翁。
2、建立识别七种动物识别系统得规则 3、选定编程语言并确定综合数据库与规则库结构 (1)选用C语言作为编程语言
(2)综合数据库得建立
(3)规则库得建立 四、程序源代码 #include 〈iostream〉 #include <string> using namespace std; struct RULES ﻩﻩ
ﻩ
{
int count;
;]552[erp rahcﻩ
;]552[kcab rahcﻩ
int mark; }; void check(); RULES r[100] = { ”,1 {
,} 0,"物动乳哺","发毛有ﻩ
ﻩ
//所有规则静态数据库 ”,1 {
,} 0,"物动乳哺”,"奶有ﻩ",1 {
,} 0,"鸟”,”毛羽有ﻩ
”,2 {
,} 0,"鸟","&蛋下&飞会ﻩ
{ 1,”吃肉","食肉动物”,0 }, ”,3 {
,} 0,”物动肉食",”&方前着盯睛眼&爪有&齿牙得利锋有ﻩ",2 {
,} 0,”物动乳哺类蹄有”,”&蹄有&物动乳哺ﻩ”,2 {
,} 0,”物动乳哺类蹄偶有”,”&刍反&物动乳哺ﻩ”,4 {
,} 0,"豹钱金”,"&斑暗有&色褐黄&物动肉食&物动乳哺ﻩ
{ 4,"哺乳动物&食肉动物&黄褐色&黑色条纹&”,"老虎”,0 },
{ 4,"有蹄类哺乳动物&有长脖子&有长腿&有暗斑&","长颈鹿",0 }, ”,2 {
,} 0,"马斑","&纹条黑&物动乳哺类蹄有ﻩ{ 5,"鸟&不会飞&有长脖子&有长腿&黑白色&","鸵鸟",0 }, ",4 {
,} 0,”鹅企”,"&色白黑&泳游会&飞会不&鸟ﻩ
{ 2,"鸟&会飞&","信天翁”,0 }, ”,1 {
} 0,"物动乳哺","刍反ﻩ}; int number; int m; int cat = 15; int a; int length; ﻩ ﻩﻩ //输入得事实长度 string f[255]; //ﻩ组数实事得入输ﻩvoid input()
{
while (1)
{
ﻩ
cat++;
cout 〈〈 ”number" <〈 endl;
ﻩ
cin 〉> r[cat]、count;
cout 〈< "输入事实,两种以上得事实请在每个事实后加上‘&’符号" 〈< endl;
cin 〉> r[cat]、pre;
ﻩ
cout 〈< ”输入结果” 〈〈 endl;
cin >〉 r[cat]、back;
;0 = kram、]tac[rﻩﻩ
)1( elihwﻩﻩ ﻩ
{
ﻩﻩ cout << ”输入“1"继续添加规则,输入“2”查瞧规则库" 〈< endl; ﻩ;p tniﻩ
;p >〉 nicﻩ
)1 == p( fiﻩﻩ ﻩﻩ {
ﻩ
ﻩ input();
}ﻩﻩﻩ ﻩ
else
{ﻩﻩﻩ
ﻩ if (p == 2)
ﻩﻩ
{
ﻩﻩ
ﻩ check();
ﻩ
}
ﻩ
esleﻩﻩ ﻩ
ﻩ {
ﻩ
;ldne 〈〈 "入输新重,误错入输" 〈< tuocﻩ }ﻩﻩﻩﻩ }
ﻩﻩﻩ ﻩ
}
} }
void delate() {
cout 〈< "输入要删除得条数" 〈< endl;
;rab tniﻩ
;rab >> nicﻩ
for (int t = 0; t 〈= cat; t++)
{
ﻩ ﻩ
r[bar — 1] = r[bar];
bar++;
}
;——tacﻩ
;)(kcehcﻩ} void check() {
cout 〈< endl <〈 ”规则库如下” 〈< endl;
for (int i = 0; i 〈= cat; i++)
{
ﻩ
cout << i + 1 << ”、” << "由" 〈〈 r[i]、pre 〈< ”可得" 〈< r[i]、back <〈 endl;
}
;ldne << tuocﻩ
)1( elihwﻩ
{
cout <〈 ”输入“1”继续添加规则,输入“3”删除选定得规则" <〈 endl;
;m >> nicﻩ
)1 == m( fiﻩﻩ
{ ﻩ ﻩ
input();
}
esleﻩﻩ
{
ﻩ ﻩ
if (m == 3)
ﻩ
;)(etaledﻩ
}
}
ﻩ} int find_rule(int s)
// 则规得用使可有还否是就中库则规找查ﻩ{
)++i ;51 =< i ;0 = i tni( rofﻩ ;kram、]i[r*s = sﻩﻩ //cout<〈”find_rule结果”<<s<<endl;
;s nruterﻩ} int pare1(RULES r)
//当前提条件为1时 {
int j = 0, i = 1;
string str, str2;
str = r、pre;
while (i 〈= length)
{ﻩ ﻩ if (f[i] == str)
ﻩ {
ﻩ str2 = r、back;
f[length + 1] = str2; ﻩ
//加入事实库 ﻩ;++htgnelﻩ
ﻩ
//事实库得长度加1
ﻩ
;1 = kram、rﻩ
// 过用使已则规记标ﻩﻩ ﻩﻩ break;
}ﻩ
else
ﻩ
;++iﻩ }
;kram、r nruterﻩ} int pare2(RULES r)
// 1为不件条提前ﻩ{
string b[10];
string str, str2;
;0 = mun ,1 = j ,i tniﻩ ;0 = a tniﻩ str = r、pre;
组数换转//
)i++ ;01 =!
i ;0 = i( rofﻩ {ﻩ
b[i] = ”";
}
)i++ ;)(htgnel、rts =! i ;0 = i( rofﻩ {ﻩ
)"&" =! )i(ta、rts( fiﻩﻩ
{ ﻩ;)i(ta、rts =+ ]j[bﻩ
}ﻩ esleﻩﻩ ﻩ {
j++;
ﻩ }
}ﻩ ;1 = iﻩ )tnuoc、r =< i( elihwﻩ {
)++j ;1 + htgnel =!
j ;1 = j( rofﻩ
{ﻩ ﻩﻩ if (f[j] == b[i])
{ﻩﻩﻩ
ﻩ a += 1;
}ﻩﻩﻩ ﻩ }
;++iﻩ }ﻩ )tnuoc、r == a( fiﻩ {
str2 = r、back; ﻩ
;2rts = ]1 + htgnel[fﻩﻩ //加入事实库
ﻩ length++; ﻩﻩ ﻩ //事实库得长度加1
;1 = kram、rﻩ
//标记规则已使用过
}
;kram、r nruterﻩ} void result()
{
;0 = m ,1 = i tniﻩ while (i != length + 1)
{
)"豹钱金” == ]i[f( fiﻩﻩ
{ﻩ ﻩ
cout <〈 ”该动物就是金钱豹" <〈 endl;
ﻩ
;1 = mﻩ ﻩ
;kaerbﻩ ﻩ }
ﻩ else
)”虎老" == ]i[f( fiﻩﻩ
{ﻩﻩ
ﻩ
ﻩ cout 〈< "该动物就是老虎" 〈〈 endl;
;1 = mﻩﻩ ﻩ
;kaerbﻩﻩ ﻩ
}ﻩ ﻩ
else )"鹿颈长” == ]i[f( fiﻩﻩ
ﻩ {
ﻩ cout 〈< "该动物就是长颈鹿" <〈 endl;
;1 = mﻩﻩ ﻩ
;kaerbﻩ
ﻩ }
ﻩesleﻩ ﻩ
ﻩ if (f[i] == "斑马”)
ﻩﻩ {
ﻩ
;ldne << "马斑是就物动该" << tuocﻩ ﻩﻩ
ﻩ
;1 = mﻩ ﻩ
break;
ﻩ
ﻩ
}ﻩ esleﻩﻩ ﻩ
ﻩ if (f[i] == "鸵鸟")
ﻩﻩ
ﻩﻩ {
ﻩ
ﻩ
;ldne 〈〈 "鸟鸵是就物动该" 〈〈 tuocﻩ ﻩ ;1 = mﻩﻩ
ﻩﻩ
;kaerbﻩ
} ﻩﻩﻩﻩ ﻩﻩﻩ
esleﻩ ﻩﻩﻩ ﻩ)"鹅企” == ]i[f( fiﻩ ﻩ
ﻩ
{ﻩﻩﻩ ﻩ
ﻩ
;ldne 〈< "鹅企是就物动该” 〈〈 tuocﻩ
ﻩﻩﻩ m = 1;
ﻩﻩ
ﻩ break;
ﻩ
ﻩ
}ﻩﻩ
ﻩﻩ
esleﻩﻩ ﻩﻩ
ﻩﻩﻩ
)"翁天信" == ]i[f( fiﻩ ﻩ
ﻩﻩ
ﻩﻩ {
ﻩ
ﻩ
ﻩ cout << "信天翁" 〈〈 endl;
ﻩﻩ
ﻩﻩ
;1 = mﻩ ﻩﻩ
ﻩﻩﻩ
ﻩ break;
ﻩ
ﻩ
}
ﻩﻩﻩesleﻩ
ﻩ
ﻩ
ﻩ i++;
}
)0 == m( fiﻩ ﻩ cout << ”没有符合得动物,请确认特征,重新输入” << endl;
} void idetify() {
;0 = u ,0 = i tniﻩ 则规得用使未有还中库则规果如//
)0 == )u(elur_dnif( fiﻩ//{ ;ldne<<"则规得用使未有还"〈〈tuocﻩ ;htgnel = mun tniﻩﻩ/)61〈i( elihwﻩﻩ/ﻩﻩﻩ历遍始开则规条一第从ﻩ
{ ﻩﻩ )0 == kram、]i[r( fiﻩ
// 用使未则规条该果如ﻩ
ﻩ {
if (r[i]、count == 1)
ﻩ
//该条规则前提数为1
ﻩﻩﻩ {
ﻩﻩ
u = pare1(r[i]);
ﻩ
if (u == 1)
ﻩﻩﻩ;1 = kram、]i[rﻩ ﻩ
ﻩ if (r[i]、mark == 1)
{ﻩﻩﻩ ﻩ
cout << ”使用规则" <〈 i + 1;
ﻩ
;ldne 〈< kcab、]i[r 〈〈 ”为实事新得入加且” 〈〈 tuocﻩ ﻩﻩﻩ
}
ﻩ
ﻩ }
ﻩ
esleﻩ ﻩ
{ﻩ ﻩﻩﻩ
;)]i[r(2erap = uﻩ
ﻩ
)1 == u( fiﻩﻩ ﻩ
ﻩﻩ r[i]、mark = 1;
if (r[i]、mark == 1)
ﻩﻩ
ﻩ {
ﻩﻩﻩ cout << ”使用规则” << i + 1;
ﻩﻩ
ﻩ cout 〈< "且加入得新事实为" <〈 r[i]、back 〈< endl;
ﻩﻩ
}
ﻩ
ﻩ }
ﻩ }
ﻩ
if (i == 15)
ﻩ
{ﻩ ﻩﻩ
if (num != length)
{ﻩ ﻩ ﻩ;0 = iﻩﻩﻩﻩ;htgnel = munﻩ
}ﻩ ﻩ
else
ﻩﻩﻩ
i = 16;
ﻩ
}
ﻩﻩ else
ﻩﻩ {
ﻩ i++;
ﻩ
}
}
}
esleﻩ {ﻩ
cout 〈〈 ”所有得规则都已使用” 〈〈 endl;
}ﻩ ;)(tluserﻩ} /*主函数*/ void main()
{
;ldne 〈〈 ”********班1051能智******" 〈< tuocﻩ ;ldne 〈< ”**********43035160******" 〈< tuocﻩ cout <〈 ”******刘少鹏************” << endl;
cout 〈< ”进行动物识别请输入7” 〈< endl;
cout 〈〈 ”进行规则库操作请输入8" << endl;
;a 〉> nicﻩ )8 == a(
elihwﻩ {
while (1)
ﻩ {
;ldne 〈〈 ”"2‘入输则规有已瞧查,’1‘入输则规加添” 〈〈 tuocﻩﻩ ﻩ
cin >> m;
ﻩ
if (m == 1)
{ﻩ ﻩ
input();
}
esleﻩﻩ ﻩ
{
ﻩ)2 == m( fiﻩ ﻩ
{
ﻩ check();
ﻩ
}ﻩ ﻩ
ﻩ else
ﻩ
;ldne <〈 ”入输新重请误错入输” <〈 tuocﻩ
ﻩ }
}
}
if
(a == 7)
{ﻩ
int u = 0;
;ldne 〈< "数征特得物动入输请" <〈 tuocﻩ ﻩ cin 〉〉 length;
ﻩ cout << "请输入动物得特征” 〈< endl;
)++i ;htgnel =〈 i ;1 = i tni( rofﻩ ﻩ
;]i[f 〉〉 nicﻩ ﻩ idetify(); }
;)”esuap”(metsysﻩ} 五、实验结果相关截图 1、程序总体结构
2、 规则库操作→查瞧规则库
3、 规则库操作→添加规则→添加袋鼠规则
4、 规则库操作→删除规则→删除袋鼠规则
5、动物识别→识别长颈鹿
六、心得体会
通过本次实验我深刻得理解与掌握产生式知识表示方法,并且能够通过 VC 编程语言实现产生式系统得规则库.本次实验我同样遇到许多问题,我通过自己查阅资料,与同学们
讨论,逐步得将自己得问题解决,在这个过程中提高了我得问题解决能力。最后因为本次实验只有对数据库有清楚得掌握,同时熟悉规则才能合理编程,因此我在平时得学习中应当加大数据库与数据结构得学习力度,提高自己得编程能力。
人工智能课内实验报告 实验 3:盲目搜索求解八数码问题 学
院:
自动化学院
班
级:
智能 1501
姓
名:
刘少鹏 (33)
学
号:
06153034
日
期:
2017-03—30 10:15—12:00
人工智能课内实验 3: 盲目搜索求解 8 8 数码问题
1、实验目得 (1)熟悉人工智能系统中得问题求解过程; (2)熟悉状态空间中得盲目搜索策略; (3)掌握盲目搜索算法,重点就是宽度优先搜索与深度优先搜索算法. 2、实验要求 用 VC 语言编程,采用宽度优先搜索与深度优先搜索方法,求解 8 数码问题 3、实验内容 (1)采用宽度优先算法,运行程序,要求输入初始状态 假设给定如下初始状态 S 0
2
8
3 1
6
4
7
0
5
与目标状态 S g
2
1
6
4
0
8
7
5
3
验证程序得输出结果,写出心得体会。
(2)对代码进行修改( 选作),实现深度优先搜索求解该问题 提示: :每次选扩展节点时,从数组得最后一个生成得节点开始找,找一个没有被扩展得节点。这样也需要对节点添加一个就是否被扩展过得标志。
4 源代码及实验结果截图 (1)
实验源代码
#include 〈stdlib、h〉 #include <stdio、h> Typedef struct Node { int num[9]; //棋盘状态
int deepth; //派生得深度 g(n)
int diffnum; //不在位得数目 h(n)
int value; //耗散值 f(n)=g(n)+h(n)
struct Node * pre;
;txen * edoN tcurtsﻩ
struct Node * parent; }numNode;
/* -- end of struct numNode —— */ int origin[9]; //棋盘初始状态 int target[9]; //棋盘目标状态 int numNode_num, total_step; numNode *open, *close; //Open表与 Close 表 numNode *create_numNode() {
;))edoNmun(foezis(collam)* edoNmun( nruterﻩ}
numNode *open_getfirst(numNode *head); //返回第一项,并从 Open表中删除 void open_insert(numNode *head, numNode *item); //向 Open表中按序插入新节点 void close_append(numNode *head, numNode *item); //向 Close 表中插入新节点 int expand(numNode *item); //扩展节点 int print_result(numNode *item); //打印结果 numNode *copy_numNode(numNode *orgin); char isNewNode(numNode *open, numNode *close, int num[9]); //就是否在 Open 表或 Close表中 void print_num(int num[9]); //打印棋盘状态 int diff(int num[9]); //求不在位棋子得个数 void init(); //初始化,获得棋盘初始状态与目标状态 void s *a, int *b); int operate(int num[], int op); void free_list(numNode *head); //* Name: 主函數 //* Description:
程序入口 int main(int argc, char *argv[])
{
//初始化 Open表与Close 表
;)"n\****1051 能智*****”(ftnirpﻩ
printf("*****刘少鹏******\n”);
;)”n\****43035160*****"(ftnirpﻩ
;)(edoNmun_etaerc = nepoﻩ
close = create_numNode();
= txen〉—esolc = erp>—esolc = txen>-nepo = erp〉-nepoﻩNULL;
态状标目与始初入输户用由// ;)(tiniﻩ ﻩ // 点节始初化始初ﻩ
;1p* edoNmunﻩ
;)(edoNmun_etaerc = 1pﻩ
;LLUN = tnerap〉-1pﻩ
;0 = htpeed〉—1pﻩ
;0 = i tniﻩ
for (i = 0; i〈9; i++)
{
ﻩ
;]i[nigiro = ]i[mun>—1pﻩﻩ }
ﻩ
open_insert(open, p1);
numNode_num = 1;
p1 = open_getfirst(open);
while (p1 != NULL)
{
;)1p ,esolc(dneppa_esolcﻩﻩ
))1p(dnapxe( fiﻩ
;SSECCUS_TIXE nruterﻩ
p1 = open_getfirst(open);
}
;)"n\!noitulos oN”(ftnirpﻩ
return EXIT_SUCCESS; }
/* -—----—--- end of function main -——--——--— */ void init()
{
while (1)
{ﻩ
printf(”Please input opriginal status:\nFor example:123456780 stands for\n"
\3
2
1” ”nﻩ
ﻩ ”4
5
6\n”
ﻩ \0
8
7” ;)”nﻩ
;]01[pmet rahcﻩ ;)pmet& ,"s%”(fnacsﻩﻩ
int i = 0;
]i[pmet && 0 =〉 ’0’ - ]i[pmet && 9〈i ;0 = i( rofﻩ- "0’ 〈= 8; i++)
{ﻩﻩ
origin[i] = temp[i] - "0';
ﻩ }
printf("Please input target status:\n”);
;)pmet& ,"s%"(fnacsﻩ ;0 = j tniﻩﻩ' - ]j[pmet && 0 =〉 "0" - ]j[pmet && 9〈j ;0 = j( rofﻩﻩ0' <= 8; j++)
ﻩ {
;’0’ — ]j[pmet = ]j[tegratﻩﻩ
}ﻩ
;)"slc"(metsysﻩ
if (i == 9 && j == 9)
{
ﻩ
;kaerbﻩ
}
} }
/* —--—— end of function init —-—-— */ void open_insert(numNode *head, numNode *item)
{
;q* ,p* edoNmunﻩ ;txen>—daeh = pﻩ q = head;
)eulav〉-p 〉 eulav>—meti && LLUN =! p( elihwﻩ {
;p = qﻩﻩ
;txen〉-p = pﻩ }
q—>next = item;
;q = erp〉-metiﻩ ;p = txen>-metiﻩ if (p != NULL)
{ﻩ ;meti = erp>—pﻩﻩ }ﻩ}
/* —-—-— end of function open_insert —--—- */ numNode *open_getfirst(numNode *head) {
;p* edoNmunﻩ )LLUN == txen〉-daeh( fiﻩ {ﻩ
;LLUN nruterﻩ }ﻩ p = head—〉next;
;txen>-p = txen>-daehﻩ if (p—〉next != NULL)
{ﻩ ﻩ p—>next—〉pre = head;
}
p—〉pre = NULL;
p->next = NULL;
;p nruterﻩ
}
/* -—-—— end of function open_getfirst -———— */ void close_append(numNode *head, numNode *item)
{
;txen〉—daeh = txen〉-metiﻩ ;daeh = erp>—metiﻩ head-〉next = item;
)LLUN =!
txen>-meti( fiﻩ {
;meti = erp>—txen>-metiﻩﻩ }ﻩ}
/* ————- end of function close_append -—-—- */ int expand(numNode *p1) {
numNode * p2;
int op = 1;
)++po ;4 =< po ;1 = po( rofﻩ {ﻩ
p2 = copy_numNode(p1);
;)po ,mun〉—2p(etarepoﻩﻩ
if (isNewNode(open, close, p2-〉num)
== ’N")
{ﻩﻩﻩ;1p = tnerap〉—2pﻩ ﻩ
p2->deepth = p1—>deepth + 1;
ﻩ
;)mun>-2p(ffid = munffid〉-2pﻩ
;munffid〉—2p + htpeed>—2p = eulav〉—2pﻩﻩ)0 == munffid〉-2p( fiﻩ
{ﻩ
total_step = print_result(p2);
ﻩ
;)pets_latot ,"n\d% :pets latoT"(ftnirpﻩ
;)nepo(tsil_eerfﻩ
ﻩﻩ free_list(close);
ﻩ return 1;
ﻩ
}ﻩ
esleﻩﻩ {ﻩﻩﻩ
;++mun_edoNmunﻩ
open_insert(open, p2);
} ﻩﻩ
}ﻩ ﻩ else
free(p2);
}
return 0; }
/* ——--— end of function expand -—-—- */ int operate(int m[], int op) {
;knalb tniﻩ blank = 0;
while (m[blank] != 0 && blank<9)
ﻩ ++blank;
if (blank == 9)
;1 nruterﻩﻩ { )po( hctiwsﻩ case 1:
/* up */
)2〉knalb( fiﻩ
;)3 - knalb + m ,knalb + m(pawsﻩ
break;
case 2: /* down */
)6〈knalb( fiﻩﻩﻩ;)3 + knalb + m ,knalb + m(pawsﻩ ﻩ break;
/* tfel */ :3 esacﻩ
if (blank != 0 && blank != 3 && blank != 6)
ﻩ
swap(m + blank, m + blank — 1);
;kaerbﻩ case 4:
/* right */
if (blank != 2 && blank != 5 && blank != 8) ﻩ;)1 + knalb + m ,knalb + m(pawsﻩ ﻩ break;
default: return 1;
}
return 0; } void s *a, int *b)
{
int c;
c = *a;
*a = *b; * ;c = bﻩ} numNode * copy_numNode(numNode *origin) {
numNode *p;
;)(edoNmun_etaerc = pﻩ p—>deepth = origin—〉deepth;
p-〉diffnum = origin—>diffnum;
;eulav〉-nigiro = eulav〉-pﻩ int i;
)++i ;9<i ;0 = i( rofﻩ {
ﻩ (p->num)[i] = (origin->num)[i];
}
;p nruterﻩ}
/* -—-—— end of function copy_numNode ——--— */ int diff(int num[9])
{
;0 = munffid ,i tniﻩ )++i ;9〈i ;0 = i( rofﻩ
)]i[tegrat =!
]i[mun( fiﻩ ﻩ
diffnum++;
return diffnum; }
/* ——--— end of function diff —--—- */ char isNewNode(numNode *open, numNode *close, int num[9]) {
numNode *p;
int i = 0;
;txen>-nepo = pﻩ while (p != NULL)
{ﻩ ﻩ for (i = 0; i<9; i++)
ﻩ {
ﻩ
if (p—>num[i] != num[i])
ﻩ
;kaerbﻩ }ﻩﻩ ﻩ if (i == 9)
return ’O’; //Open
ﻩ p = p->next;
}ﻩ ;txen〉—esolc = pﻩ while (p != NULL)
{ﻩ )++i ;9<i ;0 = i( rofﻩﻩ
{
)]i[mun =! ]i[mun>-p( fiﻩ
break;
ﻩ }
ﻩ if (i == 9)
esolC// ;"C" nruterﻩ
p = p->next;
}
;’N’ nruterﻩ}
/* -—-—— end of function isNewNode --—-- */ void free_list(numNode *head) {
numNode *p, *q;
p = head—〉next;
while (p != NULL)
{ ;txen〉-p = qﻩ ﻩ free(p);
ﻩ p = q;
}ﻩ free(head); }
/* -———— end of function free_list —--—- */ void print_num(int num[9])
{
int i;
for (i = 0; i<9; i++)
ﻩ{ ;)]i[mun ,"t\d%”(ftnirpﻩ
)2 == )3 % i(( fiﻩ
;)”n\"(ftnirpﻩﻩ }ﻩ}
/* —-—-- end of function print_num ---—- */ int print_result(numNode *item)
{
numNode *p;
int step;
;meti = pﻩ if (p != NULL)
{
ﻩ step = print_result(p->parent);
;)1 + pets ,"n\:d% petSn\"(ftnirpﻩﻩ ;)mun>-p(mun_tnirpﻩﻩ ﻩ return step + 1;
}ﻩ else
{
ﻩ return -1;
}ﻩ} (2)实验截图
5 心得体会
本次实验对我最大得收获就就是我再解决问题得过程中提高了C语言编程能力,对用编程解决实际问题有了更加深刻得认识。此次实验我采用了宽度优先算法,成功得完成了本次实验,我对宽度优先算法有了更为深刻得理解,我相信我再经过几次宽度优先算法得练习,我就可以用它来解决一些生活中得实际问题。
人工智能课内实验报告 实验 4:回溯算法求解四皇后问题 学
院:
自动化学院
班
级:
智能 1501
姓
名:
刘少鹏 (33)
学
号:
06153034
日
期:
2017-04-05 10:15—12:00
实验4
回溯算法求解四皇后问题 1 实验目得: 理解搜索得概念,掌握回溯搜索算法,用回溯算法求解四皇后问题、 2 实验要求:
用 VC 编程实现求解四皇后问题得回溯过程,根据实验结果写出回溯算法得总结、 3 实验结果分析:
回朔算法总结: 回朔算法就是从一条路往前走,能进则进,不能进则退回来,换一条路再试。本次四皇后就就是回溯算法,第一步按照顺序放一个皇后,然后第二步符合要求放第 2 个皇后,如果没有位置符合要求,那么就要改变第一个皇后得位置,重新放第 2 个皇后得位置,直到找到符合条件得位置就可以了。
回朔算法就是一个既带有系统性又带有跳跃性得得搜索算法。它在包含问题得所有解得解空间树中,按照深度优先得策略,从根结点出发搜索解空间树。算法搜索至解空间树得任一结点时,总就是先判断该结点就是否肯定不包含问题得解.如果肯定不包含,则跳过对以该结点为根得子树得系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先得策略进行搜索。回溯法在用来求问题得所有解时,要回溯到根,且根结点得所有子树都已被搜索遍才结束。而回朔算法在用来求问题得任一解时,只要搜索到问题得一个解就可以结束。这种以深度优先得方式系统地搜索问题得解得算法称为回溯法,它适用于解一些组合数较大得问题。
4 实验得心得体会:
通过本次实验我理解了搜索得概念,掌握了回溯搜索算法,学会了用回溯算法求解四皇后问题。实验中我遇到了很多问题,但就是通过自己得努力,与同学得帮助,我顺利得完成了实验,在此过程中我有了很大得收获,我对回朔算法有了更深刻得理解,我在此次实验结束后,我想回朔算法可以求解四皇后问题,那么八皇后,十皇后,N 皇后问题该怎么解决,我想通过自己得不断学习这些问题都将一一解决。
参考示例代码:
#include 〈stdio、h> #define bool int #define false 0 #define true 1 int Num=1; //用来记录有几种实现方法 int q[5]; bool C[5];//C[1]~C[4],布尔型变量,当前列就是否安全
bool L[9]; //L[2]~L[8],布尔型变量,(i-j)对角线(从左上角到右下角)就是否安全
2〈=(i—j)+5〈=8; bool R[9]; //R[2]~R[8],布尔型变量,(i+j)对角线(从右上角到左下角)就是否安全 2〈=i+j<=8 int qipan[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; void Try(int i)
//皇后放置函数 {
int j,k,n,m;
)++j;5〈j;1=j(rofﻩ {
列 j 第 行 i 第示表//))eurt==]j+i[R(&&)eurt==]5+j-i[L(&&)eurt==]j[C((fiﻩ就是安全得
ﻩ {
q[i] = j;
//
第一件事,既然 i 行,j 列安全,就放置皇后在(i,j)处
ﻩ
C[j] = false;
// i 行,j列 放置皇后后不再安全
ﻩ
全安再不将线角对得角下右到角上左从得在所)j,i( //
;eslaf = ]5+j-i[Lﻩ
;eslaf = ]j+i[Rﻩ
后皇个 4 完放否是就断判,事件二第//
)4<i(fiﻩ {ﻩﻩﻩ ﻩﻩ
个一下放着接则,后皇个四完放未//
;)1+i(yrTﻩ }ﻩﻩﻩ
ﻩ else
//四个皇后已经放完
ﻩﻩ {
ﻩ
Num++;
ﻩﻩ
printf("方案:%d\n”,Num);
for(k=1;k〈5;k++)
ﻩ
{
ﻩ
qipan[k—1][q[k]—1]=1;//输出棋盘,皇后用 1 表示,0表示该位置无皇后
}
ﻩ
)++m;4<m;0=m(rofﻩﻩ
ﻩ {
ﻩ
for(n=0;n〈4;n++)
ﻩﻩ
printf("%d\t",qipan[m][n]);
ﻩﻩﻩ
printf(”\n");
ﻩ
ﻩ }
for(m=0;m〈4;m++)
//棋盘再次初始化
ﻩ)++n;4〈n;0=n(rofﻩ
ﻩ
qipan[m][n]=0;
ﻩﻩ }
ﻩ
溯回,志标得全安改修,事件三第//
;eurt=]j[Cﻩ ﻩﻩ L[i—j+5]=true; ﻩ;eurt=]j+i[Rﻩ }ﻩﻩ } } int main(void) {
int i;
;0 = muNﻩ printf(”****实验四 回溯算法四皇后******\n”);
printf("****智能 1501 班****\n");
;)”n\******43035160****”(ftnirpﻩ ;)”n\********鹏少刘****”(ftnirpﻩ ;)"n\后皇无置位该示表0,后皇有置位该示表1"(ftnirpﻩ )++i;5〈i;1=i(rofﻩ {ﻩ
C[i]=true;
}ﻩ for(i=0;i<9;i++)
{
;eurt = ]i[R = ]i[Lﻩﻩ }ﻩ Try(1);
return 0; }
人工智能课内实验报告 实验5: 编程实现一字棋游戏
学
院:
自动化学院
班
级:
智能 1501
姓
名:
刘少鹏 (33)
学
号:
06153034
日
期:
2017-04—11 10:15-12:00
实验5 编程实现一字棋游戏 1 1 实验目得 :
(1)理解与掌握博弈树得启发式搜索过程;
(2)熟悉博弈中两种最基本得搜索方法——极大极小过程与过程;
(3)能够用 VC 编程语言设计简单得博弈游戏. 2实验要求 :
用VC 编程实现一字棋,根据实验结果写出总结。
3 实验结果 分析 : 3、1 实验代码 #include 〈iostream> #include <windows、h> #include 〈conio、h〉 #include <string> #include <ctime> using namespace std; #define
MAX_NUM 1000
//计算机获胜得标志 #define
NO_BLANK —1001//人获胜得标志 #define
TREE_DEPTH 3
//递归深度 #define
NIL 1001
//根节点得函数走步评估值 class State
//棋盘状态节点,一个State实例就就是一个棋盘得状态节点,从而形成一颗树状结构 { public:
int QP[3][3];
//当前棋盘数组
int e_fun;
//评分结果
点节态状有所得步一后得下态状盘棋前当//
;]9[dlihc tniﻩ
int parent;
//当前棋盘状态下得父母节点下标
标下点节得优最nuf_e里]9[dlihc在//
;dlihCtseb tniﻩ}; class Tic { public:
盘棋时临得归递层于用// ;]3[]3[PQpmt tniﻩ static int s_count;//叶子节点得静态总数
组数点节态状盘棋//;]MUN_XAM[setatS etatSﻩ Tic()
}{ﻩ void init() //初始化棋盘,将各个位置得棋盘都置为
{ﻩ ;0 = tnuoc_sﻩﻩ ﻩ for (int i = 0; i<3; i++)
)++j ;3〈j ;0 = j tni( rofﻩ {ﻩﻩﻩ ﻩ
;0 = ]j[]i[PQ、]0[setatSﻩ ﻩ
}
ﻩ States[0]、parent = NIL;
}
示显面界盘棋//)(PQtnirP diovﻩ {ﻩ
)++i ;3〈i ;0 = i tni( rofﻩ
{ﻩ ﻩ
)++j ;3〈j ;0 = j tni( rofﻩ ﻩ
{
;’t\’ <〈 ]j[]i[PQ、]0[setatS 〈〈 tuocﻩﻩ ﻩﻩ }
ﻩ
;ldne <〈 tuocﻩ }ﻩﻩ }ﻩ 胜获方一何任令有否是就态状盘棋得前当断判// )s etatS(niWsI tniﻩ {
;0 = i tniﻩ
)++i ;3〈i ;0 = i( rofﻩ
{
nruter)1 == ]2[]i[PQ、s && 1 == ]1[]i[PQ、s && 1 == ]0[]i[PQ、s( fiﻩﻩ1; ﻩnruter)1- == ]2[]i[PQ、s && 1— == ]1[]i[PQ、s && 1- == ]0[]i[PQ、s( fiﻩ-1;
}ﻩ
)++i ;3<i ;0 = i( rofﻩ
{
ﻩ
if (s、QP[0][i] == 1 && s、QP[1][i] == 1 && s、QP[2][i] == 1)return 1; ﻩ)1- == ]i[]2[PQ、s && 1— == ]i[]1[PQ、s && 1- == ]i[]0[PQ、s( fiﻩreturn -1;
ﻩ }
ﻩ if ((s、QP[0][0] == 1 && s、QP[1][1] == 1 && s、QP[2][2] == 1) || (s、QP[2][0] == 1 && s、QP[1][1] == 1 && s、QP[0][2] == 1))return 1;
== ]2[]2[PQ、s && 1— == ]1[]1[PQ、s && 1— == ]0[]0[PQ、s(( fiﻩﻩ—1)
|| (s、QP[2][0] == —1 && s、QP[1][1] == —1 && s、QP[0][2] == -1))return -1;
return 0;
}
数函价评定判能智器机//)s etatS(nuf_e tniﻩ {
ﻩ bool flag = true;
int i = 0;
ﻩ for (i = 0; i〈3; i++)
for (int j = 0; j〈3; j++)
ﻩ
if (s、QP[i][j] == 0)flag = false;
;KNALB_ON nruter)galf( fiﻩ
if (IsWin(s)
== -1)return -MAX_NUM;
;MUN_XAM nruter)1 == )s(niWsI( fiﻩ ;0 = tnuoc tniﻩﻩ )++i ;3<i ;0 = i( rofﻩﻩ
for (int j = 0; j<3; j++)
ﻩ
if (s、QP[i][j] == 0)tmpQP[i][j] = 1;
;]j[]i[PQ、s = ]j[]i[PQpmt esleﻩ ﻩ
for (i = 0; i〈3; i++) ﻩﻩﻩ;3 / )]2[]i[PQpmt + ]1[]i[PQpmt + ]0[]i[PQpmt( =+ tnuocﻩ
ﻩ
)++i ;3〈i ;0 = i( rofﻩ ﻩ
ﻩﻩ count += (tmpQP[0][i] + tmpQP[1][i] + tmpQP[2][i]) / 3;
ﻩ
;3 / )]2[]2[PQpmt + ]1[]1[PQpmt + ]0[]0[PQpmt( =+ tnuocﻩ ﻩﻩﻩ count += (tmpQP[2][0] + tmpQP[1][1] + tmpQP[0][2]) / 3;
ﻩﻩ
for (i = 0; i〈3; i++)
)++j ;3〈j ;0 = j tni( rofﻩﻩ
ﻩﻩﻩ
;1- = ]j[]i[PQpmt)0 == ]j[]i[PQ、s( fiﻩ ﻩﻩ
else tmpQP[i][j] = s、QP[i][j];
ﻩﻩ
)++i ;3<i ;0 = i( rofﻩ ﻩ
ﻩ
;3 / )]2[]i[PQpmt + ]1[]i[PQpmt + ]0[]i[PQpmt( =+ tnuocﻩﻩ
ﻩ ﻩ)++i ;3〈i ;0 = i( rofﻩ ﻩ
ﻩ
count += (tmpQP[0][i] + tmpQP[1][i] + tmpQP[2][i]) / 3;
ﻩﻩ
count += (tmpQP[0][0] + tmpQP[1][1] + tmpQP[2][2])
/
3;
ﻩ
ﻩ
count += (tmpQP[2][0] + tmpQP[1][1] + tmpQP[0][2]) / 3;
ﻩ
;tnuoc nruterﻩ }ﻩ )(enoDotuA loob lautrivﻩ {ﻩ ;eslaf nruterﻩﻩ }ﻩ 入输得户用取获//)(tupnIresU diovﻩ {
;y ,x ,sop tniﻩﻩ L1: cout 〈〈 ”请输入棋子得坐标xy: ”;
cin 〉> pos;
ﻩ x = pos / 10, y = pos % 10;
ﻩ if (x>0 && x<4 && y〉0 && y<4 && States[0]、QP[x - 1][y — 1] == 0)
States[0]、QP[x — 1][y — 1] = -1;
esleﻩ
{
cout << ”非法输入!";
;1L otogﻩﻩ }ﻩﻩ } }; int Tic::s_count = 0;//初始化棋盘状态节点总数,刚开始置为 class demo : public Tic { public:
)(omedﻩ {}
)(egduJ loobﻩ {ﻩ ﻩ int i, j, a = 0;
)++i ;3<i ;0 = i( rofﻩﻩﻩ)++j ;3<j ;0 = j( rofﻩ;++a )0 == ]j[]i[PQ、]0[setatS( fiﻩﻩ ﻩ if (a == 0)return true;
;eslaf
nruterﻩ }ﻩ virtual bool AutoDone()
{ﻩ
int a, b, i, j, m, n, max, min, x, y;
if (IsWin(States[0])
== —1)
{ﻩﻩ
ﻩ
cout <〈 ”恭喜您获胜!" 〈< endl; ﻩ;eurt nruterﻩ
}ﻩ ﻩ a = 0, b = 0;
;00001— = xamﻩ
)++x ;3〈x ;0 = x( rofﻩ
)++y ;3〈y ;0 = y( rofﻩ
ﻩﻩ States[11]、QP[x][y] = States[0]、QP[x][y];
)++i ;3〈i ;0 = i( rofﻩ ﻩﻩ for (j = 0; j<3; j++)
ﻩ {
ﻩﻩ if (States[0]、QP[i][j] == 0)
ﻩﻩ
{ﻩ ﻩ ﻩ;1 = aﻩ ﻩ
ﻩ for (x = 0; x〈3; x++)
ﻩﻩﻩ
)++y ;3<y ;0 = y( rofﻩﻩ
ﻩ
;]y[]x[PQ、]0[setatS = ]y[]x[PQ、]a[setatSﻩﻩ
ﻩ
States[a]、QP[i][j] = 1;
ﻩ;00001 = nimﻩ
)++m ;3〈m ;0 = m( rofﻩ ﻩ
)++n ;3〈n ;0 = n( rofﻩﻩ ﻩﻩﻩ
{ﻩ ﻩﻩ
ﻩ if (States[a]、QP[m][n] == 0)
{ﻩ ﻩﻩﻩﻩ ﻩﻩ ;1 = bﻩﻩ
)++x ;3〈x ;0 = x( rofﻩﻩ ﻩ
ﻩﻩﻩ
ﻩ for (y = 0; y〈3; y++)
ﻩ
ﻩﻩ
ﻩ
;]y[]x[PQ、]a[setatS = ]y[]x[PQ、]01[setatSﻩ
ﻩﻩﻩ
States[10]、QP[m][n] = —1;
ﻩﻩ
States[10]、e_fun = e_fun(States[10]);
ﻩ
ﻩ
if (States[10]、e_fun〈min) min = States[10]、e_fun;
ﻩ
ﻩﻩ
ﻩ }
ﻩﻩ }
ﻩ
;nim = nuf_e、]a[setatSﻩ ﻩ
ﻩ
if (States[a]、e_fun>max)
ﻩ
ﻩﻩ {
ﻩ
ﻩﻩ
max = States[a]、e_fun;
ﻩﻩ
ﻩ
)++x ;3〈x ;0 = x( rofﻩ ﻩ
ﻩﻩﻩ
for (y = 0; y〈3; y++)
ﻩ ﻩﻩﻩ;]y[]x[PQ、]a[setatS = ]y[]x[PQ、]11[setatSﻩ ﻩ
}ﻩﻩ ﻩﻩ
}
}ﻩ
ﻩ for (x = 0; x<3; x++)
ﻩ for (y = 0; y<3; y++)
ﻩﻩ
;]y[]x[PQ、]11[setatS = ]y[]x[PQ、]0[setatSﻩ ﻩ cout <〈 "计算机走棋” 〈< endl;
;)(PQtnirPﻩ ﻩ if (IsWin(States[0]) == 1)
{ﻩ ﻩ
cout 〈〈 ”抱歉您输了,计算机获胜!” 〈< endl;
;eurt nruterﻩ }ﻩﻩ
else if (IsWin(States[0]) == —1)
{
cout << ”恭喜您获胜!” << endl;
ﻩﻩ return true;
}
;eslaf nruterﻩ } }; void main() {
cout 〈< "****项目名称:一字棋游戏得实现****" << endl;
;ldne << ”****
1 0 5 1 能 智:级
班****" << tuocﻩ ;ldne << "****鹏
少
刘:名
姓****" << tuocﻩ ;ldne 〈〈 ”**** 4 3 0 3 5 1 6 0:号
学****” << tuocﻩ
cout <〈 ”****说
明:—1代表人落子位置,1代表电脑落子位置,0代表该位置无棋子 ****" 〈〈 endl;
;)”戏游小能智棋子# eltit”(metsysﻩ ;)”2A roloc"(metsysﻩ char IsFirst;
bool IsFinish;
;ldne 〈〈 ”:’N’入输请,之反!'Y’入输请,手先为您若" 〈〈 tuocﻩ ;tsriFsI 〉〉 nicﻩ ;)(omed wen = p* omedﻩ p-〉init();
;ldne << ":态状始初得盘棋” 〈< tuocﻩ ;)(PQtnirP>—pﻩ { odﻩ
))(egduJ〉—p!( fiﻩ ﻩ { ﻩ)"Y" == tsriFsI( fiﻩ
{ﻩﻩ
ﻩ p-〉UserInput(); p—>PrintQP();
))(egduJ>-p!( fiﻩ
{ﻩ
ﻩ;)(enoDotuA〉—p = hsiniFsIﻩ
ﻩ
}ﻩ
ﻩ }
ﻩ
else if (IsFirst == "N')
{ﻩﻩ ﻩ
IsFinish = p->AutoDone();
ﻩ
if (!p-〉Judge())
{ﻩﻩﻩﻩ
ﻩ
if (!IsFinish) { p—〉UserInput(); p-〉PrintQP(); }
}
}ﻩﻩﻩ
}
if (p—〉Judge()) IsFinish = true;
} while (!IsFinish);
if ((p->IsWin(p—>States[0])
== 0)
&& p->Judge())
{
cout 〈< "平局” 〈< endl;
}ﻩ system(”pause"); } 3、2、实验运行结果截图
4、实验心得 本次实验,我通过学习用 VC 编程语言设计简单得博弈游戏,从而理解与掌握博弈树得启发式搜索过程,熟悉博弈中两种最基本得搜索方法——极大极小过程与过程。并且将这种思想通过代码表现出来。
本次实验我最大得收获不仅仅就是学到了课本上得知识,更就是学会了如何主动得求解问题得答案。实验中我遇到了许多困难,不仅仅就是有关编程算法方面得,还有一些代码逻辑流程得设计。这些困难我通过上网与去图书馆查找资料或者向同学请教等方式,逐一解决了困难,我收获良多。
ﻫ人工智能课内实验报告 实验 6: 子句集消解实验
学
院:
自动化学院
班
级:
智能 1501
姓
名:
刘少鹏 (33)
学
号:
06153034
日
期:
2017-05—8 10:15-12:00
实验 6 子句集消解实验
一、实验目得
(1)熟悉子句集化简得九个步骤; (2)理解消解规则,能把任意谓词公式转换成子句集。
二、编程环境
Visual Studio 2017
三、实验原理
在谓词逻辑中,任何一个谓词公式都可以通过应用等价关系及推理规则化成相应得子句集。
其化简步骤如下:
(1) 消去连接词“→”与“↔” 反复使用如下等价公式:
P→Q ⇔﹁ P∨Q
P↔Q ⇔ (P∧Q)∨(﹁P∧﹁Q) 即可消去谓词公式中得连接词“→”与“↔”。
(2) 减少否定符号得辖域 反复使用双重否定率
﹁(﹁P)
⇔ P
摩根定律
﹁(P∧Q) ⇔﹁P∨﹁Q
﹁(P∨Q) ⇔﹁P∧﹁Q
量词转换率
﹁ (∀x)P(x∃x)
﹁P(x)
﹁ (∃x)P(x) ⇔ (∀x)¬P(x) 将每个否定符号“﹁”移到仅靠谓词得位置,使得每个否定符号最多只作用于一个谓词上。
(3) 对变元标准化 在一个量词得辖域内,把谓词公式中受该量词约束得变元全部用另外一个没有出现过得任意变元代替,使不同量词约束得变元有不同得名字.
(4) 化为前束范式 化为前束范式得方法:把所有量词都移到公式得左边,并且在移动时不能改变其相对顺序。
(5) 消去存在量词 (6) 化为Skolem标准形
对上述前束范式得母式应用以下等价关系
P∨(Q∧R) ⇔ (P∨Q)∧(P∨R) (7) 消去全称量词 (8) 消去合取词 在母式中消去所有合取词,把母式用子句集得形式表示出来。其中,子句集中得每一个元素都就是一个子句。
(9) 更换变量名称 对子句集中得某些变量重新命名,使任意两个子句中不出现相同得变量名。
四、实验结果及代码
//化简子句集得九步法演示 //作者:刘少鹏 //时间:2017、5 #include<iostream> #include<sstream> #include〈stack〉 #include〈queue> using namespace std; //一些函数得定义 void initString(string &ini);//初始化 string del_inlclue(string temp);//消去蕴涵符号 string dec_neg_rand(string temp);//减少否定符号得辖域 string standard_var(string temp);//对变量标准化 string del_exists(string temp);//消去存在量词 string convert_to_front(string temp);//化为前束形 string convert_to_and(string temp);//把母式化为合取范式 string del_all(string temp);//消去全称量词 string del_and(string temp);//消去连接符号合取% string change_name(string temp);//更换变量名称
ﻩ
ﻩﻩ //辅助函数定义 bool isAlbum(char temp);//就是字母 string del_null_bracket(string temp);//删除多余得括号 string del_blank(string temp);//删除多余得空格 void checkLegal(string temp);//检查合法性 char numAfectChar(int temp);//数字显示为字符
ﻩ
ﻩﻩ //主函数
void main() { —-—-----———示演法步九集句子求—-----————----——-—” 〈< tuocﻩ—-----———--—” << endl;
;)"A0 roloc”(metsysﻩ// ;")y(P(~%)y,x(Q" = ngiroﻩ// ;”)P〉)y(P()x(” = ngiroﻩ// ;”)x(y)x#(~” = ngiroﻩ// ;”))x(b!x)x((~” = ngiroﻩ //orign = "~(x!y)”;
//orign = "~(~a(b))";
string orign, temp;
char mand, mand0, mand1, mand2, mand3, mand4, mand5,
mand6, mand7, mand8, mand9, mand10; ====================================================//ﻩ=========================
cout 〈〈 ”请输入(Y/y)初始化谓词演算公式" << endl;
cin >〉 mand;
if (mand == ’y’ || mand == ’Y')
;)ngiro(gnirtStiniﻩ esleﻩ
;)0(tixeﻩ===========================================================//ﻩ==================
cout 〈〈 ”请输入(Y/y)消除空格" 〈< endl;
cin 〉> mand0;
)"Y’ == 0dnam || "y’ == 0dnam( fiﻩ {ﻩ
//del_blank(orign);//undone
cout << "消除空格后就是" 〈〈 endl
<〈ﻩ
;ldne <〈 ngiroﻩ }ﻩ else
;)0(tixeﻩ //=============================================================================
;ldne 〈< ”项涵蕴去消)y/Y(入输请” <〈 tuocﻩ cin >〉 mand1;
if (mand1 == 'y’ || mand1 == "Y’)
{ﻩ
orign = del_inlclue(orign);
ldne <〈 ”是就后项涵蕴去消" 〈〈 tuocﻩ <<ﻩ;ldne << ngiroﻩ }
else
exit(0);
//=============================================================================
;ldne << "域辖得号符定否少减)y/Y(入输请" << tuocﻩ cin >> mand2;
)’Y' == 2dnam || ’y" == 2dnam( fiﻩ {ﻩ
odﻩ {ﻩﻩﻩ
;ngiro = pmetﻩﻩ;)ngiro(dnar_gen_ced = ngiroﻩ }
;)ngiro =! pmet( elihwﻩ ldne 〈< ”是就后域辖得号符定否少减” <〈 tuocﻩﻩ <〈
;ldne 〈< ngiroﻩﻩ }
esleﻩ
exit(0); ==========================================================//ﻩ=================== ﻩ cout 〈〈 ”请输入(Y/y)对变量进行标准化” << endl;
cin >> mand3;
if (mand3 == "y' || mand3 == 'Y')
{ﻩ
;)ngiro(rav_dradnats = ngiroﻩ
cout 〈〈 "对变量进行标准化后就是” 〈〈 endl
<〈 ;ldne << ngiroﻩﻩ }ﻩ esleﻩ
;)0(tixeﻩ=========================================================//ﻩ==================== ﻩ cout << ”请输入(Y/y)消去存在量词" 〈< endl;
;4dnam 〉> nicﻩ )"Y" == 4dnam || "y" == 4dnam( fiﻩ {
orign = del_exists(orign);
ldne <〈 ")数函 melokS 个一是就)x(g = w(是就后词量在存去消” 〈〈 tuocﻩ
ﻩ 〈< orign <〈 endl;
}
else
;)0(tixeﻩ //============================================================================= ﻩ
cout << "请输入(Y/y)化为前束形" << endl;
cin 〉> mand5;
)’Y’ == 5dnam || "y' == 5dnam( fiﻩ {
;)ngiro(tnorf_ot_trevnoc = ngiroﻩ
cout <〈 ”化为前束形后就是” <〈 endl
<<
;ldne 〈< ngiroﻩﻩ }ﻩ else
;)0(tixeﻩ //============================================================================= ﻩ cout 〈< ”请输入(Y/y)把母式化为合取方式" 〈< endl;
;6dnam >> nicﻩ )"Y’ == 6dnam || "y' == 6dnam( fiﻩ {ﻩ
;)ngiro(dna_ot_trevnoc = ngiroﻩ
ldne 〈〈 "是就后式方取合为化式母把" <〈 tuocﻩ 〈<ﻩ
;ldne 〈< ngiroﻩ }
else
;)0(tixeﻩ===========================================================//ﻩ==================
cout 〈< "请输入(Y/y)消去全称量词” 〈〈 endl;
;7dnam >〉 nicﻩ if (mand7 == ’y’ || mand7 == "Y’)
{
;)ngiro(lla_led = ngiroﻩ
ldne << "是就后词量称全去消” << tuocﻩ
<< ;ldne 〈< ngiroﻩﻩ }ﻩ esleﻩ ;)0(tixeﻩﻩ //=============================================================================
cout 〈< ”请输入(Y/y)消去连接符号” 〈〈 endl;
;8dnam 〉〉 nicﻩ if (mand8 == ’y" || mand8 == ’Y")
{
;)ngiro(dna_led = ngiroﻩ
cout 〈< "消去连接符号后就是” <〈 endl
〈<ﻩ;ldne 〈〈 ngiroﻩ }
esleﻩ
;)0(tixeﻩ=======================================================//ﻩ======================
cout 〈〈 "请输入(Y/y)变量分离标准化” <〈 endl;
;9dnam >> nicﻩ )’Y’ == 9dnam || "y" == 9dnam( fiﻩ {ﻩ
;)ngiro(eman_egnahc = ngiroﻩ
ldne 〈〈 ")x 量变替代 3x,2x,1x(是就后化准标离分量变" 〈〈 tuocﻩ
〈< ;ldne 〈〈 ngiroﻩﻩ }ﻩ else
;)0(tixeﻩ //============================================================================ ---——--—--—毕完--—-—---—---—————---————-" << tuocﻩ-—-————-——-—-—-—-—-—--—-" << endl;
cout 〈< "(请输入 Y/y)结束” << endl;
odﻩ {
} ;))(rahcteg == ’Y" || )(rahcteg == ’y’( elihwﻩ exit(0); } void initString(string &ini)
{
;bdnam ,adnam rahcﻩ ;ldne 〈〈 "式公词谓得换转要需所您入输请” 〈< tuocﻩ cout <〈 "需要查瞧输入帮助(Y/N)? ” <〈 endl;
cin >〉 manda;
)"y’ == adnam || ’Y’ == adnam( fiﻩ ne 〈〈 ”,#为词量在存,为词量称全,〉为号符涵蕴时入输定规程例本" 〈〈 tuocﻩdl ” 〈<< ”母字个一用请名数函,) 、 (为别分号括右左,%为取合,!为取吸,~为反取ﻩﻩ〈 endl;
;ldne <〈 "义定自户用否是就择选)n/y(入输请” <〈 tuocﻩ cin 〉> mandb;
if (mandb == ’Y' || mandb == "y')
;ini >〉 nicﻩ esleﻩ
ini = ”(x)(P(x)>((y)(P(y)>P(f(x, y)))%~(y)(Q(x,y)〉P(y))))";
cout 〈< "原始命题就是” << endl
〈< ini 〈〈 endl; }
string del_inlclue(string temp)//消去>蕴涵项 {
//a〉b 变为~a!b
char ctemp[100] = { ”” };
;tuptuo gnirtsﻩ int length = temp、length();
;0 = glaf ,0 = tekcarb_thgir ,0 = i tniﻩ stack<char〉 stack1, stack2, stack3;
;))(rts_c、pmet ,pmetc(s_ypcrtsﻩ )1 - htgnel =〈 i && ’0\" =!
]i[pmetc( elihwﻩ {ﻩ
stack1、push(ctemp[i]);
if (’〉' == ctemp[i + 1])//如果就是 a〉b则用~a!b 替代
{
;1 = glafﻩﻩﻩ出弹]i[pmetc把则母字是就果如//))]i[pmetc(mublAsi( fiﻩ {ﻩ ﻩ
ﻩ
stack1、pop();
ﻩ
stack1、push(’~’);
ﻩﻩ stack1、push(ctemp[i]);
;)"!’(hsup、1kcatsﻩﻩ
ﻩ i = i + 1;
}ﻩﻩ
ﻩ else if (’)" == ctemp[i])
{ﻩ ﻩ
;++tekcarb_thgirﻩ
ﻩ
do
{ ﻩﻩﻩ
if (’(’ == stack1、top()) ﻩﻩﻩﻩ
;--tekcarb_thgirﻩ ﻩ ﻩ
stack3、push(stack1、top());
;)(pop、1kcatsﻩﻩ
ﻩﻩ } while ((right_bracket != 0));
ﻩ
;))(pot、1kcats(hsup、3kcatsﻩﻩﻩ
;)(pop、1kcatsﻩﻩﻩ
;)"~’(hsup、1kcatsﻩ
ﻩ
))(ytpme、3kcats!( elihwﻩ
ﻩﻩ {
ﻩ
;))(pot、3kcats(hsup、1kcatsﻩ
ﻩ
;)(pop、3kcatsﻩﻩ
}ﻩﻩ
;)"!’(hsup、1kcatsﻩﻩ ﻩ;1 + i = iﻩ } ﻩﻩ
}
;++iﻩﻩ }ﻩ while (!stack1、empty())
{
stack2、push(stack1、top());
;)(pop、1kcatsﻩﻩ }ﻩ ))(ytpme、2kcats!( elihwﻩ {
;)(pot、2kcats =+ tuptuoﻩﻩ
;)(pop、2kcatsﻩ }ﻩ )1 == glaf( fiﻩ
;tuptuo nruterﻩ esleﻩ ;pmet nruterﻩﻩ} string dec_neg_rand(string temp)//减少否定符号得辖域 {
char ctemp[100], tempc;
;tuptuo gnirtsﻩ int flag2 = 0;
;)(htgnel、pmet = htgnel ,0 = tekcarb_tfel ,0 = i tniﻩ ;2kcats ,1kcats >rahc〈 kcatsﻩ queue <char〉 queue1;
中组数符字到制复//;))(rts_c、pmet ,pmetc(s_ypcrtsﻩ while (ctemp[i] != "\0’ && i 〈= length - 1)
{
;)]i[pmetc(hsup、1kcatsﻩﻩ 做不都么什则否~是就果如//)’~" == ]i[pmetc( fiﻩﻩ {ﻩﻩ
;]2 + i[pmetc = of rahcﻩﻩ
做不都么什则否,(是就果如//)’(" == ]1 + i[pmetc( fiﻩ
ﻩ {
ﻩ
if (fo == "’ || fo == "#’)//如果就是全称量词
{ﻩﻩﻩ
ﻩ
;1 = 2galfﻩﻩ
ﻩ
ﻩ i++;
ﻩ;)(pop、1kcatsﻩ
ﻩ
;)]i[pmetc(hsup、1kcatsﻩ
ﻩﻩ
)"’ == of( fiﻩ
ﻩﻩ
ﻩ stack1、push(’#");
ﻩ
esleﻩ
ﻩﻩﻩ;)’’(hsup、1kcatsﻩ
;)]2 + i[pmetc(hsup、1kcatsﻩ
;)]3 + i[pmetc(hsup、1kcatsﻩﻩﻩﻩﻩ
;)’('(hsup、1kcatsﻩ
ﻩ;)’~’(hsup、1kcatsﻩ
ﻩ
if (isAlbum(ctemp[i + 4]))
ﻩﻩ
{ﻩ
ﻩﻩ
;)]4 + i[pmetc(hsup、1kcats...
上一篇:超声实验报告
下一篇:数据库实验报告,(3)