实验三 归结原理.docx
《实验三 归结原理.docx》由会员分享,可在线阅读,更多相关《实验三 归结原理.docx(36页珍藏版)》请在冰豆网上搜索。
![实验三 归结原理.docx](https://file1.bdocx.com/fileroot1/2023-2/21/18bf82b2-e42e-435b-b076-d7e9de1c8226/18bf82b2-e42e-435b-b076-d7e9de1c82261.gif)
实验三归结原理
《人工智能》
实验大作业
实验题目:
归结原理
专业信息与计算科学
年级091001
姓名马昊
学号091001106
指导老师时华
日期2012-12-5
实验三归结原理
一、实验目的
在本实验中,主要熟悉和掌握归结原理的基本思想和基本方法,通过实验培养了我们利用逻辑方法表示知识,并掌握采用机器推理来进行问题求解的基本方法。
二、实验要求
1.熟悉归结原理的基本思想和归结否证的步骤;
2.本实验JAVA语言编程实现实验内容;
3.利用所学的知识及实验结果,来完成实验报告的各项内容。
三、实验背景知识
归结原理是一种推理规则。
从谓词公式转化为子句集的过程中看出,在子句集中子句之间是合取关系,其中只要有一个子句不可满足,则子句集就不可满足。
若一个子句集中包含空子句,则这个子句集一定是不可满足的。
归结原理就是基于这一认识提出来的。
他的原理就是:
P->Q,Q->R则P->R由于P->Q就是¬P∨Q 而Q->R就是¬Q∨R所以,他相当于将Q和¬Q合并。
也就是说, P∨{∑1}与~P∨{∑2}可以归结为{∑1}∨{∑2}其中∑1,∑2是文字的集合归结否证包含以下步骤:
(1)把前提或公理转换成子句形式;
(2)把求证目标的否定的子句形式加到公理集合中;
(3)对所有这些子句进行归结,产生它们的逻辑结果子句;
(4)用产生空子句的方法来得出矛盾;
(5)否定目标的否证在用于产生空子句的代换下为真。
如何把前提或公理化为子句形式是进行归结的前提,其过程包含如下步骤:
(1)消去蕴涵符号
用~P∨Q替换P→Q
(2)减少否定符号的辖域
每个否定符号~最多只作用在一个谓词符号上
(3)对变量标准化
每个变量仅受一个量词作用
(4)消去存在量词
若存在量词前没有全称量词,则直接消去;否则,要Skolem。
化。
(5)化为前束范式
前束范式:
一个公式,如果量词均非否定地出现在公式
最前面,其辖域延伸到整个公式的末尾,且在公式中仅含有联结词~,∨,∧,则称此种形式为前束范式。
前束范式=(前缀)(母式)
(6)化母式为合取范式
(7)消去全称量词
(8)消去连接词符号∧
用{A,B}替代(A∧B)
(9)将分离的变元归一化
四、实验内容
1.问题描述:
四对夫妇中,王结婚时,周送了礼;周和钱是同一排球队的队员;李的爱人是陈的爱人的表哥;陈夫妇与邻居吵架时,徐、周、吴的爱人都去助战;李、徐、周结婚前住在同一宿舍,试用归结原理求王、周、钱、陈、李、徐、吴、孙几人谁和谁是夫妇。
2.实验源代码:
importjava.lang.*;
publicclassGuessCouple2{
/**数据类型*/
publicclassPerson{
privateStringname;
privatebooleansex;
privatePersonspouse;
publicPerson(Stringname){
this.name=name;
this.sex=false;
this.spouse=null;
}
publicPerson(){
name=null;
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;
}
publicvoidsetSpouse(Personperson1){
this.spouse=person1;
}
publicPersongetSpouse(){
returnspouse;
}
}
Person[]sortBySpouse1=newPerson[8];
Person[]sortBySpouse2=newPerson[8];
intx=0,y=0;
Person[]sortByEqualSex1=newPerson[8];
Person[]sortByEqualSex2=newPerson[8];
intn=0,p=0,f=0;
Person[]woman=newPerson[4];
Person[]man=newPerson[4];
intk=0,s=0,r=0;
booleansign=true;
booleansign1=true;
booleansign2=true;
booleansign3=true;
booleansign4=true;
booleansign5=true;
booleansign6=true;
booleansign7=true;
Person[]couple1=newPerson[4];
Person[]couple2=newPerson[4];
Person[]couple3=newPerson[4];
Person[]couple4=newPerson[4];
inta=0,b=0,c=0,d=0;
inta2=0,b2=0,c2=0,d2=0;
publicvoidisCouple(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,
Personperson2,booleanperson2giveGiftPerson1){
if(person1Marriage&&person2giveGiftPerson1)
if(!
person1.getName().equals(person2.getName()))
System.out.println(person1.getName()+"和"
+person2.getName()+"不是夫妻");
sortBySpouse1[x++]=person1;
sortBySpouse2[y++]=person2;
}
publicvoidoneVolleyballGroup(booleanoneGroup,Personperson1,
Personperson2){
if(oneGroup&&person1.getSex()==person2.getSex())
System.out.println(person1.getName()+"和"+person2.getName()
+"是相同的性别");
sortByEqualSex1[n++]=person1;
sortByEqualSex1[n++]=person2;
f=n;
}
publicvoidliveCollectivityDorm(booleanliveTogether,Personperson1,
Personperson2,Personperson3){
if(liveTogether&&!
person1.getName().equals(person2.getName())
&&!
person1.getName().equals(person3.getName())
&&!
person2.getName().equals(person3.getName())){
System.out.println(person1.getName()+"的性别和"
+person2.getName()+"的性别相同"
+person3.getName()+"的性别相同");
sortByEqualSex2[p++]=person1;
sortByEqualSex2[p++]=person2;
sortByEqualSex2[p++]=person3;
}
}
publicvoidisbrotherInLaw(Personperson1,Personperson2,
booleanp1SIsBrotherInLawP2S){
if(!
person1.getName().equals(person2.getName())
&&p1SIsBrotherInLawP2S){
person1.setSex(false);
sortBySpouse1[x++]=person1;
sortBySpouse2[y++]=person2;
System.out.println(person1.getName()+"是一个女人");
woman[k++]=person1;
r=k;
}
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.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.println(cCouple.getName()+"的配偶不是"
+person2.getName()+"和"+cCouple.getName()
+"的配偶不是"+person2.getName()
+"的配偶");
System.out.println(cCouple.getName()+"的配偶不是"
+person3.getName()+"和"+cCouple.getName()
+"的配偶不是"+person3.getName()
+"的配偶");
}
sortBySpouse1[x++]=cCouple;
sortBySpouse2[y++]=person1;
sortBySpouse1[x++]=cCouple;
sortBySpouse2[y++]=person2;
sortBySpouse1[x++]=cCouple;
sortBySpouse2[y++]=person3;
sortBySpouse1[x++]=person1;
sortBySpouse2[y++]=person2;
sortBySpouse1[x++]=person1;
sortBySpouse2[y++]=person3;
sortBySpouse1[x++]=person2;
sortBySpouse2[y++]=person3;
}
publicvoidguessCoupleByRules(){
Person[]person=newPerson[8];
person[0]=newPerson("王",false,person[0]);
person[1]=newPerson("陈",false,person[1]);
person[2]=newPerson("周",false,person[2]);
person[3]=newPerson("钱",false,person[3]);
person[4]=newPerson("吴",false,person[4]);
person[5]=newPerson("孙",false,person[5]);
person[6]=newPerson("李",false,person[6]);
person[7]=newPerson("许",false,person[7]);
marriage(person[0],true,person[2],true);
oneVolleyballGroup(true,person[2],person[3]);
isbrotherInLaw(person[6],person[1],true);
assistInFighting(true,person[1],person[7],person[2],person[4]);
liveCollectivityDorm(true,person[6],person[7],person[2]);
for(intv=0;vfor(intt=0;t
if(sortByEqualSex1[v].getName().equals(
sortByEqualSex2[t].getName())){
for(intz=0;z
for(intj=0;jif(!
sortByEqualSex2[z].getName().equals(
sortByEqualSex1[j].getName()))
;
else{
sortByEqualSex1[j]=sortByEqualSex2[z];
sign2=false;
}
}
if(sign2)
sortByEqualSex1[n++]=sortByEqualSex2[z];
sign2=true;
}
}
}
for(intm=0;mfor(intq=0;qif(woman[m].getName().equals(sortByEqualSex1[q].getName())){
for(intl=0;lfor(intj=0;jif(!
sortByEqualSex1[l].getName().equals(
woman[j].getName()))
;
else{
woman[j]=sortByEqualSex1[l];
sign=false;
}
}
if(sign)
woman[k++]=sortByEqualSex1[l];
sign=true;
}
}
}
r=k;
if(r==4){
for(intj=0;j<8;j++){
intw=0;
for(inti=0;iif(!
person[j].getName().equals(woman[i].getName()))
w++;
}
if(w==r)
man[s++]=person[j];
}
}
System.out.println();
System.out.println("得到的男和女分别是:
");
System.out.print("女:
"+"");
for(inti=0;iwoman[i].setSex(false);
System.out.print(woman[i].getName()+"");
}
System.out.println();
System.out.println();
System.out.print("男:
"+"");
for(intj=0;j
man[j].setSex(true);
System.out.print(man[j].getName()+"");
}
System.out.println();
System.out.println();
for(inti=0;iif(sortBySpouse1[i].getSex()!
=sortBySpouse2[i].getSex()){
if(!
sortBySpouse1[i].getSex()){
Persontemp=newPerson();
temp=sortBySpouse1[i];
sortBySpouse1[i]=sortBySpouse2[i];
sortBySpouse2[i]=temp;
}
}
}
publicvoidpartitionCouple(){
for(inti1=0;i1for(inti2=0;i2
if(sortBySpouse1[i1].getName().equals(man[i2].getName())){
for(inti=0;iif(!
sortBySpouse2[i1].getName().equals(
woman[i].getName())
&&sortBySpouse2[i1].getSex()==woman[i]
.getSex())
if(man[i2].getName().equals("王")){
inta1=a;
for(intj=0;jif(!
couple1[j].getName().equals(
woman[i].getName()))
;
else{
couple1[j]=woman[i];
sign3=false;
}
}
if(sign3)
couple1[a++]=woman[i];
sign3=true;
}elseif(man[i2].getName().equals("陈")){
intb1=b;
for(intj=0;jif(!
couple2[j].getName().equals(
woman[i].getName()))
;
else{
couple2[j]=woman[i];
sign4=false;
}
}
if(sign4)
couple2[b++]=woman[i];
sign4=true;
}