Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var R, SR, S, Rez, Flag, IndexS, IndexRez;
  2.        
  3.  
  4. function doAll(n, defArr, undefArr, minForm, def){
  5.     var values = [];
  6.     R = n;
  7.     SR = Math.pow(2, n);
  8.     S = [];
  9.     Rez = [];
  10.    
  11.     for(var i = 0; i < defArr.length; i++) {
  12.         var s = toBinary(defArr[i], n);
  13.         Rez.push(s);
  14.         S.push(s);
  15.         values.push(s);
  16.     }
  17.     //if (def == 1)
  18.     for(var i = 0; i < undefArr.length; i++) {
  19.         var s = toBinary(undefArr[i], n);
  20.         if (s != '0NaN'){
  21.         Rez.push(s);
  22.         S.push(s);
  23.         values.push(s);}
  24.     }
  25.  
  26.    
  27.     terms = minimize();
  28.     buildMatrix(terms, values);
  29. }
  30.  
  31. function minimize(){
  32.    
  33.     //склеивание
  34.     for(var i = 0; i < R; i++) {
  35.         Flag = newArr(SR);
  36.         Rez = [];
  37.         console.log('-----------------');
  38.         console.log(i +'-r0', Rez, S, Flag);
  39.        
  40.         for(var j=0; j < S.length-1; j++) {
  41.             for(var k=j+1; k < S.length; k++)
  42.                 stuck(j, k);
  43.         }
  44.         console.log(i +'-r1', Rez, S, Flag);
  45.        
  46.         //копирование не склеившихся компонент
  47.         for(var j=0; j < S.length; j++) {
  48.             if (Flag[j] == 0)
  49.                 Rez.push(S[j]);
  50.         }
  51.        
  52.         console.log(i +'-r2', Rez, S, Flag);
  53.        
  54.         clear();
  55.        
  56.         console.log(i +'-r3', Rez, S, Flag);
  57.        
  58.     }
  59.    
  60.     //удаление ****
  61.     Rez = [];
  62.     for(var i=0; i < S.length; i++) {
  63.         if (del(S[i]) == false)
  64.             Rez.push(S[i]);
  65.     }
  66.    
  67.     return Rez;
  68. }
  69.  
  70.  
  71. function stuck(i1, i2){
  72.     var s1 = S[i1];
  73.     var s2 = S[i2];
  74.     var k = 0;
  75.     var n;
  76.    
  77.     for(var i=0; i < R; i++) {
  78.         if (s1[i] != s2[i]) {
  79.             k++;
  80.             n=i;
  81.         }
  82.     }
  83.    
  84.     if (k == 0) {
  85.         Rez.push(s1);
  86.         Flag[i1]=1;
  87.         Flag[i2]=1;
  88.     }
  89.    
  90.     if (k == 1 && s1[n] != '*' && s2[n] != '*'){
  91.         var ss = s1.substring(0, n) + '*' + s1.substring(n+1, s1.length);
  92.         Rez.push(ss);
  93.         Flag[i1] = 1;
  94.         Flag[i2] = 1;
  95.     }
  96. }
  97.  
  98. function clear(){
  99.     Flag = newArr(Rez.length);
  100.     S = [];
  101.    
  102.     for(var i=0; i < Rez.length; i++) {
  103.         if (Flag[i] == 0) {
  104.             for(var j=i+1; j < Rez.length; j++) {
  105.                 if (Rez[i] == Rez[j])
  106.                     Flag[j] = 1;
  107.             }
  108.         }
  109.     }
  110.    
  111.     for(var i=0; i < Rez.length; i++) {
  112.         if (Flag[i] == 0)
  113.             S.push(Rez[i]);
  114.     }
  115. }
  116.  
  117. function del(ss){
  118.     var k=0;
  119.     for(var i = 0; i < R; i++) {
  120.         if (ss[i]=='*')
  121.             k=k+1;
  122.     }
  123.    
  124.     return (k==R);
  125. }
  126.  
  127.  
  128.  
  129.  
  130.  
  131. /*
  132.     Построение импликантной матрицы
  133.    
  134.     terms - массив приведенных термов, каждый терм это массив вида  ['1', '0', '1', '*']
  135.     values - массив значений на которых ф-ция принимает значение TRUE.  Каждое значение задано массивом вида  [1, 1, 0, 1]
  136.  
  137.     Длины каждого терма и каждого значения должны быть одинаковы  (это число переменных)
  138. */
  139. function buildMatrix(terms, values) {
  140.     //  массив с существенными термами  
  141.     //  если term[i] - существенный, то stongTermArr[i] = 1  (иначе 0)
  142.     var stongTermArr = newArr(terms.length);
  143.    
  144.     //  массив со значениями существенных термов для каждого набора значений
  145.     var total = newArr(values.length);
  146.    
  147.     var finaly = true;
  148.    
  149.     console.log("Terms", terms);  //  отладочная печать
  150.     console.log("Values", values);   //  отладочная печать
  151.     printValuesTable(terms, values);
  152.     var nt = 0;
  153.    
  154.     while (finaly == true){
  155.         //  ищем существенные термы
  156.         finaly = findStrongTerms(stongTermArr, terms, values, total, finaly);
  157.  
  158.         console.log("StrongTerms: ", stongTermArr); // отладочная печать
  159.    
  160.         // Заносим значения всех существенных термов в total
  161.         fillStrongTermsTotal(total, stongTermArr, terms, values);
  162.        
  163.         nt = 0;
  164.         for (var i = 0; i < total.length; i++){
  165.             if (total[i] == 1)
  166.                 nt++;
  167.         }
  168.         if (nt == total.length)
  169.             finaly = false;
  170.        
  171.         if (finaly == true)
  172.             //убираем термы входящие в другие
  173.             finaly = mergeTerms(values, terms, total, stongTermArr);
  174.    
  175.         console.log("Total: ", total); // отладочная печать
  176.     }
  177.     var h = 1;
  178.     for (var w = 0; w < stongTermArr.length; w++){
  179.         if (stongTermArr[w] == 0) {
  180.             fillOtherTermsTotal(total, stongTermArr, terms, values, w);
  181.         }
  182.         printResult(terms, stongTermArr, h);
  183.         h++;
  184.     }
  185.     printResult(terms, stongTermArr, 1);
  186. }
  187.  
  188.  
  189. function trySetValue(total, term, values) {
  190.     var changed = false;
  191.     for (var i = 0; i < total.length; i++) {
  192.         if (total[i] == 0 && value(term, values[i]) == 1) {
  193.             total[i] = 1;
  194.             changed = true;
  195.         }
  196.     }
  197.     return changed;
  198. }
  199.  
  200. function value(term, values) {
  201.     if (term.length != values.length)
  202.         console.log('Term or values is wrang', term, values);
  203.     var val = 1;
  204.     for (var i = 0; i < term.length; i++) {
  205.         if (term[i] == '*')
  206.             continue;
  207.         val = val * (term[i] == values[i] ? 1 : 0);
  208.     }
  209.     return val;
  210. }
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217. //  для каждого набора значений ищем существенный терм
  218. function findStrongTerms(stongTermArr, terms, values, total, finaly) {      
  219.     finaly = false;
  220.     for (var i = 0; i < values.length; i++)
  221.         if (total[i] == 0){
  222.         var n = 0;
  223.         var termIdx = -1;
  224.        
  225.         for (var j = 0; j < terms.length; j++)
  226.             if (stongTermArr[j] != '*'){
  227.             var val = value(terms[j], values[i]);
  228.             if (val == 1) {
  229.                 n++;
  230.                 termIdx = j;
  231.             }
  232.         }
  233.        
  234.         //  ура-ура нашли!
  235.         if (n == 1){
  236.             stongTermArr[termIdx] = 1;
  237.             finaly = true;
  238.         }
  239.        
  240.     }
  241.     return finaly;
  242. }
  243.  
  244.  
  245. // Заносим значения всех существенных термов в total
  246. function fillStrongTermsTotal(total, stongTermArr, terms, values) {
  247.     for (var i = 0; i < stongTermArr.length; i++) {
  248.         if (stongTermArr[i] == 1) {
  249.             for (var j = 0; j < values.length; j++) {
  250.                 var val = value(terms[i], values[j]);
  251.                 if (val == 1)
  252.                     total[j] = 1;
  253.             }
  254.         }
  255.     }
  256. }
  257.  
  258.  
  259.  
  260.  
  261. //идем по всем оставшимся (несущ.) термам  и пытаемся заполнить ими нули в total  (если они там есть)
  262. function fillOtherTermsTotal(total, stongTermArr, terms, values, w) {
  263.     for (var i = w; i < stongTermArr.length; i++) {
  264.         if (stongTermArr[i] == 0) {
  265.             var totalChanged = trySetValue(total, terms[i], values);
  266.             stongTermArr[i] = (totalChanged ? 1 : 0);
  267.         }
  268.     }
  269. }
  270.  
  271.  
  272.  
  273.            
  274. function toBinary(str, length) {
  275.     return parseInt(str).toString(2).padStart(length, '0');
  276. }
  277.    
  278. function newArr(len, val) {
  279.     val = (typeof val == 'undefined') ? 0 : val;
  280.     var arr = [];
  281.     arr.length = len;
  282.     arr.fill(val, 0, len);
  283.     return arr;
  284. }
  285.  
  286.  
  287. function mergeTerms(values, terms, total, stongTermArr) {
  288.     mergeFound = false;
  289.     var kv = 0;
  290.     var k1 = 0;
  291.     for (var i = 0; i < terms.length-1; i++) {
  292.         if (stongTermArr[i] != 0)
  293.             continue;
  294.        
  295.         for (var j = 0; j < terms.length; j++) {
  296.             if (stongTermArr[i] == '*')
  297.                 continue;
  298.            
  299.             // если term[j]   входит в term[i]
  300.             if (termContains(terms[i], terms[j], values, total)) {
  301.                 stongTermArr[j] = '*'; // больше term[j] не рассматриваем
  302.                 mergeFound = true;
  303.             }
  304.         }
  305.     }
  306.     return mergeFound;     
  307. }
  308.  
  309. // Значения на терме t1 содержат в себе все значения на терме t2
  310. function termContains(t1, t2, values, total) {
  311.     for (var i = 0; i < values.length; i++) {
  312.        
  313.         if (total[i] == 0) {
  314.             var val1 = value(t1, values[i]);
  315.             var val2 = value(t2, values[i]);
  316.             if (val1 == 0 && val2 == 1)
  317.                 return false;
  318.         }
  319.     }
  320.     return true;
  321. }
  322.  
  323.  
  324.  
  325.  
  326. //форматирование интерфейса
  327.  
  328.    
  329.    
  330.    
  331. function start() {
  332.     var terms = parseInput(byId('inputTerms').value);
  333.     var values = parseInput(byId('inputValues').value);
  334.     process(terms, values);
  335. }
  336.  
  337. function byId(id) {
  338.     return document.getElementById(id);
  339. }
  340.  
  341. function parseInput(txt) {
  342.     txt = txt.split('\n');
  343.     var arr = new Array();
  344.     for (var i = 0; i < txt.length; i++) {
  345.         var x = txt[i].trim();
  346.         if (x.length > 2) {
  347.             arr.push(x.split(''));
  348.         }
  349.     };
  350.     return arr;
  351. }
  352.            
  353.  
  354.  
  355.  
  356. function printResult(terms, stongTermArr, num) {
  357.     var html = '';
  358.     for (var i = 0; i < stongTermArr.length; i++)
  359.         if (stongTermArr[i] == 1)
  360.             html += (html.length == 0 ? '' : ' + ') + terms[i];
  361.        
  362.     byId('res').innerHTML += '<small>Миним. форма:</small> ' + html + '</br>';
  363. }
  364.  
  365. function printValuesTable(terms, values) {
  366.     var html = '<tr><th></th>';
  367.     for (var j = 0; j < values.length; j++)
  368.         html += '<th>' + values[j] + '</th>';
  369.     html += '</tr>';
  370.     for (var i = 0; i < terms.length; i++) {
  371.         html += '<tr><th>' + terms[i] + '</th>';
  372.         for (var j = 0; j < values.length; j++)
  373.             html += '<td>' + value(terms[i], values[j]) + '</td>';
  374.        
  375.     }
  376.     byId('table').innerHTML = html;
  377. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement