人工智能消解原理实验报告
一实验目的及原理
目的:通过编程实现对子句的消解,进一步理解含有参数的子句如何使用消解规则,掌握子句消解的原理和规则。
原理:令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 //文字
{
byteis_not;//是’~’则其值为1否则为0
boolresloution_flag;//能否消解
stringpredicate_name;//谓词名称
vectorvec_parameter;//参数
};
structreplace
{
stringstr_src;//初始的参数
stringstr_replace;//替换的参数
};
5.2错误处理
enumErrorType{invalidChar,unknowError};//错误类型
Char*error_msg[]={"Invalid char!“,"Unknowerror!"};
5.3算法实现类
classResolutionProcess
{
private:
vectorvec_literals1;//存放子句一
vectorvec_literals2;;//存放子句二
vectorvec_rep;//替换的变量
stringstr_result;//消解结果
voidsplit(stringstr,char split_c,vector*ret);//分割字符串
voidpre_process(vectorvec_str,vector&vec_literals);//寻找互补对
voidResolution();//消解
voidreplace_variable();//替换变量
public:
ResolutionProcess(stringstr1,stringstr2);
~ResolutionProcess(void);
stringget_resolution_result();//获取消解结果
stringget_par_replace();//获取σ
};
六.实验结果
核心代码:
voidResolutionProcess::split(strings,charsplit_c,vector*ret)//字符串分割函数
{
intlast=0;
intindex=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));
}
}
voidResolutionProcess::Resolution()//消解{ for(inti=0;i