首页 技术 正文
技术 2022年11月11日
0 收藏 606 点赞 2,361 浏览 3559 个字
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;
}
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,493
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,495
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,133
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,297