人工智能之一般合一算法Java实现之
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner; public class Unify {
private static String EMPTY = " ";
private static String FAIL = "Failed";
private static List<String> list1 = new ArrayList<String>();
private static List<String> list2 = new ArrayList<String>(); public static void main(String[] args){
//输入两个谓词公式
System.out.println("请输入待判断的两个表达式,变量用小写字母表示,常量用大写字符或字符串表示。");
Scanner input = new Scanner(System.in);
String E1 = input.nextLine();
list1 = Unify.getElements(E1);
String E2 = input.nextLine();
list2 = Unify.getElements(E2);
System.out.println("最一般的表达式为:" + Unify.unify(E1, E2));
} private static List<String> getElements(String E){
List<String> list = new ArrayList<String>();
for(int i = 0; i < E.length(); i++){
if(E.charAt(i) == ')')
list.add("()");
if((E.charAt(i) >= 'a' && E.charAt(i) <= 'z') || (E.charAt(i) >= 'A' && E.charAt(i) <= 'Z')){
int j = i+1;
while(j < E.length() && ((E.charAt(j) >= 'a' && E.charAt(j) <= 'z') || (E.charAt(j) >= 'A' && E.charAt(j) <= 'Z')))
j++;
list.add(E.substring(i,j));//取出'('和')'之间的串
i = j - 1;
}
}
return list;
} private static String unify(String E1, String E2){
if(E1.isEmpty() && E2.isEmpty())
return Unify.EMPTY;
if(Unify.isConstants(E1) && Unify.isConstants(E2)){
if(E1.equals(E2))
return Unify.EMPTY;
else
return Unify.FAIL;
} if(Unify.isVariable(E1)){
//contains()方法,当且仅当此字符串包含指定的char值序列时,返回true
if(!E2.equals(E1) && E2.contains(E1))
return Unify.FAIL;
else{
if(E2.equals(E1))//判断是否相等
return Unify.EMPTY;
else
return E2 + "/" + E1;
}
} if(Unify.isVariable(E2)){
if(!E1.equals(E2) && E1.contains(E2))
return Unify.FAIL;
else{
if(E2.equals(E1))
return Unify.EMPTY;
else
return E1 + "/" + E2;
}
} if(E1.isEmpty() || E2.isEmpty())
return Unify.FAIL;
else{
String he1 = Unify.getFirstElement(list1);
E1 = Unify.getRest(E1, he1);
String he2 = Unify.getFirstElement(list2);
E2 = Unify.getRest(E2, he2);
String subs1 = Unify.unify(he1, he2);
if(subs1.equals(Unify.FAIL))
return Unify.FAIL;
String te1 = Unify.apply(subs1, E1, list1);
String te2 = Unify.apply(subs1, E2, list2);
String subs2 = Unify.unify(te1, te2);
if(subs1.equals(Unify.FAIL))
return Unify.FAIL;
else
return Unify.composition(subs1, subs2);
}
}
//判断常量
private static boolean isConstants(String E){
if(!E.isEmpty()){
if(E.length() > 1){
if(E.equals("()"))
return true;
if(E.contains(" ") || E.contains("(") || E.contains(")") || E.contains(","))
return false;
else
return true;
}
else{
if(E.charAt(0)>='A' && E.charAt(0) <= 'Z')
return true;
else
return false;
}
}
return false;
}
//判断变量 private static boolean isVariable(String E){
if(!E.isEmpty()){
if(E.length() > 1){
if(E.contains(" ") || E.contains("(") || E.contains(")") || E.contains(","))
return false;
else
return true;
}
else{
if(E.charAt(0)>='a' && E.charAt(0) <= 'z')
return true;
else
return false;
}
}
return false;
} private static String getFirstElement(List<String> list){
String element = list.get(0);
list.remove(0);
return element;
}
//该函数查找s2在E中的位置并用s1替代E中相应的s2
private static String apply(String subs1, String E, List<String> list){
if(subs1.equals(Unify.EMPTY))
return E;
String sub1 = subs1.substring(0, subs1.indexOf('/'));
String sub2 = subs1.substring(subs1.indexOf('/') + 1, subs1.length());
E = E.replaceAll(sub2, sub1);
for(int i = 0; i < list.size(); i++){
if(list.get(i).equals(sub2))
list.set(i, sub1);
}
return E;
} private static String composition(String subs1, String subs2){
if(subs1.equals(Unify.EMPTY) && subs2.equals(Unify.EMPTY))
return Unify.EMPTY;
else if(subs1.equals(Unify.EMPTY))
return subs2;
else if(subs2.equals(Unify.EMPTY))
return subs1;
else
return subs1 + ", " + subs2;
} private static String getRest(String E, String firstElement){
if(!E.isEmpty()){
String e;
if(firstElement.equals("()"))
e = E.replaceFirst("\\(\\)","0");
else
e = E.replaceFirst(firstElement,"0");
if(e.length() == 1)
return "";
int i = e.indexOf('0');
int j = i + 1;
while(e.charAt(j) == ' ' || e.charAt(j) == ',')
j++;
e = e.substring(0, i) + e.substring(j);
return e;
}
return null;
}
}
人工智能之一般合一算法Java实现之的更多相关文章
- 归并排序算法 java 实现
归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...
- 快速排序算法 java 实现
快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...
- 堆排序算法 java 实现
堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...
- Atitit 电子商务订单号码算法(java c# php js 微信
Atitit 电子商务订单号码算法(java c# php js 微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...
- 无向图的最短路径算法JAVA实现
一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...
- 无向图的最短路径算法JAVA实现(转)
一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...
- 基于FP-Tree的关联规则FP-Growth推荐算法Java实现
基于FP-Tree的关联规则FP-Growth推荐算法Java实现 package edu.test.ch8; import java.util.ArrayList; import java.util ...
- 双色球机选算法java实现
双色球机选算法java实现 一.代码 package com.hdwang; import java.util.Random; /** * Created by admin on 2017/1/10. ...
- Floyd算法java实现demo
Floyd算法java实现,如下: https://www.cnblogs.com/Halburt/p/10756572.html package a; /** * ┏┓ ┏┓+ + * ┏┛┻━━━ ...
随机推荐
- PostgreSQL 锁等待诊断详解
摘要PostgreSQL和大多数传统RDBMS一样,都设计了大量的锁来保证并发操作的数据一致性. 同时PG在设计锁等待时,以队列方式存储等待锁. 参考 ProcSleep()@src/backend/ ...
- UBuntu16.04 安装docker
1.首先更新apt-get源,sudo apt-get update 2.再通过pip安装docker-compose 3.然后再安装docker.io,sudo apt install docker ...
- 大数据实操3 - hadoop集群添加新节点
hadoop集群支持动态扩展,不需要停止原有集群节点就可以实现新节点的加入. 我是使用docker搭建的进群环境,制作了镜像文件,这里以我的工作基础为例子介绍集群中添加集群的方法 一.制作一个新节点 ...
- 企业BGP网络规划案例(四)
关于路由的发布和接收使用route-map过滤,防止本AS作为一个转发区域. 在XRV3上和XRV4上使用prefix-list 进行路由接搜和发布的过滤 XRV3配置 =============== ...
- mysql权限操作(转)
慢慢看吧mysql中可以给你一个用户授予如select,insert,update,delete等其中的一个或者多个权限,主要使用grant命令,用法格式为: grant 权限 on 数据库对象 to ...
- Spring+Quartz集群环境下定时调度的解决方案
集群环境可能出现的问题 在上一篇博客我们介绍了如何在自己的项目中从无到有的添加了Quartz定时调度引擎,其实就是一个Quartz 和Spring的整合过程,很容易实现,但是我们现在企业中项目通常都是 ...
- K3精益版给物料添加属性,并在BOM中新增字段引用该属性
1.给物料新增属性 打开“系统--基础资料--公共资料--核算项目管理”,然后双击物料,弹出核算项目类别-修改对话框.再点新增按钮: 输入你想新增字段的类型,长度,想要放置的位置. 相关属性里面选的是 ...
- Unity3D UI适配
直接贴图
- CentOS7 查看显卡信息
A卡: [root@t1 ~]# lspci | grep -i vga 00:02.0 VGA compatible controller: Cirrus Logic GD 5446 N卡: [ro ...
- Sliverlight调用WebService跨域问题解决
在SilverlightApplication正常添加webservice(承载网站中建webservice,这样就不存在跨域问题了,即域名一样如:localhost:4676) http://loc ...