📄 thinker.java
字号:
import java.util.*;
/*该类实现了推理过程*/
public class Thinker {
private ArrayList<String> userDemandList = new ArrayList<String>();
private ArrayList<ArrayList> infCause;
private ArrayList<String> infResult;
// 用户希望得到结果,是下面其中的某个动物
String[] str = new String[] { "该动物是虎", "该动物是金钱豹", "该动物是长颈鹿", "该动物是企鹅",
"该动物是鸵鸟", "该动物是斑马", "该动物是信天翁" };
List<String> strList;
public Thinker(ArrayList<String> userDemandList) {
this.userDemandList = userDemandList;
strList = Arrays.asList(str);
infCause = new ArrayList<ArrayList>();
infResult = new ArrayList<String>();
}
/*该方法通过比较用户输入和规则列表中条件部分,判定用户输入是否包含了某条规则的条件部分,
* 若不是,就比较下条规则的条件,不停地循环,直至最后一条规则.
* 若是,判定该条规则的结论是否为最终结论,若是,则返回结论!否则,判断该条规则的结论是否应放置在用户输入列表中.
* */
public String findCause(ArrayList<Rule> rulesList) {
/*判定用户输入是否为空,以及是否矛盾*/
if (userDemandList != null && isContradict(userDemandList)) {
for (int i = 0; i < rulesList.size(); i++) {
List<String> causeList = new ArrayList<String>(
rulesList.get(i).cause.size());
for (String tempString : rulesList.get(i).cause) {
causeList.add(tempString.trim());
}
String result = new String(rulesList.get(i).result.trim());
if (userDemandList.containsAll(causeList))
if (strList.contains(result)) {
return result;
}
else {
if (!userDemandList.contains(result)) {
userDemandList.add(result);
if (!isContradict(userDemandList))
return null;
i = 0;
} else
continue;
}
}
}
return null;
}
//用于判断用户输入是否包含矛盾的条件
public boolean isContradict(ArrayList<String> userDemandList) {
if ((userDemandList.contains("该动物有毛发") || userDemandList
.contains("该动物有奶"))
&& (userDemandList.contains("该动物有羽毛")
|| userDemandList.contains("该动物会飞") || userDemandList
.contains("会下蛋")))
return false;
if (userDemandList.contains("该动物是哺乳动物")
&& userDemandList.contains("该动物是鸟"))
return false;
if (userDemandList.contains("有爪") && userDemandList.contains("有蹄"))
return false;
if (userDemandList.contains("该动物是食肉动物")
&& userDemandList.contains("该动物是有蹄类动物"))
return false;
return true;
}
/*该方法核心与findCause()相同,都是基于字符串的匹配.不同之处在于,当某几个条件能够推出某一结论时,
* 用户列表将删除能够推出该结论的所有的条件*/
public String find(ArrayList<Rule> rulesList) {
ArrayList<String> tempList = new ArrayList<String>();
while (userDemandList != null) {
for (String str : userDemandList) {
tempList.add(str);
}
findcause(rulesList);
if (!findcause(rulesList)) {
if (userDemandList.size() == 1)
return userDemandList.get(0);
else
break;
}
}
return null;
}
/*实现了字符串的匹配和删除条件*/
private boolean findcause(ArrayList<Rule> rulesList) {
boolean odd = false;
for (int i = 0; i < rulesList.size(); i++) {
ArrayList<String> causeList = new ArrayList<String>(rulesList
.get(i).cause.size());
for (String tempString : rulesList.get(i).cause) {
causeList.add(tempString.trim());
}
String result = new String(rulesList.get(i).result.trim());
if (userDemandList.containsAll(causeList)) {
infCause.add(causeList);
infResult.add(result);
userDemandList.removeAll(causeList);
odd = true;
if (!userDemandList.contains(result)) {
userDemandList.add(result);
}
}
}
return odd;
}
/*以下两个方法体实现获得到推理步骤*/
public List<ArrayList> getInfCause() {
return infCause;
}
public List<String> getInfResult() {
return infResult;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -