实现基于谓词逻辑的归结原理.docx

上传人:b****6 文档编号:7898616 上传时间:2023-01-27 格式:DOCX 页数:26 大小:76.07KB
下载 相关 举报
实现基于谓词逻辑的归结原理.docx_第1页
第1页 / 共26页
实现基于谓词逻辑的归结原理.docx_第2页
第2页 / 共26页
实现基于谓词逻辑的归结原理.docx_第3页
第3页 / 共26页
实现基于谓词逻辑的归结原理.docx_第4页
第4页 / 共26页
实现基于谓词逻辑的归结原理.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

实现基于谓词逻辑的归结原理.docx

《实现基于谓词逻辑的归结原理.docx》由会员分享,可在线阅读,更多相关《实现基于谓词逻辑的归结原理.docx(26页珍藏版)》请在冰豆网上搜索。

实现基于谓词逻辑的归结原理.docx

实现基于谓词逻辑的归结原理

河南城建学院

《人工智能》实验报告

实验名称:

实现基于谓词逻辑的归结原理

成绩:

____

专业班级:

 

学号:

姓名:

实 验 日 期:

2014年05月13日

实验器材:

一台装PC机。

一、实验目的

熟练掌握使用归结原理进行定理证明的过程,掌握基于谓词逻辑的归结过程中,子句变换过程、替换与合一算法、归结过程及简单归结策略等重要环节,进一步了解机器自动定理证明的实现过程。

二、实验要求

对于任意给定的一阶谓词逻辑所描述的定理,要求实现如下过程:

(1)谓词公式到子句集变换;

(2)替换与合一算法;

(3)在某简单归结策略下的归结。

三、实验步骤

步1设计谓词公式及自居的存储结构,即内部表示。

注意对全称量词x和存在量词x可采用其他符号代替;

步2实现谓词公式到子句集变换过程;

步3实现替换与合一算法;

步4实现某简单归结策略;

步5设计输出,动态演示归结过程,可以以归结树的形式给出;

步6实现谓词逻辑中的归结过程,其中要调用替换与合一算法和归结策略。

四、代码

谓词公式到子句集变换的源代码:

#include

#include

#include

#include

usingnamespacestd;

//一些函数的定义

voidinitString(string&ini);//初始化

stringdel_inlclue(stringtemp);//消去蕴涵符号

stringdec_neg_rand(stringtemp);//减少否定符号的辖域

stringstandard_var(stringtemp);//对变量标准化

stringdel_exists(stringtemp);//消去存在量词

stringconvert_to_front(stringtemp);//化为前束形

stringconvert_to_and(stringtemp);//把母式化为合取范式

stringdel_all(stringtemp);//消去全称量词

stringdel_and(stringtemp);//消去连接符号合取%

stringchange_name(stringtemp);//更换变量名称

//辅助函数定义

boolisAlbum(chartemp);//是字母

stringdel_null_bracket(stringtemp);//删除多余的括号

stringdel_blank(stringtemp);//删除多余的空格

voidcheckLegal(stringtemp);//检查合法性

charnumAfectChar(inttemp);//数字显示为字符

//主函数

voidmain()

{

cout<<"------------------求子句集九步法演示-----------------------"<

system("color0A");

//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))";

stringorign,temp;

charcommand,command0,command1,command2,command3,command4,command5,

command6,command7,command8,command9,command10;

//=============================================================================

cout<<"请输入(Y/y)初始化谓词演算公式"<

cin>>command;

if(command=='y'||command=='Y')

initString(orign);

else

exit(0);

//=============================================================================

cout<<"请输入(Y/y)消除空格"<

cin>>command0;

if(command0=='y'||command0=='Y')

{

//del_blank(orign);//undone

cout<<"消除空格后是"<

<

}

else

exit(0);

//=============================================================================

cout<<"请输入(Y/y)消去蕴涵项"<

cin>>command1;

if(command1=='y'||command1=='Y')

{

orign=del_inlclue(orign);

cout<<"消去蕴涵项后是"<

<

}

else

exit(0);

//=============================================================================

cout<<"请输入(Y/y)减少否定符号的辖域"<

cin>>command2;

if(command2=='y'||command2=='Y')

{

do

{

temp=orign;

orign=dec_neg_rand(orign);

}while(temp!

=orign);

cout<<"减少否定符号的辖域后是"<

<

}

else

exit(0);

//=============================================================================

cout<<"请输入(Y/y)对变量进行标准化"<

cin>>command3;

if(command3=='y'||command3=='Y')

{

orign=standard_var(orign);

cout<<"对变量进行标准化后是"<

<

}

else

exit(0);

//=============================================================================

cout<<"请输入(Y/y)消去存在量词"<

cin>>command4;

if(command4=='y'||command4=='Y')

{

orign=del_exists(orign);

cout<<"消去存在量词后是(w=g(x)是一个Skolem函数)"<

<

}

else

exit(0);

//=============================================================================

cout<<"请输入(Y/y)化为前束形"<

cin>>command5;

if(command5=='y'||command5=='Y')

{

orign=convert_to_front(orign);

cout<<"化为前束形后是"<

<

}

else

exit(0);

//=============================================================================

cout<<"请输入(Y/y)把母式化为合取方式"<

cin>>command6;

if(command6=='y'||command6=='Y')

{

orign=convert_to_and(orign);

cout<<"把母式化为合取方式后是"<

<

}

else

exit(0);

//=============================================================================

cout<<"请输入(Y/y)消去全称量词"<

cin>>command7;

if(command7=='y'||command7=='Y')

{

orign=del_all(orign);

cout<<"消去全称量词后是"<

<

}

else

exit(0);

//=============================================================================

cout<<"请输入(Y/y)消去连接符号"<

cin>>command8;

if(command8=='y'||command8=='Y')

{

orign=del_and(orign);

cout<<"消去连接符号后是"<

<

}

else

exit(0);

//=============================================================================

cout<<"请输入(Y/y)变量分离标准化"<

cin>>command9;

if(command9=='y'||command9=='Y')

{

orign=change_name(orign);

cout<<"变量分离标准化后是(x1,x2,x3代替变量x)"<

<

}

else

exit(0);

//============================================================================

cout<<"-------------------------完毕-----------------------------------"<

cout<<"(请输入Y/y)结束"<

do

{

}while('y'==getchar()||'Y'==getchar());

exit(0);

}

voidinitString(string&ini)

{

charcommanda,commandb;

cout<<"请输入您所需要转换的谓词公式"<

cout<<"需要查看输入帮助(Y/N)?

"<

cin>>commanda;

if(commanda=='Y'||commanda=='y')

cout<<"本例程规定输入时蕴涵符号为>,全称量词为@,存在量词为#,"<

<<"取反为~,吸取为!

合取为%,左右括号分别为(、),函数名请用一个字母"<

cout<<"请输入(y/n)选择是否用户自定义"<

cin>>commandb;

if(commandb=='Y'||commandb=='y')

cin>>ini;

else

ini="(@x)(P(x)>((@y)(P(y)>P(f(x,y)))%~(@y)(Q(x,y)>P(y))))";

cout<<"原始命题是"<

<

}

stringdel_inlclue(stringtemp)//消去>蕴涵项

{

//a>b变为~a!

b

charctemp[100]={""};

stringoutput;

intlength=temp.length();

inti=0,right_bracket=0,falg=0;

stackstack1,stack2,stack3;

strcpy(ctemp,temp.c_str());

while(ctemp[i]!

='\0'&&i<=length-1)

{

stack1.push(ctemp[i]);

if('>'==ctemp[i+1])//如果是a>b则用~a!

b替代

{

falg=1;

if(isAlbum(ctemp[i]))//如果是字母则把ctemp[i]弹出

{

stack1.pop();

stack1.push('~');

stack1.push(ctemp[i]);

stack1.push('!

');

i=i+1;

}

elseif(')'==ctemp[i])

{

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(!

stack1.empty())

{

stack2.push(stack1.top());

stack1.pop();

}

while(!

stack2.empty())

{

output+=stack2.top();

stack2.pop();

}

if(falg==1)

returnoutput;

else

returntemp;

}

stringdec_neg_rand(stringtemp)//减少否定符号的辖域

{

charctemp[100],tempc;

stringoutput;

intflag2=0;

inti=0,left_bracket=0,length=temp.length();

stackstack1,stack2;

queuequeue1;

strcpy(ctemp,temp.c_str());//复制到字符数组中

while(ctemp[i]!

='\0'&&i<=length-1)

{

stack1.push(ctemp[i]);

if(ctemp[i]=='~')//如果是~否则什么都不做

{

charfo=ctemp[i+2];

if(ctemp[i+1]=='(')//如果是(,否则什么都不做

{

if(fo=='@'||fo=='#')//如果是全称量词

{

flag2=1;

i++;

stack1.pop();

stack1.push(ctemp[i]);

if(fo=='@')

stack1.push('#');

else

stack1.push('@');

stack1.push(ctemp[i+2]);

stack1.push(ctemp[i+3]);

stack1.push('(');

stack1.push('~');

if(isAlbum(ctemp[i+4]))

{

stack1.push(ctemp[i+4]);

i=i+5;

}

else

i=i+4;

do

{

queue1.push(temp[i]);

if(temp[i]=='(')

left_bracket++;

elseif(temp[i]==')')

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(!

stack1.empty())

{

stack2.push(stack1.top());

stack1.pop();

}

while(!

stack2.empty())

{

output+=stack2.top();

stack2.pop();

}

if(flag2==1)

temp=output;

/************************************************************/

charctemp1[100];

stringoutput1;

stackstack11,stack22;

intfalg1=0;

inttimes=0;

intlength1=temp.length(),inleftbackets=1,j=0;

strcpy(ctemp1,temp.c_str());

while(ctemp1[j]!

='\0'&&j<=(length1-1))

{

stack11.push(ctemp1[j]);

if(ctemp1[j]=='~')

{

if(ctemp1[j+1]=='('/*&&ctemp1[j+2]!

='~'*/)

{

j=j+2;

stack11.push('(');////////////////

while(inleftbackets!

=0&&inleftbackets>=0&×<=(length1-j)&×>=0)

{

stack11.push(ctemp1[j]);

if(ctemp1[j]=='(')

inleftbackets++;

elseif(ctemp1[j]==')')

inleftbackets--;

if(inleftbackets==1&&ctemp1[j+1]=='!

'&&ctemp1[j+2]!

='@'&&ctemp1[j+2]!

='#')

{

falg1=1;

stack11.push(')');//////////

stack11.push('%');

stack11.push('~');

stack11.push('(');//////////

j=j+1;

}

if(inleftbackets==1&&ctemp1[j+1]=='%'&&ctemp1[j+2]!

='@'&&ctemp1[j+2]!

='#')

{

falg1=1;

stack11.push(')');//////////

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;

/************************************************************/

charctemp3[100];

stringoutput3;

intk=0,left_bracket3=1,length3=temp.length();

stackstack13,stack23;

i

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

当前位置:首页 > 经管营销 > 经济市场

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

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