实现基于谓词逻辑的归结原理(共24页)_第1页
实现基于谓词逻辑的归结原理(共24页)_第2页
实现基于谓词逻辑的归结原理(共24页)_第3页
实现基于谓词逻辑的归结原理(共24页)_第4页
实现基于谓词逻辑的归结原理(共24页)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上河南城建学院人工智能实验报告实验名称:实现基于谓词逻辑的归结原理成 绩:_ 专业班级:  学 号: 姓 名: 实 验 日 期 :20 14 年 05 月 13日实验器材: 一台装PC机。1、 实验目的 熟练掌握使用归结原理进行定理证明的过程,掌握基于谓词逻辑的归结过程中,子句变换过程、替换与合一算法、归结过程及简单归结策略等重要环节,进一步了解机器自动定理证明的实现过程。2、 实验要求对于任意给定的一阶谓词逻辑所描述的定理,要求实现如下过程:(1) 谓词公式到子句集变换;(2) 替换与合一算法;(3) 在某简单归结策略下的归结。

2、3、 实验步骤 步1 设计谓词公式及自居的存储结构,即内部表示。注意对全称量词"x和存在量词$x可采用其他符号代替;步2 实现谓词公式到子句集变换过程;步3 实现替换与合一算法;步4 实现某简单归结策略;步5 设计输出,动态演示归结过程,可以以归结树的形式给出;步6 实现谓词逻辑中的归结过程,其中要调用替换与合一算法和归结策略。4、 代码谓词公式到子句集变换的源代码:#include<iostream>#include<sstream>#include<stack>#include<queue>using namespace std;/

3、一些函数的定义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 d

4、el_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);/数字显示为字符/主函数voi

5、d main()cout<<"-求子句集九步法演示-"<<endl;system("color 0A"); /orign = "Q(x,y)%(P(y)"/orign = "(x)(P(y)>P)"/orign = "(#x)y(x)"/orign = "(x)x!b(x)"/orign = "(x!y)"/orign = "(a(b)"string orign,temp;char command,comm

6、and0,command1,command2,command3,command4,command5,command6,command7,command8,command9,command10;/=cout<<"请输入(Y/y)初始化谓词演算公式"<<endl;cin>>command;if(command = 'y' | command = 'Y')initString(orign);elseexit(0);/=cout<<"请输入(Y/y)消除空格"<<endl

7、;cin>>command0;if(command0 = 'y' | command0 = 'Y')/del_blank(orign);/undonecout<<"消除空格后是"<<endl<<orign<<endl;elseexit(0);/=cout<<"请输入(Y/y)消去蕴涵项"<<endl;cin>>command1;if(command1 = 'y' | command1 = 'Y')

8、orign =del_inlclue(orign);cout<<"消去蕴涵项后是"<<endl<<orign<<endl;elseexit(0);/=cout<<"请输入(Y/y)减少否定符号的辖域"<<endl;cin>>command2;if(command2 = 'y' | command2 = 'Y')dotemp = orign;orign = dec_neg_rand(orign);while(temp != orign);co

9、ut<<"减少否定符号的辖域后是"<<endl<<orign<<endl;elseexit(0);/=cout<<"请输入(Y/y)对变量进行标准化"<<endl;cin>>command3;if(command3 = 'y' | command3 = 'Y')orign = standard_var(orign);cout<<"对变量进行标准化后是"<<endl<<orign<

10、<endl;elseexit(0);/=cout<<"请输入(Y/y)消去存在量词"<<endl;cin>>command4;if(command4 = 'y' | command4 = 'Y')orign = del_exists(orign);cout<<"消去存在量词后是(w = g(x)是一个Skolem函数)"<<endl<<orign<<endl;elseexit(0);/=cout<<"请输入(Y/

11、y)化为前束形"<<endl;cin>>command5;if(command5 = 'y' | command5= 'Y')orign = convert_to_front(orign);cout<<"化为前束形后是"<<endl<<orign<<endl;elseexit(0);/=cout<<"请输入(Y/y)把母式化为合取方式"<<endl;cin>>command6;if(command6 = &

12、#39;y' | command6 = 'Y')orign = convert_to_and(orign);cout<<"把母式化为合取方式后是"<<endl<<orign<<endl;elseexit(0);/=cout<<"请输入(Y/y)消去全称量词"<<endl;cin>>command7;if(command7 = 'y' | command7 = 'Y')orign= del_all(orign);cou

13、t<<"消去全称量词后是"<<endl<<orign<<endl;elseexit(0);/=cout<<"请输入(Y/y)消去连接符号"<<endl;cin>>command8;if(command8 = 'y' | command8 = 'Y')orign = del_and(orign);cout<<"消去连接符号后是"<<endl<<orign<<endl;else

14、exit(0);/=cout<<"请输入(Y/y)变量分离标准化"<<endl;cin>>command9;if(command9 = 'y' | command9 = 'Y')orign = change_name(orign);cout<<"变量分离标准化后是(x1,x2,x3代替变量x)"<<endl<<orign<<endl;elseexit(0);/=cout<<"-完毕-"<<endl

15、;cout<<"(请输入Y/y)结束"<<endl;dowhile('y' = getchar() | 'Y'=getchar();exit(0); void initString(string &ini)char commanda,commandb;cout<<"请输入您所需要转换的谓词公式"<<endl;cout<<"需要查看输入帮助(Y/N)? "<<endl;cin>>commanda;if(comman

16、da = 'Y' | commanda = 'y')cout<<"本例程规定输入时蕴涵符号为>,全称量词为,存在量词为#,"<<endl<<"取反为,吸取为!,合取为%,左右括号分别为( 、 ),函数名请用一个字母"<<endl;cout<<"请输入(y/n)选择是否用户自定义"<<endl;cin>>commandb;if(commandb ='Y'| commandb='y')c

17、in>>ini;elseini = "(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!bchar ctemp100=""string output;int length = temp.length();int i = 0,right_bracket = 0

18、,falg= 0;stack<char> stack1,stack2,stack3;strcpy(ctemp,temp.c_str();while(ctempi != '0' && i <= length-1)stack1.push(ctempi);if('>' = ctempi+1)/如果是a>b则用a!b替代falg = 1;if(isAlbum(ctempi)/如果是字母则把ctempi弹出stack1.pop();stack1.push('');stack1.push(ctempi);stac

19、k1.push('!');i = i + 1;else if(')' = ctempi)right_bracket+;doif('(' = stack1.top()right_bracket-;stack3.push(stack1.top();stack1.pop();while(right_bracket != 0);stack3.push(stack1.top();stack1.pop();stack1.push('');while(!stack3.empty()stack1.push(stack3.top();stack3.

20、pop();stack1.push('!');i = i + 1;i+;while(!stack1.empty()stack2.push(stack1.top();stack1.pop();while(!stack2.empty()output += stack2.top();stack2.pop();if(falg = 1)return output;elsereturn temp;string dec_neg_rand(string temp)/减少否定符号的辖域char ctemp100,tempc;string output;int flag2 = 0;int i =

21、0,left_bracket = 0,length = temp.length();stack <char> stack1,stack2;queue <char> queue1;strcpy(ctemp,temp.c_str();/复制到字符数组中while(ctempi != '0' && i <= length - 1)stack1.push(ctempi);if(ctempi = '')/如果是否则什么都不做char fo = ctempi+2;if(ctempi+1 = '(')/如果是(,否

22、则什么都不做if(fo = '' | fo ='#')/如果是全称量词flag2 = 1;i+;stack1.pop();stack1.push(ctempi);if(fo = '')stack1.push('#');elsestack1.push('');stack1.push(ctempi+2);stack1.push(ctempi+3);stack1.push('(');stack1.push('');if(isAlbum(ctempi+4)stack1.push(ctempi

23、+4);i = i + 5;elsei = i + 4;doqueue1.push(tempi);if(tempi = '(')left_bracket +;else if(tempi = ')')left_bracket -;i +;while(left_bracket != 0 && left_bracket >=0);queue1.push(')');while(!queue1.empty()tempc = queue1.front();queue1.pop();stack1.push(tempc);i +;while

24、(!stack1.empty()stack2.push(stack1.top();stack1.pop();while(!stack2.empty()output += stack2.top();stack2.pop();if(flag2 = 1)temp = output;/*/char ctemp1100;string output1;stack<char> stack11,stack22;int falg1 = 0;int times = 0;int length1 = temp.length(),inleftbackets = 1,j = 0;strcpy(ctemp1,t

25、emp.c_str();while(ctemp1j != '0' && j <= (length1 -1)stack11.push(ctemp1j);if(ctemp1j = '')if(ctemp1j+1 = '(' /*&& ctemp1j + 2 != ''*/)j = j + 2;stack11.push('(');/while(inleftbackets != 0 && inleftbackets >=0 && times <

26、;= (length1 - j) && times >= 0)stack11.push(ctemp1j);if(ctemp1j = '(')inleftbackets +;else if(ctemp1j = ')')inleftbackets -;if(inleftbackets = 1 && ctemp1j+1 = '!' && ctemp1j+2 != '' && ctemp1j+2 != '#')falg1 =1;stack11.push(

27、')');/stack11.push('%');stack11.push('');stack11.push('(');/j = j+1;if(inleftbackets = 1 && ctemp1j+1 = '%' && ctemp1j+2 != '' && ctemp1j+2 != '#')falg1 =1;stack11.push(')');/stack11.push('!');stack11.pus

28、h('');stack11.push('(');/j = j+1;j = j +1;if(falg1 = 1)stack11.push(')');stack11.pop();stack11.push(')');/此处有bugstack11.push(')');/此处有bugj +;while(!stack11.empty()stack22.push(stack11.top();stack11.pop();while(!stack22.empty()output1 += stack22.top();stack22.p

29、op();if(falg1 = 1)temp = output1;/*/char ctemp3100;string output3;int k = 0,left_bracket3 = 1,length3 = temp.length();stack <char> stack13,stack23;int flag = 0,bflag = 0;strcpy(ctemp3,temp.c_str();/复制到字符数组中while(ctemp3k != '0' && k <= length3-1)stack13.push(ctemp3k);if(ctemp

30、3k = '')if(ctemp3k+1 = '(')if(ctemp3k + 2 = '')flag = 1;stack13.pop();k =k + 2;while(left_bracket3 != 0 && left_bracket3 >=0)stack13.push(ctemp3k+1);if(ctemp3k+1 = '(')left_bracket3 +;if(ctemp3k+1 = ')')left_bracket3 -;if(ctemp3k+1 = '!' | c

31、temp3k+1 = '%')bflag = 1;k +;stack13.pop();k +;while(!stack13.empty()stack23.push(stack13.top();stack13.pop();while(!stack23.empty()output3 += stack23.top();stack23.pop();if(flag = 1 && bflag = 0)temp = output3;return temp;string standard_var(string temp)/对变量标准化,简化,不考虑多层嵌套char ctemp1

32、00,des10=" "strcpy(ctemp,temp.c_str();stack <char> stack1,stack2;int l_bracket = 1,falg = 0,bracket = 1;int i = 0,j = 0;string output;while(ctempi != '0' && i < temp.length()stack1.push(ctempi);if(ctempi = '' | ctempi = '#')stack1.push(ctempi+1);des

33、j = ctempi+1;j+;stack1.push(ctempi+2);i = i + 3;stack1.push(ctempi);i+;if(ctempi-1 = '(')while(ctempi != '0' && l_bracket != 0)if(ctempi = '(')l_bracket +;if(ctempi = ')')l_bracket -;if(ctempi = '(' && ctempi+1 = '' )desj = ctempi+2;j+;

34、if(ctempi+1 = '(' && ctempi+2 = '#' )falg = 1;int kk = 1;stack1.push(ctempi);stack1.push('(');stack1.push(ctempi+2);i = i+3;if(ctempi = 'y')ctempi ='w'stack1.push(ctempi);stack1.push(')');stack1.push('(');i = i+3;while(kk != 0)if(ctempi

35、='(')kk+;if(ctempi =')')kk-;if(ctempi = 'y')ctempi ='w'stack1.push(ctempi);i+;stack1.push(ctempi);i +;i +;while(!stack1.empty()stack2.push(stack1.top();stack1.pop();while(!stack2.empty()output += stack2.top();stack2.pop();if(falg = 1)return output;elsereturn temp;stri

36、ng del_exists(string temp)/消去存在量词char ctemp100,unknow;strcpy(ctemp,temp.c_str();int left_brackets = 0,i = 0,falg = 0;queue<char> queue1;string output;while(ctempi != '0' && i < temp.length()if(ctempi ='(' && ctempi+1 ='#')falg = 1;unknow = ctempi+2;i

37、= i+4;doif(ctempi = '(')left_brackets +;if(ctempi = ')')left_brackets -;if(ctempi = unknow)queue1.push('g');queue1.push('(');queue1.push('x');queue1.push(')');if(ctempi != unknow)queue1.push(ctempi);i+;while(left_brackets != 0);queue1.push(ctempi);i+;w

38、hile(!queue1.empty()output+= queue1.front();queue1.pop();if(falg = 1)return output;elsereturn temp;string convert_to_front(string temp)/化为前束形char ctemp100;strcpy(ctemp,temp.c_str();int i = 0;string out_var = "",output = ""while(ctempi != '0' && i < temp.length(

39、)if(ctempi = '(' && ctempi+1 = '')out_var = out_var + ctempi ;/()out_var = out_var + ctempi+1 ;out_var = out_var +ctempi+2;out_var = out_var +ctempi+3;i = i + 4;output = output + ctempi;i+;output = out_var + output;return output; string convert_to_and(string temp)/把母式化为合取范式 ,

40、Q/A?temp = "(x)(y)(P(x)!(P(y)!P(f(x,y)%(P(x)!Q(x,g(x)%(P(x)!(P(g(x)"return temp;string del_all(string temp)/消去全称量词char ctemp100;strcpy(ctemp,temp.c_str();int i = 0,flag = 0;string output = ""while(ctempi != '0' && i < temp.length()if(ctempi = '(' && ctempi+1 = '')i = i + 4;flag = 1;elseoutput = output + ctempi;i +;return output;string del_and(string temp)/消去连接符号合取%char ctemp100;strcpy(ctemp,temp.c_str();int i = 0,flag = 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论