Оценивать логические выражения из arrayList - PullRequest
1 голос
/ 08 марта 2019

Я генерирую таблицу истинности из любого логического выражения и сохраняю ее в двумерном массиве. В качестве первого шага я сохраню свое логическое выражение в объекте 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]

Но я хотел бы знать, есть ли другой способ сделать это, потому что этот способ для меня не очень сексуален. Это тяжело и больше у меня переменных, больше это долго. Также я спрашиваю, можно ли использовать скрипт на другом компьютере, если я хочу поделиться своим приложением.

Спасибо за помощь

...