人工智能实验报告 产生式系统推理 动物识别
人工智能实验报告_13

人工智能实验报告题目:基于web动物识别系统院系:计算机科学与技术系专业:计算机科学与技术专业学号:*********学生姓名:***日期:2010-4-21一、实验题目:基于web的动物识别系统二、实验目的理解和掌握产生式知识表示方法及产生式系统的基本过程,能够利用Web编程技术建立一个基于产生式知识表示的简单的智能系统。
三、实验要求(1) 以本书第2章动物识别产生式系统的规则为知识库(可增加规则),采用正向推理或逆向推理方式。
(2) 以选定的数据库管理系统建立知识库,用选定的网络编程语言按B/S模式开发一个具有解释功能的智能系统。
(3) 提交完整的软件系统和相关文档,包括源程序和可执行程序。
四、实验环境(1) 硬件环境:网络环境中的微型计算机。
(2) 软件环境:WindowsXP及以上操作系统,本实验采用的框架结构,编程语言为C#,编程环境为Microsoft Visual Studio2008。
采用的数据库管理软件为Microsoft Office Access2007。
五、实验原理1产生式表示法:1.1事实1.1.1事实的定义事实是断言一个语言变量的值或断言多个语言变量之间关系的陈述句。
语言变量的值或语言变量之间的关系可以是数字、词等。
例如:“雪是白的”,其中“雪”是语言变量,“白的”是语言变量的值1.1.2事实的表示●确定性知识,事实可用如下三元组表示:(对象,属性,值)或(关系,对象1,对象2)其中,对象就是语言变量。
例如:(snow, color, white) 或(雪,颜色,白)(love, Wang Feng, country) 或(热爱,王峰,祖国)●非确定性知识,事实可用如下四元组表示:(对象,属性,值,可信度因子)其中,“可信度因子”是指该事实为真的相信程度。
可用[0,1]之间的一个实数来表示。
1.2规则的表示规则描述的是事物间的因果关系。
规则的产生式表示形式常称之为产生式规则,简称产生式或规则。
动物识别系统实验报告 人工智能原理及其应用

实验报告实验目的及要求:实验目的:1.熟悉产生式的特点,基本结构和设计思想2.掌握基于规则推理的基本过程和方法(在实验中采用正向推理过程)3.学会用高级程序设计语言开发基于规则的动物识别系统实验要求:1.根据动物识别系统的规则建立合理的数据结构或数据库来表示知识。
2.利用所选开发语言来建立推理过程。
(该程序能正向推理识别动物过程)3.利用控制台或者图形界面给出合理的交互接口,实现基本演示功能。
4.提交实验报告和源程序,总结实验结论和经验教训。
实验原理:1.基于规则产生式系统结构:基于规则的产生式系统一般由规则库(知识库)、综合数据库和推理引擎(推理机)三部分组成,规则库中它的基本组成框架如下图1所示。
知识库由谓词演算事实和有关讨论主题的规则构成,综合库又称为上下文,用来暂时存储推理过程中的结论和数据。
推理机是用规则进行推理的过程和行为,。
知识采集系统是领域专家把相关领域的知识表示成一定的形式,并输入到知识库中。
解释系统通过用户输入的条件来分析被系统执行的推理结构,并将专家知识以易理解的方式并把知识解释给用户。
图1 规则产生式系统的基本结构2. 简单动物识别产生式系统结构:⑴知识库ANIMAL的知识库非常小,仅仅包含16条规则(一般说来,一个产生式系统的知识库应包含≥几百条规则);⑵解空间很小,仅仅包含8个解,或8个最高假设(在一个特定的动物园里,共有虎、豹、长颈鹿、斑马、鸵鸟、企鹅和信天翁、八哥等8种动物);⑶初始事实集合很小,仅仅包含21个事实,如图中的F1至F21;⑷数据(即事实、证据、断言),知识(即浅层知识,规则)和推理都是精确的,即确定性的;⑸知识库。
实验步骤:本识别系统需要通过正向推理,正向推理过程的具体步骤是:(1)读入事实集到工作存储器。
(2)取出某条规则,将规则的全部前件与工作存储器中的所有事实进行比较。
如果匹配成功,则所得结果显示到屏幕上,转向(3);否则,直接转向(3)。
(3)结束。
人工智能实验报告-产生式系统推理-动物识别

人工智能第二次实验报告产生式系统推理班级:姓名:学号:一、实验目的1. 理解并掌握产生式系统的基本原理;2. 掌握产生式系统的组成部分,以及正向推理和逆向推理过程。
二、实验要求1. 结合课本内容, 以动物识别系统为例,实现小型产生式系统;2. 要求: 正向推理中能根据输入的初始事实,正确地识别所能识别的动物;逆向推理中能根据所给的动物给出动物的特征。
三、实验算法1. 如何表示事实和特征的知识;在本程序中,我将动物的特征写入data.txt,将规则记入rules.txt,将动物种类记为goal.txt。
通过函数void readFiles(){readGoal();readCod();readRule();}读入所有数据分别存放于goal[],rule[],cod[]自定义数组中。
2. 指出综合数据库和规则库分别使用哪些函数实现的?综合数据库(包括特征和目标)typedef struct{int xuh;//存放编号char valu[50];//存放具体内容}Node;Node goal[20];Node cod[50];规则库typedef struct{int rslt;int codNum;//记载前提的个数int cod[10];//记载前提的序号int used;//记载是否已匹配成功}Nrule;Nrule rule[50];void readRule(){FILE *fp;int i;int tempxuh,tempcodn;char ch;if((fp=fopen("rules.txt","r"))==NULL){printf("cannot open data\n");exit(0);}i=0;rule[i].codNum=0;while((ch=fgetc(fp))!=EOF){if(i==14)i=i;tempcodn=0;while(ch!='\n'&&ch!=EOF) //每一条规则{tempxuh=0;while(ch<='9'&&ch>='0'){tempxuh=tempxuh*10+ch-'0';ch=fgetc(fp);}rule[i].cod[tempcodn++]=tempxuh;tempxuh=0;if(ch=='-')//下一个是结论{ch=fgetc(fp);ch=fgetc(fp);while(ch<='9'&&ch>='0'){tempxuh=tempxuh*10+ch-'0';ch=fgetc(fp);}rule[i].rslt=tempxuh;}//ifelse if(ch=='*'){ch=fgetc(fp);}rule[i].codNum++;}i++;}rulenum=i;fclose(fp);}3. 规则库的匹配算法是什么?如何选用可用规则集中的规则?分别使用哪些函数实现的?程序中的正向与逆向搜索分别是在void main()中调用forwardFinger()和backFinger()来实现的。
人工智能实验报告

暨南大学人工智能实验报告题目:动物识别系统院系:信科院计算机系专业:计算机软件与理论学号:学生姓名:张韶远成绩:日期:2009年11月10日一、目的与要求1.掌握人工智能的知识表示技术,能用产生式表示法表示知识,并实现一个用于识别的专家系统。
2.推理策略采用正向推理和反向推理两种。
二、主要内容1.学习人工智能的知识表示技术,关键掌握产生式知识表示的具体应用方法。
2.实现的动物识别系统的主要功能如下:2.1系统能通过正向、反向推理得到正确的动物识别结果。
2.2系统能动态地添加规则、能显示推理过程。
三.实验原理产生式表示:产生式表示是知识表示的一种。
这种方法是建立在因果关系的基础上的,可很容易的描述事实、规则及其不确定性度量。
1.事实的表示:事实可看成是断言一个语言变量的值或是多个语言变量间的关系的陈述句,语言变量的值或语言变量间的关系可以是一个词。
不一定是数字。
一般使用三元组(对象,属性,值)或(关系,对象1,对象2)来表示事实,其中对象就是语言变量,若考虑不确定性就成了四元组表示(增加可信度)。
这种表示的机器内部实现就是一个表。
如事实“老李年龄是35岁”,便写成(Lee,age,35)事实“老李、老张是朋友”,可写成(friend,Lee,Zhang)2.规则的表示:规则用于表示事物间的因果关系,以if condition then action 的单一形式来描述,将规则作为知识的单位。
其中的condition 部分称为条件式前件或模式,而action部分称作动作、后件或结论。
产生式一般形式为:前件后件。
前件和后件也可以是有“与”、“或”、“非”等逻辑运算符的组合的表达式。
条件部分常是一些事实的合取或析取,而结论常是某一事实B。
如果不考虑不确定性,需另附可信度度量值。
产生式过则的含义是:如果前件满足,则可得到后件的结论或者执行后件的相应动作,即后件由前件来触发。
一个产生式生成的结论可以作为另一个产生式的前提或语言变量使用,进一步可构成产生式系统。
AI实验报告

目录人工智能及其应用........................................................................................... 错误!未定义书签。
实验报告................................................................................................... 错误!未定义书签。
实验一产生式系统实验群. (2)一、实验目的: (2)二、实验原理: (2)三、实验条件: (3)四、实验内容: (3)五、实验步骤: (3)实验二搜索策略实验群搜索策略: (6)一、实验目的: (6)二、实验原理: (6)三、实验条件: (6)四、实验内容: (6)五、实验步骤: (7)六:实验过程: (7)七、A*算法流程图: (18)八、实验结论: (19)实验三神经网络实验群 (20)一、实验目的: (20)二、实验原理: (20)三、实验条件: (20)四、实验内容: (20)五、实验步骤: (21)六、实验结论: (21)实验四自动规划实验群 (25)一、实验目的: (25)二、实验原理: (25)三、实验条件: (25)四、实验内容: (26)五、实验步骤: (26)实验一产生式系统实验群产生式系统: 是由一组规则组成的、能够协同作用的推理系统。
其模型是设计各种智能专家系统的基础 .产生式系统主要由规则库、综合数据库和推理机三大部分组成。
本实验环境主要提供一个能够实现模拟产生式专家系统的验证、设计和开发的可视化操作平台。
学生既能用本系统提供的范例进行演示或验证性实验,也能够用它来设计并调试自己的实验模型。
一、实验目的:熟悉和掌握产生式系统的运行机制,掌握基于规则推理的基本方法。
二、实验原理:生式系统用来描述若干个不同的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操作对。
人工智能产生式系统实验报告

实验报告【实验名称】______________产生式系统_______________________ 【实验目的】1. 理解产生式系统的结构原理与实际应用。
2. 掌握产生式规则表示及规则库组建的实现方法。
3. 熟悉和掌握产生式系统的运行机制,掌握基于规则推理的基本方法。
【实验原理】产生式系统用来描述若干个不同的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操作对。
在产生式系统中,论域的知识分为两部分:用事实表示静态知识;用产生式规则表示推理过程和行为。
【实验内容】1.自己建造产生式系统(包括规则库和事实库),然后进行推理,即可以自己输入任何的事实,并基于原有的规则和输入的事实进行推理。
2.建造动物识别系统,能根据输入的动物特征判断是那种动物或给出相应的回答。
3.算法设计①首先建立事实库事实库是在程序的开始直接输入的,用户根据需要选择,即要求用户先输入特征个数,然后输入动物的特征,进行识别。
如果未识别出来,则可以重新选择,或者退出。
动物的特征如下:1有奶2有毛发3有羽毛4会飞5生蛋6有爪7有犬齿8目盯前方9吃肉10有蹄11反刍食物12黄褐色13黑色条纹14黑色斑点15长腿16长脖子17暗斑点18白色19不会飞20黑白色21会游泳22善飞23不怕风浪24哺乳动物25鸟26食肉动物27有蹄动物28偶蹄动物29海燕30老虎31金钱豹32长颈鹿33斑马34鸵鸟35企鹅②建立静态规则库即建立产生式规则,本算法采用了产生中间事实的方法,便于建立和使用规则。
为了便于设计,我们把要识别的动物限于7种,这样所需要的产生式规则就比较少。
本算法共有15种规则,如下:R1: 如果动物有奶,则它是哺乳动物R2: 如果动物有毛发,则它是哺乳动物R3: 如果动物有羽毛,则它是鸟R4: 如果动物会飞且生蛋,则它是鸟R5: 吃肉的哺乳动物是食肉动物R6: 有爪有犬齿木钉前方的哺乳动物是食肉动物R7: 有蹄的哺乳动物是有蹄动物R8: 反刍食物的有蹄动物是偶蹄动物R9: 黄褐色有黑条纹的食肉动物是老虎R10:黄褐色有黑色斑点的食肉动物是金钱豹R11:长腿长脖子有黄褐色暗斑点的有蹄动物是长颈鹿R12:有黑白条纹的有蹄动物是斑马R13:不会飞长腿长脖的鸟是鸵鸟R14:不会飞会游泳黑白色的鸟是企鹅R15:善飞不怕风浪的鸟是海燕具体表示如下:R1: 1->24R2: 2->24R3: 3->25R4: 4*5->25R5: 6*7*8*24->26R6: 9*24->26R7: 10*24->27R8: 11*27->28R9: 12*13*24->30R10: 12*14*24->31R11: 12*15*16*17*27->32R12: 13*18*27->33R13: 15*16*19*25->34R14: 19*20*21*25->35R15: 22*23*25->29③正向推理过程从已知事实出发,通过规则库求得结论,或称数据驱动方式。
人工智能动物识别实验报告

一.实验目的:1.熟悉并掌握如何使用SQL SERVER 20002.熟悉JAVA语言编程3.熟悉讲JAVA与数据库结合进行数据库编程4.理解产生式表示法5.熟悉产生式系统的基本过程二.实验环境及工具SQL SERVER 2000,ECLIPSE 7.0,PC机一台,Tomcat 6.0三.实验步骤及方法1.产生式规则分析通过分析书上的15条规则,我们可以得到该图为动物识别系统的部分推理网络在该图中,最上层的节点称为“结论”,中间节点称为“中间假设”,终结点称为“事实”。
其中,每个“结论”都是问题的一个目标,所有的“结论”就构成了本问题的一个目标集合。
经过分析可以本问题的事实有:有毛发,有奶等20个事实;中间假设有:该动物是哺乳动物,鸟,肉食动物和有蹄类动物;目标集合是:金钱豹,虎,长颈鹿,斑马,鸵鸟,企鹅和信天翁。
2.数据库设计根据第一步的分析,我们可以建立一个animal数据库,其中存放两张表,一张称为facts的事实表。
另一种称为factRules的规则表3.程序设计数据库及表已经建立好之后,我们就可以设计本系统的程序了,经过分析,我们得到如下的流程图4.使用Eclipse编程实现AnimalAction的主要源代码为:import com.myhomework.animal.OpenDb;public class AnimalAction extends Action { static OpenDb db = null;public static OpenDb getDB() {if (db == null) {db = new OpenDb();}return db;}public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception {do {do {i++;String sql4 = "select * from factRules where rulesNo=" + "'i'";ResultSet rs = getDB().executeQuery(sql4);String sql8 = "select count(*) total from newFacts";ResultSet rsr = getDB().executeQuery(sql8);if (total < count) {return mapping.findForward("err2");}isNew = IsInNewFcats(obj1);} while (!isNew);String sql6 = "select * from factRules where rulesNo=" + "'i'";String cName = "att5";ResultSet rss = getDB().executeQuery(sql6);int m=0;try{isIn = (m > 24 && m < 32);if (isIn) {String sql9 = "select factName from facts where factNo="+ "'m'";ResultSet rss2 = getDB().executeQuery(sql9);request.setAttribute("reslut", factName);return mapping.findForward("succ");}String sql7 = "insert into newFacts values(" + "'m'" + ")";getDB().executeUpdate(sql7);} while (!isIn && i<16);return mapping.findForward("err1");}}Struts-config.xml的主要配置为:<form-beans><form-bean name="animalactionform"type="com.myhomework.animal.AnimalActionForm"> </form-bean></form-beans><action-mappings><action path="/animal"type="com.myhomework.animal.AnimalAction"scope="request"name="animalactionform"><forward name="succ"path="/success.jsp"/><forward name="err1"path="/error1.jsp"/><forward name="err2"path="/error2.jsp"/></action>四.实验结果1.在浏览器上输入http://localhost:8080/anistruts,显示该系统的首页为:2.单击“产生式规则”,即跳转到产生式规则表页面为:交”按钮,则系统成功识别的结果4.如果只选中“有毛发”,然后点击“提交”,条件不足,无法识别的结果5.条件错误,无法识别的结果五.实验总结通过本实验,我基本熟悉了SQL Server2000的基本使用,并理解了产生式表示法和产生式系统的基本过程;也可以熟练的使用Eclipse进行数据库编程。
动物识别系统实验报告

stringFindMaxNumber ="select max(动物序号) from动物库";
SqlCommandcmd2 =newSqlCommand( FindMaxNumber ,con);
1.1功能需求
1.1.1动物识别正向推理
正向推理是从已知事实出发,通过规则库求的结论,也称为自底向上,或称为数据驱动方式。
正向推理过程的具体步骤是:
(1)读入事实集到工作存储器。
(2)取出某条规则,将规则的全部前件与工作存储器中的所有事实进行比较。如果匹配成功,则所得结果显示到屏幕上,转向(3);否则,直接转向(3)。
动物识别系统设计主体框架:本系统只用了一个页面实现,界面使用上下结构的框架设计,当用户进入系统的时候,打开Default.aspx,该页面分为上下两个部分,上面的部分是用于根据问题输入动物特征,下面的部分是新规则的加入功能部分,也是用户进行添加新规则的页面,这好似一个导航页面,用户可以更具自己的选择进行的操作,由上至下进入不同的功能部分。各个功能模块的设计:
staticint[] a =newint[7];
SqlConnectioncon =newSqlConnection("Server = PC-11; user id = sa;password = ;Database = animal;");
protectedvoidPage_Load(objectsender,EventArgse)
YesOption.Checked =false;
}
protectedvoidNoOption_CheckedChanged(objectsender,EventArgse)
{
a[Convert.ToInt32(Questionselected.SelectedValue)] = 0;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ch=fgetc(fp); } rule[i].cod[tempcodn++]=tempxuh; tempxuh=0; if(ch=='-')//下一个是结论 { ch=fgetc(fp); ch=fgetc(fp); while(ch<='9'&&ch>='0') { tempxuh=tempxuh*10+ch-'0'; ch=fgetc(fp); } rule[i].rslt=tempxuh; }//if else if(ch=='*') { ch=fgetc(fp); } rule[i].codNum++; }
功。推某一个事实时,仍然是从该事实的前提出发,逐个匹配,若所有的前提满足,则该事 实满足。代码如下: void backFinger() { int i; bQueueNode markdCod[MAXNUM];//stat 字段用来存它的结论的序号 int flagFitAll; int markdCodNum; double fitDegree; int flagExistAns; flagFitAll=0; flagExistAns=0; for(i=0;i<goalnum&&flagFitAll==0;i++)//一种动物 { initBack(&fitDegree,&markdCodNum,i); while(bqueue.head!=bqueue.tail) { if(bqueue.head==9&&bqueue.tail==11) { bqueue.head=bqueue.head; } findCod(); recMarkdCod(markdCod,&markdCodNum); if(bqueue.bNode[bqueue.head].stat==0) { addNodeToQueue(); takeToClose(bqueue.bNode[bqueue.head].codXuh,bqueue.tail-1); } bqueue.head++; if(bqueue.head==bqueue.tail) { if(close.head!=close.tail) { takeTobqueue(close.head); } } } fitDegree=workFitDegree(markdCod,markdCodNum); if(fitDegree>1e-5) { if(StillCodNoUseAndContradict(i+codnum)) { printf("它不是%s。\n",goal[i].valu); }
四、实验结果
1. 要求有实验运行结果截图,以及必要的说明; (1)有若干选择动物特征的选择列表;
(2)输入特征后,询问使用索成功找到目标后,程序显示该动物名称,否则“显示条件不足无法判 断” 。
(4)逆向搜索结果:
2. 对所实现的产生式系统进行性能分析。 在数据量小的情况下识别速度较快。但是我觉得这种识别用处不够广泛。所有的规 则必须人工输入不够灵活,不能适应突发状况(如白虎) 。
int fitPart;//1:有部分符合条件 int i,j,k; flag=0; flagCNew=1; while(!flag&&flagCNew==1) { flagCNew=0; for(j=0;j<rulenum&&rule[j].used!=1&&flag==0;j++)//一条规则 { if(rule[j].codNum<=inpCod.curnum)//事实数不小于当前规则所要求的 条件数 { flagFit=1; for(i=0;i<rule[j].codNum&&flagFit==1;i++) { fitPart=0; for(k=0;k<inpCod.curnum;k++) { if(rule[j].cod[i]==inpCod.cod[k].xuh) { fitPart=1; } } flagFit=fitPart; } if(flagFit==1) { flagCNew=1; fitOneRule(j,&flag);//有事实匹配时, 就处理把结论加入事实 库等事情 flagFit=0; } } }// }//while if(flagCNew==0) { printf("条件不足,不能推出它是什么动物"); } } 逆向搜索 反向推理比正向推理要复杂一些。采用的算法是从事实库的动物开始从前往后进行匹 配,看是否能成功推出,如果都推不出能识别失败,若能推出其中一个则中止搜索,识别成
人工智能第二次实验报告
产生式系统推理
班级: 一、实验目的
1. 理解并掌握产生式系统的基本原理; 2. 掌握产生式系统的组成部分,以及正向推理和逆向推理过程。
姓名:
学号:
二、实验要求
1. 结合课本内容, 以动物识别系统为例,实现小型产生式系统; 2. 要求: 正向推理中能根据输入的初始事实, 正确地识别所能识别的动物; 逆向推理中 能根据所给的动物给出动物的特征。
else { bDisplayResult(fitDegree,i,&flagFitAll); } } else { printf("它不是%s。\n",goal[i].valu); } if(flagFitAll==1) { flagExistAns=1; } }//for if(flagExistAns==0) { printf("综上所述:没有完全符合这些特征的动物。\n"); } }//backFinger()
三、实验算法
1. 如何表示事实和特征的知识; 在本程序中,我将动物的特征写入 data.txt,将规则记入 rules.txt,将动物 种类记为 goal.txt。
通过函数 void readFiles() { readGoal(); readCod(); readRule(); }读入所有数据分别存放于 goal[],rule[],cod[]自定义数组中。 2. 指出综合数据库和规则库分别使用哪些函数实现的? 综合数据库(包括特征和目标) typedef struct { int xuh;//存放编号 char valu[50];//存放具体内容 }Node; Node goal[20]; Node cod[50];
i++; } rulenum=i; fclose(fp); } 3. 规则库的匹配算法是什么?如何选用可用规则集中的规则?分别使用哪些函数实现 的? 程序中的正向与逆向搜索分别是在 void main() 中调用 forwardFinger() 和 backFinger() 来 实现的。 正向搜索 从下向上的推理。由于建立规则库时的内在要求,即子规则必在父规则前,故进行正向 推理的时候只要将规则库从前到后扫一遍看是否能由规则推出相应结果即可。 如果能匹配推 出结果则看该结果是否为动物,如果已经推出动物则推理成功。否则更新事实库,匹配下一 个规则。代码如下: void forwardFinger() { int flag;//1:工作已完成 0:还未完成 int flagFit; int flagCNew;//记录本次循环有没有推出新事实
规则库 typedef struct { int rslt; int codNum;//记载前提的个数 int cod[10];//记载前提的序号 int used;//记载是否已匹配成功 }Nrule; Nrule rule[50]; void readRule() { FILE *fp; int i; int tempxuh,tempcodn; char ch; if((fp=fopen("rules.txt","r"))==NULL) { printf("cannot open data\n"); exit(0); } i=0; rule[i].codNum=0; while((ch=fgetc(fp))!=EOF) { if(i==14) i=i; tempcodn=0; while(ch!='\n'&&ch!=EOF) //每一条规则 { tempxuh=0; while(ch<='9'&&ch>='0') { tempxuh=tempxuh*10+ch-'0';
五、实验总结及体会
虽然还没有具体学习过产生式算法, 但是通过本次实践, 对正向推理反向推理的过程可 以说已经有了大概的了解喝一些自己的看法, 对代码的控制能力也有了一定的提高, 递归函 数的设计,流程的控制都得到了一定的强化。我觉得本次实验的算法还是比较简单的,关键 是数据结构的设计, 我运用了很多自定义的结构体想使程序显得简单一些, 但是效果并不好, 别人很难分清那些结构体,太多了。 。 。 。 。