人工智能合一算法java语言实现_人工智能合一算法UNify.doc
—算法实现
一、作业目的:
用某一种编程语言实现合一算法。
二、首先把教材中的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相关推荐
- 人工智能合一算法java语言实现_人工智能AI---用LISP语言写合一算法unify
[问题描述] 编程实现表达式合一算法,对任意两个表达式E1.E2,找出其最一般合一s [测试数据] 输入表达式: E1 = P (x, f (x), g (z) ) E2 = P (y ...
- rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)
原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...
- 国密算法java源码_国密算法SM2证书制作
前段时间将系统的RSA算法全部升级为SM2国密算法,密码机和UKey硬件设备大都同时支持RSA和SM2算法,只是应用系统的加解密签名验证需要修改,这个更改底层调用的加密动态库来,原来RSA用的对称加密 ...
- 排序算法java 简书_手撕算法---常见排序算法java实现
冒泡排序 是一种比较并交换排序方式.两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止. private void sort(int[] arr){ for (int i = 0; i ...
- Java语言可以开发人工智能吗
是的,Java语言可以开发人工智能.Java是一种多平台.面向对象的编程语言,具有良好的可移植性和丰富的类库.在人工智能领域,Java可以用来开发各种应用,如机器学习.自然语言处理等.
- java合一算法_Prolog语言的编译原理:合一算法
Prolog语言的编译原理:合一算法 分类:软考 | 更新时间:2016-07-08| 来源:转载 Prolog是一种基于谓词演算的程序设计语言.Prolog是一种说明性语言,它的基本意思是程序员着重 ...
- 人工智能python零基础入门教程_人工智能零基础入门视频教程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 人工智能零基础入门视频教程 100天人工智能工程师学习计划 -- 全程实战案例,从机器学习原理到推荐系统实现,从深度学习入门到图像语义分割及写诗机器人,再 ...
- 计算机java语言答案_【计算机二级Java语言】卷019
选择题 公共知识 [1]下列叙述中正确的是 [A]算法的时间复杂度与计算机的运行速度有关 [B]算法的时间复杂度与运行算法时特定的输入有关 [C]算法的时间复杂度与算法程序中的语句条数成正比 [D]算 ...
- JAVA语言语法_流程控制(part3)
文章目录 JAVA语言语法 三.流程控制 1.程序流程控制概述 2.顺序结构 3.分支结构 4.分支结构语句练习 5.加深键盘类Scanner类的使用 6.分支结构语句练习2 7.分支结构&s ...
最新文章
- 超轻量AI引擎MindSpore Lite
- Kazoo安装和使用
- JS中的offsetWidth, clientWidth, scrollWidth, innerWidth, outerWidth, pageXOffset
- SQL Server 2005 XML 操作总结(七)属性操作——插入、修改操作
- cython安装ubuntu_ubuntu上的Cython独立可执行文件
- (技能篇)Mysql在linux下的全量热备份
- GL 与 CV 管线 (pipeline) 比较与相互转换
- 7-1 矩阵A乘以B (30 分)
- 数据安全:通过Oracle的基本函数实现简单加密脱敏函数
- python import numpy_python之numpy
- SQL基础(3)-索引/触发器/视图操作
- WPF and Silverlight 学习笔记(二十二):使用代码实现绑定、绑定数据的验证
- php自动生成网站地图
- 使用易语言+myqq制作QQ群管理机器人-入门教程
- 停用所有计算机管理员权限,win10管理员权限被禁用怎么办_win10电脑管理员账户被禁用如何解开-win7之家...
- 融云聊天--web SDK API
- 【PyTorch基础教程2】自动求导机制(学不会来打我啊)
- vue版本的仿京东放大镜代码还有原生js版本的。(组件封装
- 匿名函数(Lambda表达式)与箭头函数
- 谈谈个人价值及平台红利
热门文章
- 终于搞清楚了,关于核心线程会不会回收
- 本人对2023年网络安全演练规划要求
- Opencv c++从影像分帧开始,制作数据集
- Gee引擎常用功能简介
- 苹果研发柔性玻璃,iOS升级证件识别
- 跨模态/多模态 cross-modal
- 手机在网状态API推荐
- 为什么不建议程序员做:“外包”?看完本文,相信你可以明白
- 计算机辅助工业设计简化功能的作用,计算机辅助工业设计CAID-天津大学研究生e-Learning平台.PDF...
- 关于碧螺春的江湖之三 【苏州 碧螺春 营养成分 健康价值】