—算法实现

一、作业目的:

用某一种编程语言实现合一算法。

二、首先把教材中的Unify算法表述如下:

算法 unify (E1, E2)

1 、if E1或E2是一个原子(即一个谓词符号、函数符号、常量、否定符号或变量),交换E1和E2的位置(如果必要),使E1是一个原子 do:

2、 begin

3、 if E1与E2相同,return NIL

4 、if E1是变量 do:

5、 Begin

6、 if E1出现在E2中 return FAIL

7 、return {E2 / E1}

8、 End

9 、if E2是一个变量 return {E1 / E2}

10、 return FAIL

11、 end

12、F1←E1的第一个元素,T1←E1的其余元素

13、 F2←E2的第一个元素,T2←E2的其余元素

14、 Z1←unify(F1, F2)

15、 if Z1=FAIL return FAIL

16、G1←Z1作用到T1的结果

17 、G2←Z1作用到T2的结果

18 、Z2←unify(G1, G2)

19、 if Z2=FAIL return FAIL

20、 return Z1和Z2的合成

其中所需的一些知识概念从书摘抄如下:

置换:用集合S={t1/v1, t2/v2, …tn/vn}表示任一置换

其中:ti/vi 为对vi的任何出现用ti代替

置换要求:①某变量的每次出现均用同一个项来代替

②变量不可用含有同一个变量的项代替(如:f(x)/x))

注意这也就是上面的合一算法中会失败的一种主要的情况!!!见结果截图的最后一种不能合一的情况!

用S对表达式E置换后的例记为:Es

例:对P(x, f(y), B)用以下个置换作用后得到的置换例如下:

置换 置换例

1. S1={z/x, w/y} Es1=P(z,f(w),B) 2. S2={A/y} Es2=P(x,f(A),B)

3. S3={g(z)/x,A/y} Es3=P(g(z),f(A),B) 4. S4={C/x,A/y} Es4=P(C,f(A),B)

合一者:如果存在一个置换S,使得表达式集{Ei}中的每个表达式经过S的置换后得到的置换例满足E1s=E2s=…Eis,则称表达式集{Ei}是可以合一的,称置换S为{Ei}的合一者。

例如:有子句集{P(x,f(y),B),P(x,f(B),B)}

设:置换S={A/x,B/y},置换结果为{P(A,f(B),B)}

∴该子句集是可以合一的,S为合一者。

最一般合一者:表达形式最简单的合一者为最一般合一者,记:mgu g

本程序就是利用以上的Unify算法来求两个表达式的最一般合一者,并把它们输出显示!!!

三、程序源码及说明

#include

#include

using namespace std;

class answer

{

public:

string w1[50];

string w2[50];//用w1替换w2

int mark;//状态位,表示失败,-1表示空,表示有置换对

int count;

answer(){mark=-1;count=0;}

void assign(string &s1,string &s2,int mark1)

{

w1[count]=s1;

w2[count]=s2;

mark=mark1;

count++;

}

};

void Transport(string &w1)//对w1串进行处理,使形如P(x)的串转换为算法要求的形如(Px)的串,同时把逗号也删除

{

int i;

if(w1.length()==0)

{

cout<

exit(0);

}

else if(w1.length()>1)//等于时不需处理

{

for(i=1;i

{

if(w1[i]==',')

w1.e

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐