一实验目的及原理
目的:通过编程实现对子句的消解,进一步理解含有参数的子句如何使用消解规则,掌握子句消解的原理和规则。
原理:令L1,L2为两任意原子公式;L1和L2具有相同的谓词符号,但一般具有不同的变量。已知两子句L1∨α和~L2∨β,如果L1和L2具有最一般合一σ,那么通过消解可以从这两个父辈子句推导出一个新子句(α∨β)σ。
二.实验难点
1.如何寻找最一般的合一者σ,尤其对于参数比较多的情况下。
替换的一般规则是:
用函数替代变量(f(x)->y),用常量替代变量(a->x)。这里我们事先约定好常量26个字母前面部分,变量时26个字母后面部分,中间部分谓词量。当然我们也可以约定以***开头的为常量或变量。
三、实验条件
硬件:微型计算机。
语言:本实验选用的为C++语言。
开发环境:VS2010
四.实验步骤
1.获取输入两个子句
2. 以析取符号’V’将子句分割单个文字(literals)的形式,参数以’,’进行分割。
3将每一个子句分割的文字放到同一个数组中
4.扫描两个数组按消解规则进行消解
五.算法实现
5.1算法实现的数据结构
struct literals //文字
{
byte is_not;//是’~’则其值为1否则为0
bool resloution_flag;//能否消解
string predicate_name;//谓词名称
vector<string> vec_ parameter;//参数
};
structreplace
{
string str_src;//初始的参数
string str_replace;//替换的参数
};
5.2错误处理
enum ErrorType{invalidChar,unknowError};//错误类型
Char *error_msg[]={"Invalid char!“,"Unknow error!"};
5.3算法实现类
class ResolutionProcess
{
private:
vector<literals> vec_literals1;//存放子句一
vector<literals> vec_literals2; ;//存放子句二
vector<replace> vec_rep;//替换的变量
string str_result;//消解结果
voidsplit(string str,char split_c,vector<string>* ret);//分割字符串
voidpre_process(vector<string> vec_str,vector<literals>&vec_literals);//寻找互补对
voidResolution();//消解
voidreplace_variable ();//替换变量
public:
ResolutionProcess(stringstr1,string str2);
~ResolutionProcess(void);
string get_resolution_result();//获取消解结果
string get_par_replace();//获取σ
};
六.实验结果
核心代码:
voidResolutionProcess::split(string s,char split_c,vector<string>* ret)//字符串分割函数
{
int last = 0;
int index=s.find_first_of(split_c,last);
while (index!=std::string::npos)
{
ret->push_back(s.substr(last,index-last));
last=index+1;
index=s.find_first_of(split_c,last);
}
if (index-last>0)
{
ret->push_back(s.substr(last,index-last));
}
}
void ResolutionProcess::Resolution()//消解{
for(int i=0;i<(int)vec_literals1.size();i++)
{
for(int j=0;j<(int)vec_literals2.size();j++)
{
if(vec_literals1[i].predicate_name==vec_literals2[j].predicate_name&&vec_literals1[i].is_not^vec_literals2[j].is_not)
{
vec_literals1[i].resloution_flag=true;
vec_literals2[j].resloution_flag=true;
for(int m=0;m<(int)vec_literals1[i].vec_parameter.size();m++)
{ replace rep;
if(vec_literals1[i].vec_parameter[m].find('(')!=string::npos)//有括号的情况认为其为函数
{
rep.str_src=vec_literals2[j].vec_parameter[m];
rep.str_replace=vec_literals1[i].vec_parameter[m];
vec_rep.push_back(rep);
}
else if(vec_literals2[j].vec_parameter[m].find('(')!=string::npos)
{
rep.str_src=vec_literals1[i].vec_parameter[m];
rep.str_replace=vec_literals2[j].vec_parameter[m];
vec_rep.push_back(rep);
}
else if(vec_literals2[i].vec_parameter[m]==vec_literals1[i].vec_parameter[m])
{
}
else if(vec_literals2[i].vec_parameter[m]<vec_literals1[i].vec_parameter[m])
{
rep.str_src=vec_literals2[j].vec_parameter[m];
rep.str_replace=vec_literals1[i].vec_parameter[m];
vec_rep.push_back(rep);
}
else
{
rep.str_src=vec_literals1[i].vec_parameter[m];
rep.str_replace=vec_literals2[j].vec_parameter[m];
vec_rep.push_back(rep);
}
}
}
}
}
}
具体程序代码:http://download.csdn.net/detail/huangshanchun/6800657
由于本人水平有限难免会有不足,望各位高人批评指正。