JAVA实现合一算法_合一算法最新版

#include #include#include#include

using namespacestd;/*struct类的定义*/

structtransform

{stringt_f1;stringt_f2;

};/*函数声明*/

bool same(const string f1,const stringf2) ;

transform dif(const string f1,const stringf2);string change(stringf,transform q);string change2(stringf,transform q);bool syncretism(const string f1,const string f2, vector &);int legal(transform &);bool var(const strings);string varData(strings);int panduan(stringa);int count(stringf);/*主函数*/

intmain()

{

system("color F0"); /*adjust the blackground color*/cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

stringf1,f2;

cout<

cin>>f1;

cout<

cin>>f2;

cout<

cout<

{

cout<

}if(u==1||v==1)

{

cout<

}

cout<

cout<

vectormgu;if(syncretism(f1,f2,mgu))//存在最一般合一,并输出结果

{

cout<

cout<

cout<

}else //不存在最一般合一

{

cout<

}return 0;

}/*合一方法,判断是否可进行合一*/

bool syncretism (const string tf1,const string tf2,vector &mgu)

{string f1=tf1, f2=tf2;while(!same(f1,f2))//f1与f2中的符号不完全相同时才进入while循环

{

transform t=dif(f1,f2);//得到f1和f2的一个差异集,并把它赋给t

int flag=legal(t);if(flag==0)return false;else{

mgu.push_back(t);

f1=change(f1,mgu.back());

f2=change(f2,mgu.back());

cout<

cout<

cout<

}

}return true;

}/*判断两个谓词f1和f2是否相同*/

bool same(const string f1, const stringf2)

{if(f1.length()==f2.length())

{int i=0;while(i

i++;if(i==f1.length())return true;else

return false;

}else

return false;

}/*求解f1和f2的差异集*/transform dif(const string f1,const stringf2)

{int i=0;

transform t;while(f1.at(i)==f2.at(i))//第i个相等时就转向比较i+1,直到遇到不相等时就跳出while循环

i++;int j1=i;while(j1

j1++;if(j1-i==0) return t;//说明无差集

t.t_f1=f1.substr(i,j1-i);//将f1中的不相同的项截取出来放入变量t.t_f1中

int j2=i;while(j2

j2++;if(j2-i==0) return t;//无差集

t.t_f2=f2.substr(i,j2-i);//将f2中的不相同的项截取出来放入变量t.t_f2中

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;

}/*判断置换t是否合法*/

int legal(transform &t)

{if(t.t_f1.length()==0||t.t_f2.length()==0)return 0;if(var(t.t_f2))

{if(var(t.t_f1)&&(varData(t.t_f1)==varData(t.t_f2)))//不能代换合一

return 0;else

return 2;

}if(!var(t.t_f1))//若t_f1和t_f2都不是变量,也不能合一

return 0;stringtemp;

temp=t.t_f1;

t.t_f1=t.t_f2;

t.t_f2=temp;//在t_f1是变量而t_f2不是变量的情况下,交换t_f1和t_f2

return 1;

}/*剥去外层括号*/

string varData(strings)

{if(s.length()==1||s.length()==0)returns;if(s.length()>1)

{int i=0;while(i

i++;int j=i;while(j

j++;string ss=s.substr(i+1,j-i-1);returnvarData(ss);

}else

return false;

}bool var(const strings)

{if(s.length()==0) return false;if(s.length()==1&&s[0]>='A'&&s[0]<='Z')return false;if(s.length()>1)

{int i=0;while(i

i++;int j=i;while(j

j++;string ss=s.substr(i+1,j-i-1);//取出'('和')'之间的串

return var(ss);//递归调用var

}else{return true;

}

}/*该函数查找t_f2在f中的位置并用t_f1替代f中相应的t_f2*/

string change(stringf,transform q)

{int i=f.find(q.t_f2);while(i

{

i=f.find(q.t_f2);if(i

f=f.replace(i,q.t_f2.length(),q.t_f1);

}returnf;

}/*判断输入字符串是否合法*/

int panduan(stringa)

{

stacks;

stackb;int flag=0;if(a[0]=='P'||a[0]=='Q'||a[0]=='R'||a[0]=='S'||a[0]=='T')

cout<

{

cout<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值