人工智能消解原理实验报告

一实验目的及原理

目的:通过编程实现对子句的消解,进一步理解含有参数的子句如何使用消解规则,掌握子句消解的原理和规则。

原理:令L1L2为两任意原子公式;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

由于本人水平有限难免会有不足,望各位高人批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值