Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Stack;
- public class ToCNF {
- public static void main(String args[]) {
- System.out.println(cnf("(a & b) | ~c"));
- }
- private static StringBuilder ToPolishNotation(String expr) {
- Stack<Character> stack = new Stack<>();
- StringBuilder ans = new StringBuilder();
- for (int i = 0; i < expr.length(); i++) {
- char c = expr.charAt(i);
- if (c == '(') {
- stack.push(c);
- } else if (c == '|') {
- while (!stack.empty() &&
- (stack.lastElement() == '&' || stack.lastElement() == '-' || stack.lastElement() == '|')) {
- ans.append(stack.lastElement());
- stack.pop();
- }
- stack.push(c);
- } else if (c == '&') {
- while (!stack.empty() &&
- (stack.lastElement() == '&' || stack.lastElement() == '~')) {
- ans.append(stack.lastElement());
- stack.pop();
- }
- stack.push(c);
- } else if (c == '~') {
- stack.push(c);
- } else if (c == ')') {
- while (!stack.empty() && stack.lastElement() != '(') {
- ans.append(stack.lastElement());
- stack.pop();
- }
- stack.pop();
- } else if (Character.isLowerCase(c)) {
- ans.append(c);
- }
- }
- while (!stack.empty()) {
- ans.append(stack.lastElement());
- stack.pop();
- }
- return ans;
- }
- private static String cnf(String s) {
- int CountOfValues = 0;
- Map<Character, Integer> values = new HashMap<>();
- Map<Integer, Character> numOfValues = new HashMap<>();
- int k = 0;
- for (int i = 0; i < s.length(); i++) {
- if (Character.isLetter(s.charAt(i))) {
- CountOfValues++;
- values.put(s.charAt(i), k);
- numOfValues.put(k, s.charAt(i));
- ++k;
- }
- }
- StringBuilder polNot = new StringBuilder(ToPolishNotation(s));
- int num = 1 << CountOfValues;
- ArrayList<Integer> truthTable = new ArrayList<>();
- Stack<Integer> stack = new Stack<>();
- for (int i = 0; i < num; i++) {
- stack.removeAllElements();
- for (int j = 0; j < polNot.length(); j++) {
- if (Character.isLetter(polNot.charAt(j))) {
- stack.push(1 & (i << (values.get(polNot.charAt(j)))));
- }
- if (Character.isDigit(polNot.charAt(j))) {
- stack.push(polNot.charAt(j) - '0');
- }
- if (polNot.charAt(j) == '~') {
- int lastEl = stack.peek();
- lastEl = (lastEl + 1) % 2;
- stack.pop();
- stack.push(lastEl);
- }
- if (polNot.charAt(j) == '&') {
- int lastEl = stack.peek();
- stack.pop();
- int lastLastEl = stack.peek();
- stack.pop();
- stack.push(lastEl & lastLastEl);
- }
- if (polNot.charAt(j) == '|') {
- int lastEl = stack.peek();
- stack.pop();
- int lastLastEl = stack.peek();
- stack.pop();
- stack.push(lastEl | lastLastEl);
- }
- }
- truthTable.add(stack.peek());
- }
- boolean ifNeverZero = true;
- StringBuilder ans = new StringBuilder();
- for (int i = 0; i < num; i++) {
- if (truthTable.get(i) == 0) {
- ifNeverZero = false;
- break;
- }
- }
- if (ifNeverZero) {
- return "1";
- }
- for (int i = 0; i < num; i++) {
- if (truthTable.get(i) == 1) {
- ans.append("(");
- for (int j = 0; j < CountOfValues - 1; j++) {
- if (((num >> j) & 1) == 0) {
- ans.append("~");
- }
- ans.append(numOfValues.get(j));
- ans.append("|");
- }
- if (((num >> (CountOfValues - 1)) & 1) == 1) {
- ans.append("~");
- }
- ans.append(numOfValues.get(CountOfValues - 1));
- ans.append("|");
- }
- ans.append(")&");
- }
- int length = ans.length();
- return (ans.substring(0, length));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment