Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- import java.util.regex.Pattern;
- import java.io.*;
- public class Pojeto {
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- int casos = in.nextInt();
- in.nextLine();
- for(int p=0;p<casos;p++) {
- String cs = in.nextLine();
- String tipo = cs.substring(0, 2);
- String teste = cs.substring(3, cs.length());
- int problemNumber=p+1;
- if(tipo.equals("TT")) {
- System.out.println("Problema #"+problemNumber);
- printTT(getClauses(teste),getVariables(teste),numVariables(getVariables(teste)),numClauses(getClauses(teste)));
- }else {
- System.out.println("Problema #" + problemNumber);
- if(isFNC(teste) == true) {
- if(isHorn(teste) == true) {
- /*
- if(isSat(teste) == true) {
- System.out.println("Sim, é satisfatível.");
- }else {
- System.out.println("Não, não é satisfatível.");
- }*/
- }else {
- System.out.println("Nem todas as cláusulas são de Horn.");
- }
- }else {
- System.out.println("Não está na FNC.");
- }
- }
- }
- }
- static Queue<String> getClauses(String teste) {
- teste = teste.replaceAll(" ","");
- Stack<Character> parenteses = new Stack<Character>();
- Stack<Integer> parentesesIndex = new Stack<Integer>();
- Queue<String> clausulas = new LinkedList<String>();
- for(int x=0;x<teste.length();x++) {
- if(teste.charAt(x)=='(') {
- parenteses.push(teste.charAt(x));
- parentesesIndex.push(x);
- }else if(teste.charAt(x)==')') {
- parenteses.pop();
- String cla = teste.substring(parentesesIndex.pop()+1, x);
- clausulas.add(cla);
- }
- }
- return clausulas;
- }
- static boolean isFNC(String teste) {
- boolean booleano = true;
- teste = teste.replaceAll(" ", "");
- String[] fnc = new String[teste.length()];
- fnc = teste.split("");
- for(int i = 0; i <= teste.length() - 1; i++) {
- if(fnc[i].equals("<")) {
- booleano = false;
- }else if(fnc[i].equals(">")) {
- booleano = false;
- }
- }
- return booleano;
- }
- static boolean isHorn(String teste) {
- boolean booleano = true;
- teste = teste.replaceAll(" ", "");
- String[] horn = new String[teste.length()];
- horn = teste.split("");
- int c1 = 0;
- int c2 = 0;
- for(int i = 0; i <= teste.length() - 1; i++) {
- if(i == 0 && (horn[i].equals("P") || horn[i].equals("R") || horn[i].equals("Q") || horn[i].equals("S"))) {
- c2++;
- }else if(horn[i].equals("P") && !horn[i - 1].equals("~") || horn[i].equals("R") && !horn[i - 1].equals("~") || horn[i].equals("Q") && !horn[i - 1].equals("~") || horn[i].equals("S") && !horn[i - 1].equals("~")) {
- c2++;
- }
- }
- for(int i = 0; i <= teste.length() - 1; i++) {
- if(horn[i].equals("&")) {
- c1++;
- }
- }
- if(c2 > c1) {
- booleano = false;
- }
- return booleano;
- }
- /*
- static boolean isSat(String teste) {
- }*/
- static void orderBysize(Queue<String> clauses){
- String array[] = new String[clauses.size()];
- int x=0;
- while(!clauses.isEmpty()) {
- array[x]=clauses.remove();
- x++;
- }
- for(int i = 0; i < array.length-1; i++){
- for(int k = 0; k < array.length-i-1; k++){
- if(array[k].length() > array[k+1].length()){
- String aux = array[k];
- array[k] = array[k+1];
- array[k+1] = aux;
- }
- }
- }
- for(int i=0;i<array.length;i++) {
- clauses.add(array[i]);
- }
- }
- static Stack<String> getVariables(String teste) {
- boolean p=false,q=false,r=false,s=false;
- Stack<String> var = new Stack<String>();
- for(int x=0;x<teste.length();x++) {
- if(teste.charAt(x)=='P'){
- if(p==false) {
- var.push("P");
- p=true;
- }
- }else if(teste.charAt(x)=='Q') {
- if(q==false) {
- var.push("Q");
- q=true;
- }
- }else if(teste.charAt(x)=='R') {
- if(r==false) {
- var.push("R");
- r=true;
- }
- }else if(teste.charAt(x)=='S') {
- if(s==false) {
- var.push("S");
- s=true;
- }
- }
- }
- return var;
- }
- static String getOperation(String teste) {
- boolean p=false,q=false,r=false,s=false,t=false;
- String op="";
- for(int x=0;x<teste.length();x++) {
- if(teste.charAt(x)=='~'){
- op="~";
- }else if(teste.charAt(x)=='>') {
- op=">";
- }else if(teste.charAt(x)=='<') {
- op="<";
- }else if(teste.charAt(x)=='v') {
- op="v";
- }else if(teste.charAt(x)=='&') {
- op="&";
- }
- }
- return op;
- }
- static int numVariables(Stack<String> var) {
- return var.size();
- }
- static int numClauses(Queue<String> var) {
- return var.size();
- }
- static String[][] printTT(Queue<String> clausulas, Stack<String> variaveis,int numVariaveis, int numClausulas) {
- String [][] TT= new String [(int) Math.pow(2, numVariaveis)+1][numClausulas+numVariaveis+1];
- orderBysize(clausulas);
- //coloca uma sequencia de numeros booleanos numa fila
- Queue <String> nums= new LinkedList();
- int rows = (int) Math.pow(2,numVariaveis);
- for (int i=0; i<rows; i++) {
- for (int j=numVariaveis-1; j>=0; j--) {
- String top=Integer.toString((i/(int) Math.pow(2, j))%2);
- nums.add(top);
- }
- }
- Stack<String>clausulinhas=new Stack();
- //constrói a matriz
- for(int x=0;x<((int) Math.pow(2, numVariaveis)+1);x++) {
- for(int y=0;y<(numClausulas+numVariaveis+1);y++) {
- if(y==numVariaveis) {
- TT[x][y]="|";
- }else if(x>0&&y<numVariaveis){
- TT[x][y]=nums.remove();
- }else if(x==0) {
- if(!variaveis.isEmpty()&&y<=numVariaveis) {
- TT[x][y]=variaveis.get(y);
- }else if(!clausulas.isEmpty()) {
- TT[x][y]=clausulas.remove();
- clausulinhas.push(TT[x][y]);
- }
- }else if(y>numVariaveis){
- String clausulaCaso=TT[0][y];
- int numClausulaCaso=getClauses(clausulaCaso).size();
- Stack<String> variavel=getVariables(clausulaCaso);
- //operação simples ex:~p ex2:p>q
- if(numClausulaCaso==0) {
- String op=getOperation(clausulaCaso);
- if(op.equals("~")) {
- String spl[]=clausulaCaso.split("~");
- int pos=variaveis.indexOf(spl[1]);
- if(TT[x][pos].equals("0")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals(">")){
- String spl[]=clausulaCaso.split(">");
- int pos=variaveis.indexOf(spl[0]);
- int pos2=variaveis.indexOf(spl[1]);
- if(TT[x][pos].equals("0")||TT[x][pos2].equals("1")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals("<")) {
- String spl[]=clausulaCaso.split("<");
- int pos=variaveis.indexOf(spl[0]);
- int pos2=variaveis.indexOf(spl[1]);
- if(TT[x][pos].equals(TT[x][pos2])) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals("&")) {
- String spl[]=clausulaCaso.split("&");
- int pos=variaveis.indexOf(spl[0]);
- int pos2=variaveis.indexOf(spl[1]);
- if(TT[x][pos].equals("1")&&TT[x][pos2].equals("1")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals("v")) {
- String spl[]=clausulaCaso.split("v");
- int pos=variaveis.indexOf(spl[0]);
- int pos2=variaveis.indexOf(spl[1]);
- if(TT[x][pos].equals("0")&&TT[x][pos2].equals("0")) {
- TT[x][y]="0";
- }else {
- TT[x][y]="1";
- }
- }
- }else {
- clausulaCaso=clausulaCaso+")";
- clausulaCaso="("+clausulaCaso;
- Queue<String>clausula1=getClauses(clausulaCaso);
- orderBysize(clausula1);
- Stack<String>clausula=new Stack();
- while(!clausula1.isEmpty()) {
- clausula.push(clausula1.remove());
- }
- String clau1="",clau2="";
- // while(clausula.size()>1) {
- // if(clausula.size()==3) {
- // clau1=clausula.remove();
- // }else {
- // clau2=clausula.remove();
- // }
- // }
- // clausulaCaso=clausulaCaso.replaceAll(Pattern.quote(clau2),"");
- // clausulaCaso=clausulaCaso.replaceAll(Pattern.quote(clau1),"");
- // clausulaCaso=clausulaCaso.replaceAll("\\)", "");
- // clausulaCaso=clausulaCaso.replaceAll("\\(", "");
- //
- // String clausulaMain=clausula.remove();
- int clauSize=clausula.size();
- String clausulaMain="";
- for(int f=clauSize;f>0;f--) {
- if(f==clauSize) {
- clausulaMain=clausula.pop();
- }else if(f==clauSize-1) {
- clau2=clausula.pop();
- clausulaCaso=clausulaCaso.replaceAll(Pattern.quote("("+clau2+")"),"");
- }else if(f==clauSize-2) {
- clau1=clausula.pop();
- clausulaCaso=clausulaCaso.replaceAll(Pattern.quote("("+clau1+")"),"");
- }else {
- if(!clausulaCaso.contains(clausula.peek())) {
- clausulaCaso=clausulaCaso.replaceAll(Pattern.quote("("+clausula.pop()+")"),"");
- }
- }
- }
- clausulaCaso=clausulaCaso.substring(1,clausulaCaso.length()-1);
- //apos a retirada sobrar apenas a operação:
- if(clausulaCaso.length()==1) {
- String op=getOperation(clausulaCaso);
- if(op.equals("~")) {
- int pos1=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos1].equals("0")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals(">")){
- int pos2=clausulinhas.indexOf(clau1)+1+variaveis.size();
- int pos=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals("0")||TT[x][pos2].equals("1")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals("<")) {
- int pos=clausulinhas.indexOf(clau1)+1+variaveis.size();
- int pos2=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals(TT[x][pos2])) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals("&")) {
- int pos=clausulinhas.indexOf(clau1)+1+variaveis.size();
- int pos2=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals("1")&&TT[x][pos2].equals("1")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals("v")) {
- int pos=clausulinhas.indexOf(clau1)+1+variaveis.size();
- int pos2=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals("0")&&TT[x][pos2].equals("0")) {
- TT[x][y]="0";
- }else {
- TT[x][y]="1";
- }
- }
- //após a retirada sobrar variavel+operação ex: p>
- }else if(clausulaCaso.length()==2) {
- Stack<String> var=getVariables(clausulaCaso);
- String op=getOperation(clausulaCaso);
- int casoPos=1;
- if(clausulaCaso.charAt(0)=='P'||clausulaCaso.charAt(0)=='Q'||clausulaCaso.charAt(0)=='R'||clausulaCaso.charAt(0)=='S'||clausulaCaso.charAt(0)=='~') {
- casoPos=0;
- }
- if(op.equals("~")) {
- int pos1=clausulinhas.indexOf(clausulaMain)+1+variaveis.size();
- if(TT[x][pos1].equals("0")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals(">")){
- if(casoPos==0) {
- int pos=variaveis.indexOf(var.pop());
- int pos2=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals("0")||TT[x][pos2].equals("1")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else {
- int pos2=variaveis.indexOf(var.pop());
- int pos=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals("0")||TT[x][pos2].equals("1")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }
- }else if(op.equals("<")) {
- int pos=variaveis.indexOf(var.pop());
- int pos2=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals(TT[x][pos2])) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals("&")) {
- int pos=variaveis.indexOf(var.pop());
- int pos2=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals("1")&&TT[x][pos2].equals("1")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals("v")) {
- int pos=variaveis.indexOf(var.pop());
- int pos2=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals("0")&&TT[x][pos2].equals("0")) {
- TT[x][y]="0";
- }else {
- TT[x][y]="1";
- }
- }
- //após a retirada sobrar clausula+operação ex: p>q >
- }else {
- String var="";
- int casoPos=0;
- int l=clausulaCaso.length();
- if(clausulaCaso.charAt(l-1)=='<'||clausulaCaso.charAt(l-1)=='>'||clausulaCaso.charAt(l-1)=='&'||clausulaCaso.charAt(l-1)=='v'||clausulaCaso.charAt(l-1)=='~') {
- var=clausulaCaso.substring(1, clausulaCaso.length()-2);
- }else {
- var=clausulaCaso.substring(2, clausulaCaso.length()-1);
- casoPos=1;
- }
- clausulaCaso=clausulaCaso.replaceAll(Pattern.quote(var),"");
- String op=getOperation(clausulaCaso);
- if(op.equals("~")) {
- int pos1=clausulinhas.indexOf(clausulaMain)+1+variaveis.size();
- if(TT[x][pos1].equals("0")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals(">")){
- if(casoPos==0) {
- int pos=clausulinhas.indexOf(var)+1+variaveis.size();
- int pos2=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals("0")||TT[x][pos2].equals("1")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else {
- int pos2=clausulinhas.indexOf(var)+1+variaveis.size();
- int pos=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals("0")||TT[x][pos2].equals("1")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }
- }else if(op.equals("<")) {
- int pos=clausulinhas.indexOf(var)+1+variaveis.size();
- int pos2=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals(TT[x][pos2])) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals("&")) {
- int pos=clausulinhas.indexOf(var)+1+variaveis.size();
- int pos2=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals("1")&&TT[x][pos2].equals("1")) {
- TT[x][y]="1";
- }else {
- TT[x][y]="0";
- }
- }else if(op.equals("v")) {
- int pos=clausulinhas.indexOf(var)+1+variaveis.size();
- int pos2=clausulinhas.indexOf(clau2)+1+variaveis.size();
- if(TT[x][pos].equals("0")&&TT[x][pos2].equals("0")) {
- TT[x][y]="0";
- }else {
- TT[x][y]="1";
- }
- }
- }
- }
- }
- }
- }
- //printa a matriz
- for(int x=0;x<((int) Math.pow(2, numVariaveis)+1);x++) {
- for(int y=0;y<(numClausulas+numVariaveis+1);y++) {
- if((y>numVariaveis)&&(x>0)) {
- for(int i=1;i<TT[0][y].length();i++) {
- System.out.print(" ");
- }
- System.out.print(TT[x][y]+" ");
- }else {
- System.out.print(TT[x][y]+" ");
- }
- }
- System.out.println();
- }
- //checa se é satisfatível
- boolean sat=false;
- for(int x=0;x<((int) Math.pow(2, numVariaveis)+1);x++) {
- int j=0;
- for(int y=0;y<(numClausulas+numVariaveis+1);y++) {
- if(TT[x][numClausulas+numVariaveis]=="1") {
- sat=true;
- }
- if(numClausulas==0) {
- sat=true;
- }
- }
- }
- if(sat==true) {
- System.out.println("Sim, é satisfatível.");
- }else {
- System.out.println("Não, não é satisfatível.-----------------------------------------------------------------------------------------------------");
- }
- return TT;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement