Advertisement
alinemtg

infernodeIC

Jun 19th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.   Trabalhin-de-IC versão 2.0 por Aline Gouveia
  3.   (alterado de Fernando Castor, November/2017)
  4. */
  5.  
  6. exports.solve = function(fileName) {
  7.     let formula = readFormula(fileName);
  8.     let result = doSolvedpll(formula.clauses, formula.variables);
  9.     return result;
  10. }
  11.  
  12. let continueOK = true;
  13. function doSolvedpll (clauses, assignment) {
  14.  
  15.     var isSat = false;
  16.     let hasOne = true;
  17.     let result = {'isSat': isSat, satisfyingAssignment: null};
  18.  
  19.     if (clauses.length === 0) {
  20.         isSat = true;
  21.         result.satisfyingAssignment = assignment;
  22.         return result;
  23.     } else {
  24.         hasOne = false;
  25.         for (let i = 0; i < clauses.length; i++) {
  26.             if (clauses[i].length === 1) {
  27.                 hasOne = true;
  28.                 if (clauses[i][0] < 0) {
  29.                     assignment[Math.abs(clauses[i]) - 1] = 0;
  30.                 } else {
  31.                     assignment[Math.abs(clauses[i]) - 1] = 1;
  32.                 }
  33.                 remove(clauses, clauses[i][0]);
  34.             }
  35.         }
  36.         if (!hasOne) {
  37.             assignment[Math.abs(clauses[0][0]) - 1] = 0;
  38.             let clausesAux = clauses.slice();
  39.             remove(clausesAux, -clauses[0][0]);
  40.             if (doSolvedpll(clausesAux, assignment).isSat) {
  41.                 continueOK = false;
  42.             } else {
  43.                 assignment[Math.abs(clauses[0][0]) - 1] == 1;
  44.                 clausesAux = clauses.slice();
  45.                 remove(clausesAux, clauses[0][0]);
  46.                 if (doSolvedpll(clausesAux, assignment).isSat) {
  47.                     continueOK = false;
  48.                 }
  49.             }
  50.         }
  51.     }
  52.     if (continueOK) {
  53.         return doSolvedpll(clauses, assignment);
  54.     }
  55.     return result;
  56. }
  57.  
  58. // RETIRAR AS CLAUSURAS DE TAMANHO 01 Q JA TEM VALOR OK E AS Q JA SAO VERDADEIRAS DEVIDO AS VARIAVEIS DETERMINADAS
  59. function remove (clauses, variable) {
  60.     for (let i=0; i<clauses.length && continueOK; i++) {
  61.         if (clauses[i].includes(variable)) {
  62.             clauses.splice(i, 1);
  63.             i--;
  64.         }
  65.         else if (clauses[i].includes(-variable)) {
  66.             if (clauses[i].length > 1) {
  67.                 let ind = clauses[i].indexOf(-variable);
  68.                 clauses[i].splice(ind, 1);
  69.             } else {
  70.                 continueOK = false;
  71.             }
  72.         }
  73.     }
  74.     console.log(clauses)
  75. }
  76.  
  77. function readFormula (fileName) {
  78.  
  79.     // LEITURA DO ARQUIVO
  80.     let fs = require('fs');
  81.     let cnfArchive = fs.readFileSync(fileName, 'utf8');
  82.     let text = cnfArchive.split("\r\n");
  83.  
  84.     // UTILIZACAO DAS FUNCOES INTERNAS A READFORMULA()
  85.     let clauses = readClauses(text);
  86.     let variables = readVariables (clauses);
  87.     let specOk = checkProblemSpecification (text, clauses, variables);
  88.  
  89.  
  90.     // DEFINICAO DAS FUNCOES INTERNAS
  91.  
  92.     // PRODUCAO DO ARRAY CLAUSES[] A PARTIR DO CNF
  93.     function readClauses (text) {
  94.         let textF = text.filter(function(line){
  95.             return line [0] !== 'c' && line[0] !== '' && line[0] !== 'p' // extrai as linhas com apenas numeros
  96.         });
  97.         textF = textF.join (''); // une todos os numeros num mesmo texto
  98.         textF = textF.split(" 0"); // separa cada clausura como elemento de text[], mas elas ainda estao com as variaveis agrupadas
  99.         textF.pop(); // remove o ultimo elemento de text[], que é vazio e gerado devido ao ultimo '0'
  100.  
  101.         let clauses = [];
  102.         for (let i=0; i<textF.length; i++) { // transforma cada clausura de text[] num array com suas variaveis
  103.             clauses[i] = textF[i].split(" ");
  104.             for (j=0; j<clauses[i].length; j++) { // passa cada elemento para o tipo numero
  105.                 clauses[i][j] = parseInt(clauses[i][j])
  106.             }
  107.         }
  108.         return clauses;
  109.     }
  110.  
  111.     // PRODUCAO DO ARRAY VARIABLES[] A PARTIR DE CLAUSES[]
  112.     function readVariables (clauses) {
  113.         let variables = []; // cria array inicial
  114.         for (let i=0; i<clauses.length; i++) {
  115.             for (j = 0; j < clauses[i].length; j++) { // caso o valor da variavel seja maior que o tamanho de variables[], quer dizer que ainda nao a contamos
  116.                 while ((Math.abs(clauses[i][j])) > variables.length) {
  117.                     variables.push(0); // adiciona a variavel
  118.                 }
  119.             }
  120.         }
  121.         return variables;
  122.     }
  123.  
  124.     // CHECAGEM DE COMPATIBILIDADE ENTRE A LINHA P E AS CLAUSURAS
  125.     function checkProblemSpecification (text, clauses, variables) {
  126.         let linep = text.filter (function (line) {
  127.             return line[0] === 'p' // extrai apenas a linha p do arquivo
  128.         });
  129.         linep = linep.join();
  130.         linep = linep.split(' '); // coloca elementos da linha p num array
  131.         let numVariables = parseInt(linep[2]);
  132.         let numClauses = parseInt(linep[3]);
  133.  
  134.         // confere se os dois arrays obtidos nos metodos acima correspondem aos dados da linha p
  135.         var specOk = true;
  136.         if (variables.length !== numVariables || clauses.length !== numClauses) {
  137.             specOk = false;
  138.         }
  139.         return specOk;
  140.     }
  141.  
  142.     // RESULTADO DO READFORMULA()
  143.     let result = { 'clauses': [], 'variables': [] };
  144.     if (specOk) {
  145.         result.clauses = clauses;
  146.         result.variables = variables;
  147.     }
  148.     return result;
  149.  
  150.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement