Я генерирую таблицу истинности из любого логического выражения и сохраняю ее в двумерном массиве. В качестве первого шага я сохраню свое логическое выражение в объекте arrayList. Я считаю количество переменных, чтобы вычесть количество столбцов (переменных) и количество строк (комбинаций).
nbrVariables = variables.size();
nbrCombinaisons = (int)Math.pow(2,variables.size());
truth_table = new int [nbrCombinaisons][nbrVariables+1];
Я объявляю nbrVariables + 1 , потому что мне нужен 1 столбец, который представляет мой вывод. Используя цикл, я генерирую каждое сочетание моей таблицы истинности.
У меня в консоли есть это:
---- Equation : [soccer, +, food]
---- Variables : [soccer, food]
variables : 2
combinaisons : 4
header : [food, soccer]
[0, 0, null]
[0, 1, null]
[1, 0, null]
[1, 1, null]
Как видите, каждый элемент моих последних столбцов равен нулю. Чтобы завершить этот столбец, который представляет мой вывод, мне нужно оценить мое логическое выражение для каждого из этих сочетаний. Я повторяю, что мое логическое выражение - это массив списков объектов.
Для завершения я использую строковый буфер, чтобы использовать скрипт, который оценивает мое логическое выражение для каждого сочетания (= каждой строки).
public void getOutput() throws ScriptException{
StringBuffer sbExpr = new StringBuffer();
temp= new ArrayList<Object>();
temp.addAll(equation);
for(int i=0; i<=nbrCombinaisons-1; i++){
for (int j=0; j<=nbrVariables-1 ; j++){
if(equation.contains(variables.get(j).getName())){
temp.set(equation.indexOf(variables.get(j).getName()), truth_table[i][j]);
}
}
truth_table[i][nbrVariables]= getResult(temp, sbExpr );
}
}
public int getResult(ArrayList<Object> temp, StringBuffer sbExpr) throws ScriptException{
sbExpr.delete(0, sbExpr.length());
for(int i =0; i< temp.size(); i++){
if(temp.get(i).equals(1)){
sbExpr.append("1");
}else if(temp.get(i).equals(0)){
sbExpr.append("0");
}else if(temp.get(i).getClass().equals(String.class))
switch((String)temp.get(i))
{
case "+":
sbExpr.append("|");
break;
case ".":
sbExpr.append("&");
break;
case "¤":
sbExpr.append("^");
break;
case "!":
sbExpr.append("!");
break;
case "(":
sbExpr.append("(");
break;
case ")":
sbExpr.append(")");
break;
default:
System.out.println("no match");
}
}
// System.out.println("\nsbExpr -----> " +sbExpr );
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine se = sem.getEngineByName("JavaScript");
if (se.eval(sbExpr.toString()).toString().equals("1")){
return 1;
}else{
return 0;
}
}
Ну, это отлично работает.
[PCU, Fuel circuit]
[0, 0, 0]
[0, 1, 1]
[1, 0, 1]
[1, 1, 1]
Но я хотел бы знать, есть ли другой способ сделать это, потому что этот способ для меня не очень сексуален. Это тяжело и больше у меня переменных, больше это долго. Также я спрашиваю, можно ли использовать скрипт на другом компьютере, если я хочу поделиться своим приложением.
Спасибо за помощь