实验三 归结原理.docx

上传人:b****8 文档编号:10579181 上传时间:2023-02-21 格式:DOCX 页数:36 大小:82.51KB
下载 相关 举报
实验三 归结原理.docx_第1页
第1页 / 共36页
实验三 归结原理.docx_第2页
第2页 / 共36页
实验三 归结原理.docx_第3页
第3页 / 共36页
实验三 归结原理.docx_第4页
第4页 / 共36页
实验三 归结原理.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

实验三 归结原理.docx

《实验三 归结原理.docx》由会员分享,可在线阅读,更多相关《实验三 归结原理.docx(36页珍藏版)》请在冰豆网上搜索。

实验三 归结原理.docx

实验三归结原理

《人工智能》

实验大作业

 

实验题目:

归结原理

专业信息与计算科学

年级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;v

for(intt=0;t

if(sortByEqualSex1[v].getName().equals(

sortByEqualSex2[t].getName())){

for(intz=0;z

for(intj=0;j

if(!

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;m

for(intq=0;q

if(woman[m].getName().equals(sortByEqualSex1[q].getName())){

for(intl=0;l

for(intj=0;j

if(!

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;i

if(!

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;i

woman[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;i

if(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;i1

for(inti2=0;i2

if(sortBySpouse1[i1].getName().equals(man[i2].getName())){

for(inti=0;i

if(!

sortBySpouse2[i1].getName().equals(

woman[i].getName())

&&sortBySpouse2[i1].getSex()==woman[i]

.getSex())

if(man[i2].getName().equals("王")){

inta1=a;

for(intj=0;j

if(!

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;j

if(!

couple2[j].getName().equals(

woman[i].getName()))

;

else{

couple2[j]=woman[i];

sign4=false;

}

}

if(sign4)

couple2[b++]=woman[i];

sign4=true;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1