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 20 package org.sat4j.pb.tools; 21 22 import org.sat4j.core.Vec; 23 import org.sat4j.specs.ContradictionException; 24 import org.sat4j.specs.IConstr; 25 import org.sat4j.specs.IVec; 26 import org.sat4j.specs.IVecInt; 27 28 /** 29 * That class represents the RHS of an implication. 30 * 31 * @author daniel 32 * 33 * @param <T> 34 * @param <C> 35 */ 36 public class ImplicationRHS<T, C> { 37 38 private final IVecInt clause; 39 private final DependencyHelper<T, C> helper; 40 41 private final IVec<IConstr> toName = new Vec<IConstr>(); 42 43 public ImplicationRHS(DependencyHelper<T, C> helper, IVecInt clause) { 44 this.clause = clause; 45 this.helper = helper; 46 } 47 48 /** 49 * Build an implication with a conjunction of literals in the RHS. 50 * 51 * @param thing 52 * a domain object that will appear positively. 53 * @return a RHS conjunction of literals. 54 * @throws ContradictionException 55 */ 56 public ImplicationAnd<T, C> implies(T thing) throws ContradictionException { 57 ImplicationAnd<T, C> and = new ImplicationAnd<T, C>(helper, clause); 58 and.and(thing); 59 return and; 60 } 61 62 /** 63 * Build an implication with a disjunction of literals in the RHS. 64 * 65 * @param thing 66 * a domain object 67 * @return an object used to name the constraint. The constraint MUST BE 68 * NAMED. 69 * @throws ContradictionException 70 */ 71 public ImplicationNamer<T, C> implies(T... things) 72 throws ContradictionException { 73 for (T t : things) { 74 clause.push(helper.getIntValue(t)); 75 } 76 toName.push(helper.solver.addClause(clause)); 77 return new ImplicationNamer<T, C>(helper, toName); 78 } 79 80 /** 81 * Build an implication with a conjunction of literals in the RHS. 82 * 83 * @param thing 84 * a domain object that will appear negatively. 85 * @return a RHS conjunction of literals. 86 * @throws ContradictionException 87 */ 88 public ImplicationAnd<T, C> impliesNot(T thing) 89 throws ContradictionException { 90 ImplicationAnd<T, C> and = new ImplicationAnd<T, C>(helper, clause); 91 and.andNot(thing); 92 return and; 93 } 94 95 }