Guest User

Untitled

a guest
Jan 12th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.78 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Stack;
  5.  
  6. public class ToCNF {
  7.     public static void main(String args[]) {
  8.  
  9.         System.out.println(cnf("(a & b) | ~c"));
  10.     }
  11.  
  12.     private static StringBuilder ToPolishNotation(String expr) {
  13.         Stack<Character> stack = new Stack<>();
  14.         StringBuilder ans = new StringBuilder();
  15.         for (int i = 0; i < expr.length(); i++) {
  16.             char c = expr.charAt(i);
  17.             if (c == '(') {
  18.                 stack.push(c);
  19.             } else if (c == '|') {
  20.                 while (!stack.empty() &&
  21.                         (stack.lastElement() == '&' || stack.lastElement() == '-' || stack.lastElement() == '|')) {
  22.                     ans.append(stack.lastElement());
  23.                     stack.pop();
  24.                 }
  25.                 stack.push(c);
  26.             } else if (c == '&') {
  27.                 while (!stack.empty() &&
  28.                         (stack.lastElement() == '&' || stack.lastElement() == '~')) {
  29.                     ans.append(stack.lastElement());
  30.                     stack.pop();
  31.                 }
  32.                 stack.push(c);
  33.             } else if (c == '~') {
  34.                 stack.push(c);
  35.             } else if (c == ')') {
  36.                 while (!stack.empty() && stack.lastElement() != '(') {
  37.                     ans.append(stack.lastElement());
  38.                     stack.pop();
  39.                 }
  40.                 stack.pop();
  41.             } else if (Character.isLowerCase(c)) {
  42.                 ans.append(c);
  43.             }
  44.         }
  45.         while (!stack.empty()) {
  46.             ans.append(stack.lastElement());
  47.             stack.pop();
  48.         }
  49.         return ans;
  50.     }
  51.  
  52.     private static String cnf(String s) {
  53.         int CountOfValues = 0;
  54.         Map<Character, Integer> values = new HashMap<>();
  55.         Map<Integer, Character> numOfValues = new HashMap<>();
  56.         int k = 0;
  57.  
  58.         for (int i = 0; i < s.length(); i++) {
  59.             if (Character.isLetter(s.charAt(i))) {
  60.                 CountOfValues++;
  61.                 values.put(s.charAt(i), k);
  62.                 numOfValues.put(k, s.charAt(i));
  63.                 ++k;
  64.             }
  65.         }
  66.  
  67.         StringBuilder polNot = new StringBuilder(ToPolishNotation(s));
  68.         int num = 1 << CountOfValues;
  69.         ArrayList<Integer> truthTable = new ArrayList<>();
  70.         Stack<Integer> stack = new Stack<>();
  71.  
  72.         for (int i = 0; i < num; i++) {
  73.             stack.removeAllElements();
  74.             for (int j = 0; j < polNot.length(); j++) {
  75.                 if (Character.isLetter(polNot.charAt(j))) {
  76.                     stack.push(1 & (i << (values.get(polNot.charAt(j)))));
  77.                 }
  78.                 if (Character.isDigit(polNot.charAt(j))) {
  79.                     stack.push(polNot.charAt(j) - '0');
  80.                 }
  81.                 if (polNot.charAt(j) == '~') {
  82.                     int lastEl = stack.peek();
  83.                     lastEl = (lastEl + 1) % 2;
  84.                     stack.pop();
  85.                     stack.push(lastEl);
  86.                 }
  87.                 if (polNot.charAt(j) == '&') {
  88.                     int lastEl = stack.peek();
  89.                     stack.pop();
  90.                     int lastLastEl = stack.peek();
  91.                     stack.pop();
  92.                     stack.push(lastEl & lastLastEl);
  93.                 }
  94.                 if (polNot.charAt(j) == '|') {
  95.                     int lastEl = stack.peek();
  96.                     stack.pop();
  97.                     int lastLastEl = stack.peek();
  98.                     stack.pop();
  99.                     stack.push(lastEl | lastLastEl);
  100.                 }
  101.             }
  102.             truthTable.add(stack.peek());
  103.         }
  104.         boolean ifNeverZero = true;
  105.         StringBuilder ans = new StringBuilder();
  106.  
  107.         for (int i = 0; i < num; i++) {
  108.             if (truthTable.get(i) == 0) {
  109.                 ifNeverZero = false;
  110.                 break;
  111.             }
  112.         }
  113.         if (ifNeverZero) {
  114.             return "1";
  115.         }
  116.  
  117.         for (int i = 0; i < num; i++) {
  118.             if (truthTable.get(i) == 1) {
  119.                 ans.append("(");
  120.                 for (int j = 0; j < CountOfValues - 1; j++) {
  121.                     if (((num >> j) & 1) == 0) {
  122.                         ans.append("~");
  123.                     }
  124.                     ans.append(numOfValues.get(j));
  125.                     ans.append("|");
  126.                 }
  127.                 if (((num >> (CountOfValues - 1)) & 1) == 1) {
  128.                     ans.append("~");
  129.                 }
  130.                 ans.append(numOfValues.get(CountOfValues - 1));
  131.                 ans.append("|");
  132.             }
  133.             ans.append(")&");
  134.         }
  135.         int length = ans.length();
  136.         return (ans.substring(0, length));
  137.     }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment