Advertisement
alyoshinkkaa

Untitled

Aug 19th, 2023
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.68 KB | None | 0 0
  1. /* Конъюктивная нормальная форма (JavaScript)
  2. Преобразовать логическую формулу в конъюктивную нормальную форму.
  3. Логическая формула может содержать константы "0" - ложь и "1" - истина,
  4. переменные от "a" до "z",
  5. логические связи "&" - конъюнкция, "|" - дизъюнкция, "~" - отрицание,
  6. скобки.
  7. Логическая формула задаётся в виде аргументы функции cnf, ответ должен выводиться на консоль.
  8. Пример : cnf("(a & b) | ~c"), ответ на консоли может быть : "(a|~c)&(b|~c)".
  9. */
  10.  
  11. function cnf(formula) {
  12. // delete splits
  13. formula = formula.replace(/\s+/g, '');
  14.  
  15. // convert the formula to an array of tokens
  16. const tokens = formula.split(/([&|()])/);
  17.  
  18. function isOperator(token) {
  19. return token === '&' || token === '|';
  20. }
  21.  
  22. function isVariable(token) {
  23. return /[a-z]/.test(token);
  24. }
  25.  
  26. function isOpeningParenthesis(token) {
  27. return token === '(';
  28. }
  29.  
  30. function isClosingParenthesis(token) {
  31. return token === ')';
  32. }
  33.  
  34. function getOperatorPriority(operator) {
  35. if (operator === '&') {
  36. return 2;
  37. } else if (operator === '|') {
  38. return 1;
  39. } else {
  40. return 0;
  41. }
  42. }
  43.  
  44. function toReversePolishNotation(tokens) {
  45. const stack = [];
  46. const output = [];
  47.  
  48. for (let i = 0; i < tokens.length; i++) {
  49. const token = tokens[i];
  50.  
  51. if (isVariable(token)) {
  52. output.push(token);
  53. } else if (isOperator(token)) {
  54. while (
  55. stack.length > 0 &&
  56. isOperator(stack[stack.length - 1]) &&
  57. getOperatorPriority(token) <= getOperatorPriority(stack[stack.length - 1])
  58. ) {
  59. output.push(stack.pop());
  60. }
  61. stack.push(token);
  62. } else if (isOpeningParenthesis(token)) {
  63. stack.push(token);
  64. } else if (isClosingParenthesis(token)) {
  65. while (!isOpeningParenthesis(stack[stack.length - 1])) {
  66. output.push(stack.pop());
  67. }
  68. stack.pop();
  69. }
  70. }
  71.  
  72. while (stack.length > 0) {
  73. output.push(stack.pop());
  74. }
  75.  
  76. return output;
  77. }
  78.  
  79. function toCNF(tokens) {
  80. const rpn = toReversePolishNotation(tokens);
  81. const stack = [];
  82.  
  83. for (let i = 0; i < rpn.length; i++) {
  84. const token = rpn[i];
  85. if (isVariable(token)) {
  86. stack.push([token]);
  87. } else if (isOperator(token)) {
  88. const right = stack.pop();
  89. const left = stack.pop();
  90.  
  91. if (token === '&') {
  92. stack.push(left.concat(right));
  93. } else if (token === '|') {
  94. const result = [];
  95. for (let j = 0; j < left.length; j++) {
  96. for (let k = 0; k < right.length; k++) {
  97. result.push(left[j].concat('|').concat(right[k]));
  98. }
  99. }
  100.  
  101. stack.push(result);
  102. }
  103. }
  104. }
  105. return stack[0].map(clause => ('(' + clause + ')')).join('&');
  106. }
  107.  
  108. console.log(toCNF(tokens));
  109. }
  110.  
  111. cnf("(a & b) | ~c"); // (a|~c)&(b|~c)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement