1、实验三 归结原理人工智能实验大作业实验题目: 归结原理 专业 信息与计算科学 年级 091001 姓名 马昊 学号 * 指导老师 时华 日期 2012-12-5 实验三归结原理一、实验目的在本实验中,主要熟悉和掌握归结原理的基本思想和基本方法,通过实验培养了我们利用逻辑方法表示知识,并掌握采用机器推理来进行问题求解的基本方法。二、实验要求1.熟悉归结原理的基本思想和归结否证的步骤;2.本实验JAVA语言编程实现实验内容;3.利用所学的知识及实验结果,来完成实验报告的各项内容。三、实验背景知识归结原理是一种推理规则。从谓词公式转化为子句集的过程中看出,在子句集中子句之间是合取关系,其中只要有一个
2、子句不可满足,则子句集就不可满足。若一个子句集中包含空子句,则这个子句集一定是不可满足的。归结原理就是基于这一认识提出来的。他的原理就是:P-Q,Q-R则P-R由于P-Q就是PQ而Q-R就是QR所以,他相当于将Q和Q合并。也就是说,P1与P2可以归结为12其中1,2是文字的集合归结否证包含以下步骤:(1)把前提或公理转换成子句形式;(2)把求证目标的否定的子句形式加到公理集合中;(3)对所有这些子句进行归结,产生它们的逻辑结果子句;(4)用产生空子句的方法来得出矛盾;(5)否定目标的否证在用于产生空子句的代换下为真。如何把前提或公理化为子句形式是进行归结的前提,其过程包含如下步骤:(1)消去蕴
3、涵符号用PQ替换PQ(2)减少否定符号的辖域每个否定符号最多只作用在一个谓词符号上(3)对变量标准化每个变量仅受一个量词作用(4)消去存在量词若存在量词前没有全称量词,则直接消去;否则,要Skolem。化。(5)化为前束范式前束范式:一个公式,如果量词均非否定地出现在公式最前面,其辖域延伸到整个公式的末尾,且在公式中仅含有联结词,则称此种形式为前束范式。前束范式=(前缀)(母式)(6)化母式为合取范式(7)消去全称量词(8)消去连接词符号用A,B替代(AB)(9)将分离的变元归一化四、实验内容1.问题描述:四对夫妇中,王结婚时,周送了礼;周和钱是同一排球队的队员;李的爱人是陈的爱人的表哥;陈夫
4、妇与邻居吵架时,徐、周、吴的爱人都去助战;李、徐、周结婚前住在同一宿舍,试用归结原理求王、周、钱、陈、李、徐、吴、孙几人谁和谁是夫妇。2.实验源代码:importjava.lang.*;publicclassGuessCouple2 /*数据类型*/ publicclassPerson privateStringname; privatebooleansex; privatePersonspouse; publicPerson(Stringname) this.name=name; this.sex=false; this.spouse=null; publicPerson() name=nu
5、ll; sex=false; spouse=null; publicPerson(Stringname,booleansex,Personspouse) this.name=name; this.sex=sex; this.spouse=spouse; publicvoidsetName(Stringname) this.name=name; publicStringgetName() returnname; publicvoidsetSex(booleansex) this.sex=sex; publicbooleangetSex() returnsex; publicvoidsetSpou
6、se(Personperson1) this.spouse=person1; publicPersongetSpouse() returnspouse; PersonsortBySpouse1=newPerson8; PersonsortBySpouse2=newPerson8; intx=0,y=0; PersonsortByEqualSex1=newPerson8; PersonsortByEqualSex2=newPerson8; intn=0,p=0,f=0; Personwoman=newPerson4; Personman=newPerson4; intk=0,s=0,r=0; b
7、ooleansign=true; booleansign1=true; booleansign2=true; booleansign3=true; booleansign4=true; booleansign5=true; booleansign6=true; booleansign7=true; Personcouple1=newPerson4; Personcouple2=newPerson4; Personcouple3=newPerson4; Personcouple4=newPerson4; inta=0,b=0,c=0,d=0; inta2=0,b2=0,c2=0,d2=0; pu
8、blicvoidisCouple(Personperson1,Personperson2) if(person1.getSpouse().getName()=person2.getName() person1.setSex(!person2.getSex(); person2.setSex(!person1.getSex(); System.out.println(person1.getName()+的性别和 +person2.getName()+的性别不相同); publicvoidmarriage(Personperson1,booleanperson1Marriage, Personpe
9、rson2,booleanperson2giveGiftPerson1) if(person1Marriage&person2giveGiftPerson1) if(!person1.getName().equals(person2.getName() System.out.println(person1.getName()+和 +person2.getName()+不是夫妻); sortBySpouse1x+=person1; sortBySpouse2y+=person2; publicvoidoneVolleyballGroup(booleanoneGroup,Personperson1
10、, Personperson2) if(oneGroup&person1.getSex()=person2.getSex() System.out.println(person1.getName()+和+person2.getName() +是相同的性别); sortByEqualSex1n+=person1; sortByEqualSex1n+=person2; f=n; publicvoidliveCollectivityDorm(booleanliveTogether,Personperson1, Personperson2,Personperson3) if(liveTogether&
11、!person1.getName().equals(person2.getName() &!person1.getName().equals(person3.getName() &!person2.getName().equals(person3.getName() System.out.println(person1.getName()+的性别和 +person2.getName()+的性别相同 +person3.getName()+的性别相同); sortByEqualSex2p+=person1; sortByEqualSex2p+=person2; sortByEqualSex2p+=
12、person3; publicvoidisbrotherInLaw(Personperson1,Personperson2, booleanp1SIsBrotherInLawP2S) if(!person1.getName().equals(person2.getName() &p1SIsBrotherInLawP2S) person1.setSex(false); sortBySpouse1x+=person1; sortBySpouse2y+=person2; System.out.println(person1.getName()+是一个女人); womank+=person1; r=k
13、; System.out.println(person1.getName()+的性别是女和 +person1.getName()+的配偶是男); publicvoidassistInFighting(booleancCoupleQuarrel,PersoncCouple, Personperson1,Personperson2,Personperson3) if(cCoupleQuarrel) if(!cCouple.getName().equals(person1.getName() &!cCouple.getName().equals(person2.getName() &!cCouple
14、.getName().equals(person3.getName() &!person1.getName().equals(person2.getName() &!person1.getName().equals(person3.getName() &!person2.getName().equals(person3.getName() System.out.println(cCouple.getName()+的配偶不是 +person1.getName()+和+cCouple.getName() +的配偶不是+person1.getName() +的配偶); System.out.prin
15、tln(cCouple.getName()+的配偶不是 +person2.getName()+和+cCouple.getName() +的配偶不是+person2.getName() +的配偶); System.out.println(cCouple.getName()+的配偶不是 +person3.getName()+和+cCouple.getName() +的配偶不是+person3.getName() +的配偶); sortBySpouse1x+=cCouple; sortBySpouse2y+=person1; sortBySpouse1x+=cCouple; sortBySpouse
16、2y+=person2; sortBySpouse1x+=cCouple; sortBySpouse2y+=person3; sortBySpouse1x+=person1; sortBySpouse2y+=person2; sortBySpouse1x+=person1; sortBySpouse2y+=person3; sortBySpouse1x+=person2; sortBySpouse2y+=person3; publicvoidguessCoupleByRules() Personperson=newPerson8; person0=newPerson(王,false,perso
17、n0); person1=newPerson(陈,false,person1); person2=newPerson(周,false,person2); person3=newPerson(钱,false,person3); person4=newPerson(吴,false,person4); person5=newPerson(孙,false,person5); person6=newPerson(李,false,person6); person7=newPerson(许,false,person7); marriage(person0,true,person2,true); oneVol
18、leyballGroup(true,person2,person3); isbrotherInLaw(person6,person1,true); assistInFighting(true,person1,person7,person2,person4); liveCollectivityDorm(true,person6,person7,person2); for(intv=0;vf;v+) for(intt=0;tp;t+) if(sortByEqualSex1v.getName().equals( sortByEqualSex2t.getName() for(intz=0;zp;z+)
19、 for(intj=0;jf;j+) if(!sortByEqualSex2z.getName().equals( sortByEqualSex1j.getName() ; else sortByEqualSex1j=sortByEqualSex2z; sign2=false; if(sign2) sortByEqualSex1n+=sortByEqualSex2z; sign2=true; for(intm=0;mr;m+) for(intq=0;qn;q+) if(womanm.getName().equals(sortByEqualSex1q.getName() for(intl=0;l
20、n;l+) for(intj=0;jr;j+) if(!sortByEqualSex1l.getName().equals( womanj.getName() ; else womanj=sortByEqualSex1l; sign=false; if(sign) womank+=sortByEqualSex1l; sign=true; r=k; if(r=4) for(intj=0;j8;j+) intw=0; for(inti=0;ir;i+) if(!personj.getName().equals(womani.getName() w+; if(w=r) mans+=personj;
21、System.out.println(); System.out.println(得到的男和女分别是:); System.out.print(女:+); for(inti=0;ir;i+) womani.setSex(false); System.out.print(womani.getName()+); System.out.println(); System.out.println(); System.out.print(男:+); for(intj=0;js;j+) manj.setSex(true); System.out.print(manj.getName()+); System.
22、out.println(); System.out.println(); for(inti=0;ix;i+) if(sortBySpouse1i.getSex()!=sortBySpouse2i.getSex() if(!sortBySpouse1i.getSex() Persontemp=newPerson(); temp=sortBySpouse1i; sortBySpouse1i=sortBySpouse2i; sortBySpouse2i=temp; publicvoidpartitionCouple() for(inti1=0;i1x;i1+) for(inti2=0;i2s;i2+
23、) if(sortBySpouse1i1.getName().equals(mani2.getName() for(inti=0;ir;i+) if(!sortBySpouse2i1.getName().equals( womani.getName() &sortBySpouse2i1.getSex()=womani .getSex() if(mani2.getName().equals(王) inta1=a; for(intj=0;ja1;j+) if(!couple1j.getName().equals( womani.getName() ; else couple1j=womani; s
24、ign3=false; if(sign3) couple1a+=womani; sign3=true; elseif(mani2.getName().equals(陈) intb1=b; for(intj=0;jb1;j+) if(!couple2j.getName().equals( womani.getName() ; else couple2j=womani; sign4=false; if(sign4) couple2b+=womani; sign4=true; elseif(mani2.getName().equals(吴) intc1=c; for(intj=0;jc1;j+) i
25、f(!couple3j.getName().equals( womani.getName() ; else couple3j=womani; sign5=false; if(sign5) couple3c+=womani; sign5=true; else intd1=d; for(intj=0;jd;j+) if(!couple4j.getName().equals( womani.getName() ; else couple4j=womani; sign6=false; if(sign6) couple4d+=womani; sign6=true; for(inti=0;ix;i+) if(sortBySpouse1i.getName().equals(王) for(intj=0;ja;j+) if(sortBySpous
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1