View Javadoc

1   /*******************************************************************************
2    * SAT4J: a SATisfiability library for Java Copyright (C) 2004, 2012 Artois University and CNRS
3    *
4    * All rights reserved. This program and the accompanying materials
5    * are made available under the terms of the Eclipse Public License v1.0
6    * which accompanies this distribution, and is available at
7    *  http://www.eclipse.org/legal/epl-v10.html
8    *
9    * Alternatively, the contents of this file may be used under the terms of
10   * either the GNU Lesser General Public License Version 2.1 or later (the
11   * "LGPL"), in which case the provisions of the LGPL are applicable instead
12   * of those above. If you wish to allow use of your version of this file only
13   * under the terms of the LGPL, and not to allow others to use your version of
14   * this file under the terms of the EPL, indicate your decision by deleting
15   * the provisions above and replace them with the notice and other provisions
16   * required by the LGPL. If you do not delete the provisions above, a recipient
17   * may use your version of this file under the terms of the EPL or the LGPL.
18   *
19   * Based on the original MiniSat specification from:
20   *
21   * An extensible SAT solver. Niklas Een and Niklas Sorensson. Proceedings of the
22   * Sixth International Conference on Theory and Applications of Satisfiability
23   * Testing, LNCS 2919, pp 502-518, 2003.
24   *
25   * See www.minisat.se for the original solver in C++.
26   *
27   * Contributors:
28   *   CRIL - initial API and implementation
29   *******************************************************************************/
30  package org.sat4j.specs;
31  
32  import java.io.PrintWriter;
33  
34  /**
35   * Access to the information related to a given problem instance.
36   * 
37   * @author leberre
38   */
39  public interface IProblem extends RandomAccessModel {
40      /**
41       * Provide a model (if any) for a satisfiable formula. That method should be
42       * called AFTER isSatisfiable() or isSatisfiable(IVecInt) if the formula is
43       * satisfiable. Else an exception UnsupportedOperationException is launched.
44       * 
45       * @return a model of the formula as an array of literals to satisfy.
46       * @see #isSatisfiable()
47       * @see #isSatisfiable(IVecInt)
48       */
49      int[] model();
50  
51      /**
52       * Provide a prime implicant, i.e. a set of literal that is sufficient to
53       * satisfy all constraints of the problem.
54       * 
55       * 
56       * @return a prime implicant of the formula as an array of literal, Dimacs
57       *         format.
58       * @since 2.3
59       */
60      int[] primeImplicant();
61  
62      /**
63       * Check if a given literal is part of the prime implicant computed by the
64       * {@link #primeImplicant()} method.
65       * 
66       * @param p
67       *            a literal in Dimacs format
68       * @return true iff p belongs to {@link #primeImplicant()}
69       */
70      boolean primeImplicant(int p);
71  
72      /**
73       * Check the satisfiability of the set of constraints contained inside the
74       * solver.
75       * 
76       * @return true if the set of constraints is satisfiable, else false.
77       */
78      boolean isSatisfiable() throws TimeoutException;
79  
80      /**
81       * Check the satisfiability of the set of constraints contained inside the
82       * solver.
83       * 
84       * @param assumps
85       *            a set of literals (represented by usual non null integers in
86       *            Dimacs format).
87       * @param globalTimeout
88       *            whether that call is part of a global process (i.e.
89       *            optimization) or not. if (global), the timeout will not be
90       *            reset between each call.
91       * @return true if the set of constraints is satisfiable when literals are
92       *         satisfied, else false.
93       */
94      boolean isSatisfiable(IVecInt assumps, boolean globalTimeout)
95              throws TimeoutException;
96  
97      /**
98       * Check the satisfiability of the set of constraints contained inside the
99       * solver.
100      * 
101      * @param globalTimeout
102      *            whether that call is part of a global process (i.e.
103      *            optimization) or not. if (global), the timeout will not be
104      *            reset between each call.
105      * @return true if the set of constraints is satisfiable, else false.
106      */
107     boolean isSatisfiable(boolean globalTimeout) throws TimeoutException;
108 
109     /**
110      * Check the satisfiability of the set of constraints contained inside the
111      * solver.
112      * 
113      * @param assumps
114      *            a set of literals (represented by usual non null integers in
115      *            Dimacs format).
116      * @return true if the set of constraints is satisfiable when literals are
117      *         satisfied, else false.
118      */
119     boolean isSatisfiable(IVecInt assumps) throws TimeoutException;
120 
121     /**
122      * Look for a model satisfying all the clauses available in the problem. It
123      * is an alternative to isSatisfiable() and model() methods, as shown in the
124      * pseudo-code: <code>
125      if (isSatisfiable()) {
126      return model();
127      }
128      return null; 
129      </code>
130      * 
131      * @return a model of the formula as an array of literals to satisfy, or
132      *         <code>null</code> if no model is found
133      * @throws TimeoutException
134      *             if a model cannot be found within the given timeout.
135      * @since 1.7
136      */
137     int[] findModel() throws TimeoutException;
138 
139     /**
140      * Look for a model satisfying all the clauses available in the problem. It
141      * is an alternative to isSatisfiable(IVecInt) and model() methods, as shown
142      * in the pseudo-code: <code>
143      if (isSatisfiable(assumpt)) {
144      return model();
145      }
146      return null; 
147      </code>
148      * 
149      * @return a model of the formula as an array of literals to satisfy, or
150      *         <code>null</code> if no model is found
151      * @throws TimeoutException
152      *             if a model cannot be found within the given timeout.
153      * @since 1.7
154      */
155     int[] findModel(IVecInt assumps) throws TimeoutException;
156 
157     /**
158      * To know the number of constraints currently available in the solver.
159      * (without taking into account learned constraints).
160      * 
161      * @return the number of constraints added to the solver
162      */
163     int nConstraints();
164 
165     /**
166      * Declare <code>howmany</code> variables in the problem (and thus in the
167      * vocabulary), that will be represented using the Dimacs format by integers
168      * ranging from 1 to howmany. That feature allows encodings to create
169      * additional variables with identifier starting at howmany+1.
170      * 
171      * @param howmany
172      *            number of variables to create
173      * @return the total number of variables available in the solver (the
174      *         highest variable number)
175      * @see #nVars()
176      */
177     int newVar(int howmany);
178 
179     /**
180      * To know the number of variables used in the solver as declared by
181      * newVar()
182      * 
183      * In case the method newVar() has not been used, the method returns the
184      * number of variables used in the solver.
185      * 
186      * @return the number of variables created using newVar().
187      * @see #newVar(int)
188      */
189     int nVars();
190 
191     /**
192      * To print additional informations regarding the problem.
193      * 
194      * @param out
195      *            the place to print the information
196      * @param prefix
197      *            the prefix to put in front of each line
198      * 
199      */
200     @Deprecated
201     void printInfos(PrintWriter out, String prefix);
202 
203     /**
204      * To print additional informations regarding the problem.
205      * 
206      * @param out
207      *            the place to print the information
208      * @see #setLogPrefix(String)
209      * @since 2.3.3
210      * 
211      */
212     void printInfos(PrintWriter out);
213 }