—算法实现

一、作业目的:

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

二、首先把教材中的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

人工智能合一算法java语言实现_人工智能合一算法UNify.doc相关推荐

  1. 人工智能合一算法java语言实现_人工智能AI---用LISP语言写合一算法unify

    [问题描述] 编程实现表达式合一算法,对任意两个表达式E1.E2,找出其最一般合一s [测试数据] 输入表达式: E1 = P (x,  f (x),  g (z) )       E2 = P (y ...

  2. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

  3. 国密算法java源码_国密算法SM2证书制作

    前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...

  4. 排序算法java 简书_手撕算法---常见排序算法java实现

    冒泡排序 是一种比较并交换排序方式.两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止. private void sort(int[] arr){ for (int i = 0; i ...

  5. Java语言可以开发人工智能吗

    是的,Java语言可以开发人工智能.Java是一种多平台.面向对象的编程语言,具有良好的可移植性和丰富的类库.在人工智能领域,Java可以用来开发各种应用,如机器学习.自然语言处理等.

  6. java合一算法_Prolog语言的编译原理:合一算法

    Prolog语言的编译原理:合一算法 分类:软考 | 更新时间:2016-07-08| 来源:转载 Prolog是一种基于谓词演算的程序设计语言.Prolog是一种说明性语言,它的基本意思是程序员着重 ...

  7. 人工智能python零基础入门教程_人工智能零基础入门视频教程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 人工智能零基础入门视频教程 100天人工智能工程师学习计划 -- 全程实战案例,从机器学习原理到推荐系统实现,从深度学习入门到图像语义分割及写诗机器人,再 ...

  8. 计算机java语言答案_【计算机二级Java语言】卷019

    选择题 公共知识 [1]下列叙述中正确的是 [A]算法的时间复杂度与计算机的运行速度有关 [B]算法的时间复杂度与运行算法时特定的输入有关 [C]算法的时间复杂度与算法程序中的语句条数成正比 [D]算 ...

  9. JAVA语言语法_流程控制(part3)

    文章目录 JAVA语言语法 三.流程控制 1.程序流程控制概述 2.顺序结构 3.分支结构 4.分支结构语句练习 5.加深键盘类Scanner类的使用 6.分支结构语句练习2 7.分支结构&s ...

最新文章

  1. 超轻量AI引擎MindSpore Lite
  2. Kazoo安装和使用
  3. JS中的offsetWidth, clientWidth, scrollWidth, innerWidth, outerWidth, pageXOffset
  4. SQL Server 2005 XML 操作总结(七)属性操作——插入、修改操作
  5. cython安装ubuntu_ubuntu上的Cython独立可执行文件
  6. (技能篇)Mysql在linux下的全量热备份
  7. GL 与 CV 管线 (pipeline) 比较与相互转换
  8. 7-1 矩阵A乘以B (30 分)
  9. 数据安全:通过Oracle的基本函数实现简单加密脱敏函数
  10. python import numpy_python之numpy
  11. SQL基础(3)-索引/触发器/视图操作
  12. WPF and Silverlight 学习笔记(二十二):使用代码实现绑定、绑定数据的验证
  13. php自动生成网站地图
  14. 使用易语言+myqq制作QQ群管理机器人-入门教程
  15. 停用所有计算机管理员权限,win10管理员权限被禁用怎么办_win10电脑管理员账户被禁用如何解开-win7之家...
  16. 融云聊天--web SDK API
  17. 【PyTorch基础教程2】自动求导机制(学不会来打我啊)
  18. vue版本的仿京东放大镜代码还有原生js版本的。(组件封装
  19. 匿名函数(Lambda表达式)与箭头函数
  20. 谈谈个人价值及平台红利

热门文章

  1. 终于搞清楚了,关于核心线程会不会回收
  2. 本人对2023年网络安全演练规划要求
  3. Opencv c++从影像分帧开始,制作数据集
  4. Gee引擎常用功能简介
  5. 苹果研发柔性玻璃,iOS升级证件识别
  6. 跨模态/多模态 cross-modal
  7. 手机在网状态API推荐
  8. 为什么不建议程序员做:“外包”?看完本文,相信你可以明白
  9. 计算机辅助工业设计简化功能的作用,计算机辅助工业设计CAID-天津大学研究生e-Learning平台.PDF...
  10. 关于碧螺春的江湖之三 【苏州 碧螺春 营养成分 健康价值】