public static void main(String args[]) throws IOException {
   // Main array where we will store our initial clauses.
   ArrayList<Clause> Clauses = new ArrayList<Clause>();
   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   // Creating data structure.
   System.out.println("How many clauses does your formula in the Conjuctive Normal Form have?");
   int nClauses = Integer.parseInt(in.readLine());
   System.out.println("Please introduce your clauses.");
   System.out.println("(Input description in the readme file.");
   for (int i = 0; i < nClauses; i++) {
     String literalsList = in.readLine();
     String[] literals = literalsList.split(" ");
     Clause clause = new Clause();
     for (int i1 = 0; i1 < literals.length; i1++) {
       clause.addLiteral(literals[i1]);
     }
     Clauses.add(clause);
   }
   // End of data structure
   if (DLL(Clauses)) {
     System.out.println("Result: The formula is satisfactable.");
   } else {
     System.out.println("Result: The formula is  not satisfactable.");
   }
 }
  /*	This is the main algorithm.
   * 	It receives a formula and processes it until
   * 	it can return true or false.
   */
  static boolean DLL(ArrayList<Clause> Clauses) {
    // Unitary Propagation
    while (true) {
      String literalToRemove = searchSingleLiteral(Clauses);
      if (!literalToRemove.equals("NotFoundYet")) {
        printClauses(Clauses);
        System.out.println("Performing unitary propagation with: " + literalToRemove);
        removeClauses(literalToRemove, Clauses);
        cutClauses(literalToRemove, Clauses);
        printClauses(Clauses);
        if (Clauses.size() == 0) {
          System.out.println("All clauses removed. Returning true.");
          return true;
        }
        if (hasFalsehood(Clauses)) {
          System.out.println("Falsehood detected. Returning false.");
          return false;
        } else if (hasEmptyClause(Clauses)) {
          System.out.println("Empty clause detected. Returning false.");
          return false;
        }
      } else {
        System.out.println("No single literals.");
        System.out.println("Cannot perform unitary propagation.");
        break;
      }
    }
    ArrayList<Clause> copy1 = new ArrayList<Clause>();
    ArrayList<Clause> copy2 = new ArrayList<Clause>();
    for (Clause c : Clauses) {
      Clause c2 = new Clause();
      for (String s : c.literals) {
        c2.addLiteral(s);
      }
      copy1.add(c2);
    }
    for (Clause c : Clauses) {
      Clause c2 = new Clause();
      for (String s : c.literals) {
        c2.addLiteral(s);
      }
      copy2.add(c2);
    }
    Clause clause1 = new Clause();
    Clause clause2 = new Clause();
    String l1 = pickLiteral(Clauses);
    String l2 = "";

    if (l1.startsWith("-")) l2 = l1.substring(1);
    else l2 = "-" + l1;
    clause1.addLiteral(l1);
    clause2.addLiteral(l2);
    copy1.add(clause1);
    copy2.add(clause2);
    // Moment of the truth
    System.out.println("Adding clause: [" + l1 + "]");
    if (DLL(copy1) == true) {
      return true;
    } else {
      System.out.println("Trying opposite clause: [" + l2 + "]");
      return DLL(copy2);
    }
  }