人工智能 java_人工智能之一般合一算法Java实现之

importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;importjava.util.Scanner;public classUnify {private static String EMPTY = " ";private static String FAIL = "Failed";private static List list1 = new ArrayList();private static List list2 = new ArrayList();public static voidmain(String[] args){//输入两个谓词公式

System.out.println("请输入待判断的两个表达式,变量用小写字母表示,常量用大写字符或字符串表示。");

Scanner input= newScanner(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 ListgetElements(String E){

List list = new ArrayList();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;

}

}returnlist;

}private staticString unify(String E1, String E2){if(E1.isEmpty() &&E2.isEmpty())returnUnify.EMPTY;if(Unify.isConstants(E1) &&Unify.isConstants(E2)){if(E1.equals(E2))returnUnify.EMPTY;else

returnUnify.FAIL;

}if(Unify.isVariable(E1)){//contains()方法,当且仅当此字符串包含指定的char值序列时,返回true

if(!E2.equals(E1) &&E2.contains(E1))returnUnify.FAIL;else{if(E2.equals(E1))//判断是否相等

returnUnify.EMPTY;else

return E2 + "/" +E1;

}

}if(Unify.isVariable(E2)){if(!E1.equals(E2) &&E1.contains(E2))returnUnify.FAIL;else{if(E2.equals(E1))returnUnify.EMPTY;else

return E1 + "/" +E2;

}

}if(E1.isEmpty() ||E2.isEmpty())returnUnify.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))returnUnify.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))returnUnify.FAIL;else

returnUnify.composition(subs1, subs2);

}

}//判断常量

private static booleanisConstants(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 booleanisVariable(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(Listlist){

String element= list.get(0);

list.remove(0);returnelement;

}//该函数查找s2在E中的位置并用s1替代E中相应的s2

private static String apply(String subs1, String E, Listlist){if(subs1.equals(Unify.EMPTY))returnE;

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);

}returnE;

}private staticString composition(String subs1, String subs2){if(subs1.equals(Unify.EMPTY) &&subs2.equals(Unify.EMPTY))returnUnify.EMPTY;else if(subs1.equals(Unify.EMPTY))returnsubs2;else if(subs2.equals(Unify.EMPTY))returnsubs1;else

return subs1 + ", " +subs2;

}private staticString getRest(String E, String firstElement){if(!E.isEmpty()){

String e;if(firstElement.equals("()"))

e= E.replaceFirst("\\(\\)","0");elsee= 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);returne;

}return null;

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值