/**
   * Recursive backtracking solution
   *
   * @param formula 3sat formula to solve.
   * @returns true iff formula is satisfiable
   */
  public boolean dp(Formula formula) {

    if (formula.isEmpty()) // First base case: solution found
    return true;
    else if (formula.hasEmptyClause()) { // Second base case: dead end found

      return false;
    } else {
      // Pick a branch variable
      int var = formula.selectBranchVar();
      formula.setVar(var, true);
      if (dp(formula)) return true;
      else {
        // Unset var in the formula
        formula.unset(var);
        // Setting var to true did not work, so now try var = false
        formula.setVar(var, false);

        if (dp(formula)) return true;
        else {
          // Neither true nor false worked, so unset the branch
          // variable and backtrack
          formula.unset(var);
          return false;
        }
      }
    }
  }