1、实现基于谓词逻辑得归结原理河南城建学院人工智能实验报告实验名称:实现基于谓词逻辑的归结原理成 绩:_ 专业班级: 学 号: 姓 名: 实验日期 :20 14 年 05 月 13日实验器材: 一台装PC机。1、实验目的 熟练掌握使用归结原理进行定理证明的过程,掌握基于谓词逻辑的归结过程中,子句变换过程、替换与合一算法、归结过程及简单归结策略等重要环节,进一步了解机器自动定理证明的实现过程。2、实验要求对于任意给定的一阶谓词逻辑所描述的定理,要求实现如下过程:(1) 谓词公式到子句集变换;(2) 替换与合一算法;(3) 在某简单归结策略下的归结。3、实验步骤 步1 设计谓词公式及自居的存储结构,即
2、内部表示。注意对全称量词x和存在量词x可采用其他符号代替;步2 实现谓词公式到子句集变换过程;步3 实现替换与合一算法;步4 实现某简单归结策略;步5 设计输出,动态演示归结过程,可以以归结树的形式给出;步6 实现谓词逻辑中的归结过程,其中要调用替换与合一算法和归结策略。4、代码谓词公式到子句集变换的源代码:#include#include#include#includeusing namespace std;/一些函数的定义void initString(string &ini);/初始化string del_inlclue(string temp);/消去蕴涵符号string dec_ne
3、g_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 del_all(string temp);/消去全称量词string del_and(string temp);/消去连接符号合取%string change_name(string temp)
4、;/更换变量名称/辅助函数定义bool isAlbum(char temp);/是字母string del_null_bracket(string temp);/删除多余的括号string del_blank(string temp);/删除多余的空格void checkLegal(string temp);/检查合法性char numAfectChar(int temp);/数字显示为字符/主函数void main() cout-求子句集九步法演示-P); /orign = (#x)y(x); /orign = (x)x!b(x); /orign = (x!y); /orign = (a(b
5、); string orign,temp; char command,command0,command1,command2,command3,command4,command5, command6,command7,command8,command9,command10; /= cout请输入(Y/y)初始化谓词演算公式command; if(command = y | command = Y) initString(orign); else exit(0); /= cout请输入(Y/y)消除空格command0; if(command0 = y | command0 = Y) /del_b
6、lank(orign);/undone cout消除空格后是endl orignendl; else exit(0); /= cout请输入(Y/y)消去蕴涵项command1; if(command1 = y | command1 = Y) orign =del_inlclue(orign); cout消去蕴涵项后是endl orignendl; else exit(0); /= cout请输入(Y/y)减少否定符号的辖域command2; if(command2 = y | command2 = Y) do temp = orign; orign = dec_neg_rand(orign)
7、; while(temp != orign); cout减少否定符号的辖域后是endl orignendl; else exit(0); /= cout请输入(Y/y)对变量进行标准化command3; if(command3 = y | command3 = Y) orign = standard_var(orign); cout对变量进行标准化后是endl orignendl; else exit(0); /= cout请输入(Y/y)消去存在量词command4; if(command4 = y | command4 = Y) orign = del_exists(orign); cou
8、t消去存在量词后是(w = g(x)是一个Skolem函数)endl orignendl; else exit(0); /= cout请输入(Y/y)化为前束形command5; if(command5 = y | command5= Y) orign = convert_to_front(orign); cout化为前束形后是endl orignendl; else exit(0); /= cout请输入(Y/y)把母式化为合取方式command6; if(command6 = y | command6 = Y) orign = convert_to_and(orign); cout把母式化
9、为合取方式后是endl orignendl; else exit(0); /= cout请输入(Y/y)消去全称量词command7; if(command7 = y | command7 = Y) orign= del_all(orign); cout消去全称量词后是endl orignendl; else exit(0); /= cout请输入(Y/y)消去连接符号command8; if(command8 = y | command8 = Y) orign = del_and(orign); cout消去连接符号后是endl orignendl; else exit(0); /= cou
10、t请输入(Y/y)变量分离标准化command9; if(command9 = y | command9 = Y) orign = change_name(orign); cout变量分离标准化后是(x1,x2,x3代替变量x)endl orignendl; else exit(0); /= cout-完毕-endl; cout(请输入Y/y)结束endl; do while(y = getchar() | Y=getchar(); exit(0); void initString(string &ini) char commanda,commandb; cout请输入您所需要转换的谓词公式e
11、ndl; cout需要查看输入帮助(Y/N)? commanda; if(commanda = Y | commanda = y) cout,全称量词为,存在量词为#,endl 取反为,吸取为!,合取为%,左右括号分别为( 、 ),函数名请用一个字母endl; cout请输入(y/n)选择是否用户自定义commandb; if(commandb =Y| commandb=y) cinini; else ini = (x)(P(x)(y)(P(y)P(f(x, y)%(y)(Q(x,y)P(y); cout原始命题是endl ini蕴涵项 /ab变为a!b char ctemp100=; str
12、ing output; int length = temp.length(); int i = 0,right_bracket = 0,falg= 0; stack stack1,stack2,stack3; strcpy(ctemp,temp.c_str(); while(ctempi != 0 & i = ctempi+1)/如果是ab则用a!b替代 falg = 1; if(isAlbum(ctempi)/如果是字母则把ctempi弹出 stack1.pop(); stack1.push(); stack1.push(ctempi); stack1.push(!); i = i + 1;
13、 else if() = ctempi) right_bracket+; do if( = 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.pop(); stack1.push(!); i = i + 1; i+; while(!sta
14、ck1.empty() stack2.push(stack1.top(); stack1.pop(); while(!stack2.empty() output += stack2.top(); stack2.pop(); if(falg = 1) return output; else return temp;string dec_neg_rand(string temp)/减少否定符号的辖域 char ctemp100,tempc; string output; int flag2 = 0; int i = 0,left_bracket = 0,length = temp.length()
15、; stack stack1,stack2; queue queue1; strcpy(ctemp,temp.c_str();/复制到字符数组中 while(ctempi != 0 & i =0); queue1.push(); while(!queue1.empty() tempc = queue1.front(); queue1.pop(); stack1.push(tempc); i +; while(!stack1.empty() stack2.push(stack1.top(); stack1.pop(); while(!stack2.empty() output += stack2
16、.top(); stack2.pop(); if(flag2 = 1) temp = output; /*/ char ctemp1100; string output1; stack stack11,stack22; int falg1 = 0; int times = 0; int length1 = temp.length(),inleftbackets = 1,j = 0; strcpy(ctemp1,temp.c_str(); while(ctemp1j != 0 & j =0 & times = 0) stack11.push(ctemp1j); if(ctemp1j = () i
17、nleftbackets +; else if(ctemp1j = ) inleftbackets -; if(inleftbackets = 1 & ctemp1j+1 = ! & ctemp1j+2 != & ctemp1j+2 != #) falg1 =1; stack11.push();/ stack11.push(%); stack11.push(); stack11.push();/ j = j+1; if(inleftbackets = 1 & ctemp1j+1 = % & ctemp1j+2 != & ctemp1j+2 != #) falg1 =1; stack11.pus
18、h();/ stack11.push(!); stack11.push(); stack11.push();/ j = j+1; j = j +1; if(falg1 = 1) stack11.push(); stack11.pop(); stack11.push();/此处有bug stack11.push();/此处有bug j +; while(!stack11.empty() stack22.push(stack11.top(); stack11.pop(); while(!stack22.empty() output1 += stack22.top(); stack22.pop(); if(falg1 = 1) temp = output1; /*/ char ctemp3100; string output3; int k = 0,left_bracket3 = 1,length3 = temp.length(); stack stack13,stack23; int f
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1