3  * This file is a part of LEMON, a generic C++ optimization library
 
     5  * Copyright (C) 2003-2007
 
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
 
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
 
     9  * Permission to use, modify and distribute this software is granted
 
    10  * provided that this copyright notice appears in all copies. For
 
    11  * precise terms see the accompanying LICENSE file.
 
    13  * This software is provided "AS IS" with no warranty of any kind,
 
    14  * express or implied, and with no claim as to its suitability for any
 
    21 /// \brief Solver for SAT problems.
 
    23 /// This demo progam solves the SAT problem, i.e. the boolean
 
    24 /// satisfiability problem. The problem in general case is
 
    27 /// The program uses an integer linear program solver. A <tt>{0,
 
    28 /// 1}</tt> variable is assigned to each boolean variable. The
 
    29 /// disjunctions are converted to linear inequalities as each negation
 
    30 /// is replaced with a substraction from one and each disjunction is
 
    31 /// converted to addition. The generated linear expression should be
 
    44 using namespace lemon;
 
    47 int main(int argc, const char *argv[]) {
 
    49     std::cerr << "The SAT solver demo" << std::endl << std::endl;
 
    50     std::cerr << "The  parameter should be a filename" << std::endl;
 
    51     std::cerr << "Each line of the file should contain a bool expression:" 
 
    53     std::cerr << "  [not] <variable> [or [not] <variable>]..." << std::endl;
 
    54     std::cerr << "The program prints a feasible solution if it exists" 
 
    65   while (getline(is, line)) {
 
    66     istringstream ls(line);
 
    82       Mip::Col col = mip.colByName(var);
 
    86         mip.colName(col, var);
 
    87         mip.colLowerBound(col, 0);
 
    88         mip.colUpperBound(col, 1);
 
    89         mip.integer(col, true);        
 
    92       expr += (neg ? 1 - col : col);
 
    94     } while (ls >> op && op == "or");
 
    96       std::cerr << "Wrong bool expression" << std::endl;
 
    99     mip.addRow(expr >= 1);
 
   104   if (mip.mipStatus() == Mip::OPTIMAL) {
 
   105     for (Mip::ColIt it(mip); it != INVALID; ++it) {
 
   106       std::cout << mip.colName(it) << " = " 
 
   107                 << (mip.primal(it) == 1 ? "true" : "false")
 
   111     std::cout << "There is no feasible solution." << std::endl;