#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<