View Javadoc

1   /*******************************************************************************
2    * SAT4J: a SATisfiability library for Java Copyright (C) 2004-2008 Daniel Le Berre
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   *******************************************************************************/
28  package org.sat4j.minisat.core;
29  
30  import org.sat4j.specs.IVec;
31  
32  /**
33   * That interface manages the solver's internal vocabulary. Everything related
34   * to variables and literals is available from here.
35   * 
36   * For sake of efficiency, literals and variables are not object in SAT4J. They
37   * are represented by numbers. If the vocabulary contains n variables, then
38   * variables should be accessed by numbers from 1 to n and literals by numbers
39   * from 2 to 2*n+1.
40   * 
41   * For a Dimacs variable v, the variable index in SAT4J is v, it's positive
42   * literal is 2*v (v << 1) and it's negative literal is 2*v+1 ((v<<1)^1). Note
43   * that one can easily access to the complementary literal of p by using bitwise
44   * operation ^.
45   * 
46   * In SAT4J, literals are usualy denoted by p or q and variables by v or x.
47   * 
48   * @author leberre
49   */
50  public interface ILits {
51  
52  	public static int UNDEFINED = -1;
53  
54  	public abstract void init(int nvar);
55  
56  	/**
57  	 * Translates a Dimacs literal into an internal representation literal.
58  	 * 
59  	 * @param x
60  	 *            the Dimacs literal (a non null integer).
61  	 * @return the literal in the internal representation.
62  	 */
63  	public abstract int getFromPool(int x);
64  
65  	/**
66  	 * Returns true iff the variable is used in the set of constraints.
67  	 * 
68  	 * @param x
69  	 * @return true iff the variable belongs to the formula.
70  	 */
71  	boolean belongsToPool(int x);
72  
73  	public abstract void resetPool();
74  
75  	public abstract void ensurePool(int howmany);
76  
77  	public abstract void unassign(int lit);
78  
79  	public abstract void satisfies(int lit);
80  
81  	public abstract boolean isSatisfied(int lit);
82  
83  	public abstract boolean isFalsified(int lit);
84  
85  	public abstract boolean isUnassigned(int lit);
86  
87  	/**
88  	 * @param lit
89  	 * @return true iff the truth value of that literal is due to a unit
90  	 *         propagation or a decision.
91  	 */
92  	public abstract boolean isImplied(int lit);
93  
94  	/**
95  	 * to obtain the max id of the variable
96  	 * 
97  	 * @return the maximum number of variables in the formula
98  	 */
99  	public abstract int nVars();
100 
101 	/**
102 	 * to obtain the real number of variables appearing in the formula
103 	 * 
104 	 * @return the number of variables used in the pool
105 	 */
106 	int realnVars();
107 
108 	/**
109 	 * Ask the solver for a free variable identifier, in Dimacs format (i.e. a
110 	 * positive number). Note that a previous call to ensurePool(max) will
111 	 * reserve in the solver the variable identifier from 1 to max, so
112 	 * nextFreeVarId() would return max+1, even if some variable identifiers
113 	 * smaller than max are not used.
114 	 * 
115 	 * @return a variable identifier not in use in the constraints already
116 	 *         inside the solver.
117 	 * @since 2.1
118 	 */
119 	int nextFreeVarId(boolean reserve);
120 
121 	public abstract int not(int lit);
122 
123 	public abstract void reset(int lit);
124 
125 	public abstract int getLevel(int lit);
126 
127 	public abstract void setLevel(int lit, int l);
128 
129 	public abstract Constr getReason(int lit);
130 
131 	public abstract void setReason(int lit, Constr r);
132 
133 	public abstract IVec<Undoable> undos(int lit);
134 
135 	public abstract void watch(int lit, Propagatable c);
136 
137 	/**
138 	 * @param lit
139 	 *            a literal
140 	 * @return the list of all the constraints that watch the negation of lit
141 	 */
142 	public abstract IVec<Propagatable> watches(int lit);
143 
144 	public abstract String valueToString(int lit);
145 }