人工智能合一算法java语言实现_人工智能合一算法UNify.doc
—算法实现一、作业目的:用某一种编程语言实现合一算法。二、首先把教材中的Unify算法表述如下:算法 unify (E1, E2)1 、ifE1或E2是一个原子(即一个谓词符号、函数符号、常量、否定符号或变量),交换E1和E2的位置(如果必要),使E1是一个原子do:2、 begin3、 if E1与E2相同,returnNIL4 、if E1是变量do:5、Begin6...
—算法实现
一、作业目的:
用某一种编程语言实现合一算法。
二、首先把教材中的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
更多推荐
所有评论(0)