人工智能合一算法UNify.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第 PAGE 10 页 DATE \@ yyyy-M-d 2009-7-10 —算法实现 一、作业目的: 用某一种编程语言实现合一算法。 二、首先把教材中的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算法来求两个表达式的最一般合一者,并把它们输出显示!!! 三、程序源码及说明 #includeiostream #includestring 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输入了一个空串!endl; exit(0); } else if(w1.length()1)//等于时不需处理 { for(i=1;iw1.length();i++)

文档评论(0)

153****9595 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档