Main类
package com.company;
import java.util.Scanner;
public class Main {
// write your code here
//特征集与结果集初始化,用以输入输出
static String Features[] = {"反刍","有蹄","哺乳类",
"眼向前方","有爪","犬齿","吃肉","下蛋","能飞",
"有羽毛","蹄类","食肉类","鸟类","有奶","毛发",
"善飞","黑色白条纹","游泳","长腿","长脖子","黑条纹",
"暗斑点","黄褐色","棕色皮毛"};
static String Results[] = {"信天翁","企鹅","鸵鸟","斑马","长颈鹿","虎","豹","棕熊","哺乳动物","鸟","食肉动物","蹄类动物"};
public static void main(String args[]){
System.out.println("特征集如下");
for(int n=0;n<Features.length;n++){
System.out.println("特征"+(n+1)+":"+Features[n]);
}
//Rule[] rules = Rule.IntRules();//规则库初始化
Facts factsDB = new Facts();
Rule rules[];
rules=Rule.IntRules();
//输入特征选项 5,{14,22,20,19,2}
int[] f = new int[25];
Scanner input=new Scanner(System.in);//输入初始化
while (true) {
System.out.println("输入将要匹配的特征的数量(整数)");
int FactNum=input.nextInt();//输入一个正整数
factsDB.setFactNum(FactNum);
System.out.println("对应上表,输入将要匹配的特征值(整数)");
for(int k=0;k<FactNum;k++){
int feature=input.nextInt();//输入一个正整数
f[k] = feature;
}
/*f[0]=14;f[1]=22;f[2]=20;f[3]=19;f[4]=2;*/
factsDB.setFacts(f);
boolean isEnd = false;
boolean findAns = false;
while(!isEnd){
isEnd= true;
for(int i=0;i<rules.length;i++){
if(rules[i].isUsed() || !rules[i].isPossible()) continue;//该规则失效
int res = cmp(rules[i],factsDB);
if(res == 0){
continue;//不匹配
}else if(res == 1){
//匹配,但是为中间值
int[] facts=factsDB.getFacts();
int n = factsDB.getFactNum();
facts[n]=rules[i].getResultID();
factsDB.setFacts(facts);
factsDB.setFactNum(++n);
isEnd= false;
break;
}else if(res == 2){
//匹配,且为最终答案
System.out.println("结果是:"+Results[rules[i].getResultID()-1]);
findAns=true;
break;
}
}
}
if(!findAns){
System.out.println("无匹配答案");
}
}
}
public static int cmp(Rule r,Facts f){
int F_Rule[] = r.getFacts();
int F_Fact[]= f.getFacts();
int factNum =f.getFactNum();
for(int i=r.getNextFactPos();i<r.getFactNum();i++){
boolean isMatch=false;
for(int j=0;j<factNum;j++){
if(F_Rule[i] == F_Fact[j]){//匹配成功
if(i+1 == r.getFactNum()){//全部规则特征已匹配完毕
r.setUsed(true);
if(r.isEndResult()){
//是最终答案
return 2;
}else{
//中间特征
return 1;
}
}
//部分特征匹配成功,开始匹配下一个特征
isMatch=true;
break;
}else{
//不匹配,继续循环
continue;
}
}
if(isMatch){
//匹配成功
continue;
}else{
//匹配失败
r.setNextFactPos(i);
return 0;
}
}
//无匹配项
return 0;
}
}
Rule类
package com.company;
public class Rule {
private int factNum;
private int facts[];
private boolean used;//是否使用
private boolean possible;//是否可能
private boolean endResult;
private int resultID;
private int nextFactPos;//记录下一次需验证的特征位置
public Rule(int factNum,int[] facts,boolean endResult,int resultID){
this.used=false;
this.possible=true;
this.factNum = factNum;
this.facts=facts;
this.endResult=endResult;
this.resultID=resultID;
this.nextFactPos=0;
}
public int getNextFactPos() {
return nextFactPos;
}
public void setNextFactPos(int nextFactPos) {
this.nextFactPos = nextFactPos;
}
public int getResultID() {
return resultID;
}
public void setResultID(int resultID) {
this.resultID = resultID;
}
public int getFactNum() {
return factNum;
}
public void setFactNum(int factNum) {
this.factNum = factNum;
}
public int[] getFacts() {
return facts;
}
public void setFacts(int[] facts) {
this.facts = facts;
}
public boolean isUsed() {
return used;
}
public void setUsed(boolean used) {
this.used = used;
}
public boolean isPossible() {
return possible;
}
public void setPossible(boolean possible) {
this.possible = possible;
}
public boolean isEndResult() {
return endResult;
}
public void setEndResult(boolean endResult) {
this.endResult = endResult;
}
//初始化规则库
public static Rule[] IntRules(){
Rule[] rules= new Rule[16];
//以下为结果集
//rule0
int fact0[]={3,12,22,23};
rules[0]=new Rule(4,fact0,true,7);//豹
//rule1
int fact1[]={3,12,21,23};
rules[1]=new Rule(4,fact1,true,6);//虎
//rule2
int fact2[]={11,19,20,22};
rules[2]=new Rule(4,fact2,true,5);//长颈鹿
//rule3
int fact3[]={11,21};
rules[3]=new Rule(2,fact3,true,4);//斑马
//rule4
int fact4[]={17,19,20,13,9};
rules[4]=new Rule(5,fact4,true,3);//鸵鸟
//rule5
int fact5[]={17,18,13,9};
rules[5]=new Rule(4,fact5,true,2);//企鹅
//rule6
int fact6[]={16,13};
rules[6]=new Rule(2,fact6,true,1);//信天翁
//rule15
int fact15[]={3,5,11,7,24};
rules[15]=new Rule(5,fact15,true,8);//棕熊
//以下为非结果集
int fact7[]={15};
rules[7]=new Rule(1,fact7,true,9);//哺乳动物
int fact8[]={14};
rules[8]=new Rule(1,fact8,true,9);//哺乳动物
int fact9[]={10};
rules[9]=new Rule(1,fact9,true,10);//鸟
int fact10[]={8,9};
rules[10]=new Rule(2,fact10,true,10);//鸟
int fact11[]={7};
rules[11]=new Rule(1,fact11,true,11);//食肉动物
int fact12[]={4,5,6};
rules[12]=new Rule(3,fact12,true,11);//食肉动物
int fact13[]={2,3};
rules[13]=new Rule(2,fact13,true,12);//蹄类动物
int fact14[]={1,3};
rules[14]=new Rule(2,fact14,true,12);//蹄类动物
return rules;
}
}
Facts类
package com.company;
public class Facts {
private int factNum;
private int facts[];
//初始化
Facts(){
factNum=0;
facts=new int[0];
}
public int getFactNum() {
return factNum;
}
public void setFactNum(int factNum) {
this.factNum = factNum;
}
public int[] getFacts() {
return facts;
}
public void setFacts(int[] facts) {
this.facts = facts;
}
}