人工智能合一算法C++.docx
《人工智能合一算法C++.docx》由会员分享,可在线阅读,更多相关《人工智能合一算法C++.docx(9页珍藏版)》请在冰豆网上搜索。
人工智能合一算法C++
人工智能-合一算法(C++)
人工智能第1次作业
一般合一算法(C++实现)
姓名:
佟学号:
201224班级:
12计本非师学院:
信息学院
一、简单程序如下
#include
#include
#include
usingnamespacestd;
intiC=0;//标记公式集中括号匹配数
classSyncretism{
private:
structTransform{//一个代换(差异集)
stringt_f1;
stringt_f2;
};
public:
boolIssyn(stringf1,stringf2,vector&t);//是否能合一
Transformdifferent(conststringf1,conststringf2)//求差异集
{
inti=0;
Transformt;
while(f1.at(i)==f2.at(i))
i++;
intj1=i;
while(j1=',')
j1++;
if(j1-i==0)returnt;
t.t_f1=f1.substr(i,j1-i);
intj2=i;
while(j2=',')
j2++;
if(j2-i==0)returnt;
t.t_f2=f2.substr(i,j2-i);
while(t.t_f1[j1-i-1]==t.t_f2[j2-i-1])
{
t.t_f1.erase(j1-1-i);
t.t_f2.erase(j2-i-1);
j1--;
j2--;
}
returnt;
}
boolsame(conststringf1,conststringf2);//判断两个公式是否相同
stringchange(stringf,Transformt);//用代换q对公式f进行合一代换
boollegal(Transform&t);//
intvar(conststrings);//s中每个()内的子串是变量还是常量
voidshow();//最终演示算法
};
boolSyncretism:
:
Issyn(stringf1,stringf2,vector&lan)
{
while(!
same(f1,f2))
{
Transformt=different(f1,f2);
boolflag=legal(t);
if(!
flag)
returnfalse;
else
{
lan.push_back(t);//将t加入vectorlan中
if(flag)
{
f1=change(f1,lan.back());//用lan的最后一个元素代换
f2=change(f2,lan.back());
cout<<"变换后:
"<cout<<"f1:
"<cout<<"f2:
"<}
if(same(f1,f2))break;
}
}
returntrue;
}
boolSyncretism:
:
same(conststringf1,conststringf2)
{
if(pare(f2)==0)returntrue;
elsereturnfalse;
}
stringSyncretism:
:
change(stringf,Transformt)
{
inti=f.find(t.t_f2);
while(i{
i=f.find(t.t_f2);
if(if=f.replace(i,t.t_f2.length(),t.t_f1);
}
returnf;
}
boolSyncretism:
:
legal(Transform&t)
{
if(t.t_f1.length()==0||t.t_f2.length==0)
returnfalse;
elseif(var(t.t_f1)==0||var(t.t_f2)==0)returnfalse;
elseif(var(t.t_f1)==1&&var(t.t_f2)==1&&t.t_pare(t.t_f2)!
=0)
returnfalse;
elseif(var(t.t_f1)==2)
{
if(var(t.t_f2)==1)
{
stringtemp=t.t_f1;//变量常量交换位置
t.t_f1=t.t_f2;
t.t_f2=temp;
}
else
{
inti1=var(t.t_f2);
i1=iC;
iC=0;
inti2=var(t.t_f1);
i2=iC;
if(i1{
stringtemp=t.t_f1;//变量常量交换位置
t.t_f1=t.t_f2;
t.t_f2=temp;
}
}
returntrue;
}
else
returntrue;
}
intSyncretism:
:
var(conststrings)
{
if(s.length()==0)return0;//空
if(s.length()==1&&s[0]>='a'&&s[0]<='g')return1;//常量
if(s.length()>1)
{
inti=0;
while(i='(')
i++;
iC++;
stringss=s.substr(i+1,s.length()-i-2);//抽取s中的匹配的()中的子串
returnvar(ss);
}
elsereturn2;
}
voidSyncretism:
:
show()
{
cout<<"常量:
形如a,b,c,d(a-g)等"<形如x,y,z,u等"<stringf1,f2;
cout<<"输入F1:
";
cin>>f1;
cout<<"输入F2:
";
cin>>f2;
vectorlan;
if(Issyn(f1,f2,lan))
{
if(same(f1,f2))//如果f1,f2相同则合一为ε
{
cout<<"合一σ=ε"<return;
}
cout<<"合一σ={";
for(inti=0;icout<cout<}
else
cout<<"不能进行合一"<}
intmain()
{
SyncretismSy;
Sy.show();
return0;
}
二、演示结果
三、程序的实现
Transform中的t_f1,t_f2分别表示差异集中的两个字符串。
Vector变量lan存放合一的集合。
函数功能
Issyn()判断两个公式是否相同。
different()求差异集。
change()用代换对公式进行合一代换。
legal()对t_f1,t_f2判断然后对换并判断是否为合一字符串
same()判断两个公式是否相同。
var()字符串每个()内的子串是变量还是常量。
show()最终演示算法函数。
四、具体程序执行
程序执行时先输入公式集中的公式然后调用Issyn函数判断是否能合一如果不能则退出,如果能判断公式是否相同相同则合一是ε。
不是则进一步判断。
调用different函数找出差异集放在vector变量lan中再调用legal函数和var函数判断合一时到底哪个是变量
哪个是常量t_f1存放常量t_f2存放变量不符合则进行交换,在用t_f1代换调公式中的t_f2进行下一轮的比较寻找差异集然后判断再代换。
每次差异集都添加到lan中最后输出lan中的元素。