Пример #1
0
bool SimpSMTSolver::addSMTClause( const vec<Lit>& smt_clause
#ifdef PRODUCE_PROOF
                                , const ipartitions_t in
#endif
                                )
{
    assert( config.sat_preprocess_theory == 0 );

#ifdef PRODUCE_PROOF
    assert(config.produce_inter == 0 || in != 0);
#endif

    for (int i = 0; i < smt_clause.size(); i++) {
        Lit e = smt_clause[i];
        // Do not add false literals
        // if ( e->isFalse( ) ) continue;
        // If a literal is true, the clause is true
        // if ( e->isTrue( ) )
        // return true;

        // Keep track of atoms seen, as they may
        // be interface equalities to skip later
//        if (config.logic == QF_UFIDL || config.logic == QF_UFLRA)
//            atoms_seen.insert( e );

    }
    vec<Lit> cl_out;
    // addClause will change the contents, and we don't want that here.
    smt_clause.copyTo(cl_out);
#ifdef PRODUCE_PROOF
    return addClause(smt_clause, in);
#else
    return addClause(cl_out);
#endif
}
Пример #2
0
void SimpSMTSolver::initialize( )
{
  CoreSMTSolver::initialize( );

#ifdef PRODUCE_PROOF
  if ( config.sat_preprocess_booleans != 0
    || config.sat_preprocess_theory != 0 ) 
  {
    opensmt_warning( "disabling SATElite preprocessing to track proof" );
    use_simplification = false;
    config.sat_preprocess_booleans = 0;
    config.sat_preprocess_theory = 0;
  }
#else
  use_simplification = config.sat_preprocess_booleans != 0;
#endif

  // Add clauses for true/false
  // Useful for expressing TAtoms that are constantly true/false

  const Var var_True = newVar( );
  const Var var_False = newVar( );

  setFrozen( var_True, true );
  setFrozen( var_False, true );

  vec< Lit > clauseTrue, clauseFalse;
  clauseTrue.push( Lit( var_True ) );
  addClause( clauseTrue );
  clauseFalse.push( Lit( var_False, true ) );
  addClause( clauseFalse );

  theory_handler = new THandler( egraph, config, *this, trail, level, assigns, var_True, var_False );
}
Пример #3
0
MojErr MojDbQuery::addClauses(WhereMap& map, const MojObject& array)
{
	MojObject clause;
	MojSize i = 0;
	while (array.at(i++, clause)) {
		MojString prop;
		MojErr err = clause.getRequired(PropKey, prop);
		MojErrCheck(err);
		MojString opStr;
		err = clause.getRequired(OpKey, opStr);
		MojErrCheck(err);
		CompOp op = OpNone;
		err = stringToOp(opStr, op);
		MojErrCheck(err);
		MojObject val;
		err = clause.getRequired(ValKey, val);
		MojErrCheck(err);
		MojDbCollationStrength coll = MojDbCollationInvalid;
		MojString collateStr;
		bool found = false;
		err = clause.get(CollateKey, collateStr, found);
		MojErrCheck(err);
		if (found) {
			err = MojDbUtils::collationFromString(collateStr, coll);
			MojErrCheck(err);
		}
		err = addClause(map, prop, op, val, coll);
		MojErrCheck(err);
	}
	return MojErrNone;
}
Пример #4
0
MojErr MojDbQuery::where(const MojChar* propName, CompOp op, const MojObject& val, MojDbCollationStrength coll)
{
	MojErr err = addClause(m_whereClauses, propName, op, val, coll);
	MojErrCheck(err);

	return MojErrNone;
}
Пример #5
0
void SimpSolver::remember(Var v)
{
    assert(decisionLevel() == 0);
    assert(isEliminated(v));

    vec<Lit> clause;

    // Re-activate variable:
    elimtable[v].order = 0;
    setDecisionVar(v, true); // Not good if the variable wasn't a decision variable before. Not sure how to fix this right now.

    if (use_simplification)
        updateElimHeap(v);

    // Reintroduce all old clauses which may implicitly remember other clauses:
    for (int i = 0; i < elimtable[v].eliminated.size(); i++){
        Clause& c = *elimtable[v].eliminated[i];
        clause.clear();
        for (int j = 0; j < c.size(); j++)
            clause.push(c[j]);

        remembered_clauses++;
        check(addClause(clause));
        free(&c);
    }

    elimtable[v].eliminated.clear();
}
Пример #6
0
MojErr MojDbQuery::filter(const MojChar* propName, CompOp op, const MojObject& val)
{
	MojErr err = addClause(m_filterClauses, propName, op, val, MojDbCollationInvalid);
	MojErrCheck(err);

	return MojErrNone;
}
Пример #7
0
Файл: tbl.c Проект: dbunker/SABR
void advInfraTrans(rootData *rdata,indexList *varList,linkedList clauseList,linkedList fullTransNodes){
	
	int x,i,n;
	linkedList clause;
	clauseVarData *clauseVar;
	
	// at most, least one trans/stage
	int transWidth = sizeLinked(fullTransNodes);
	tempTransVar **transArray = toArrayLinked(fullTransNodes);
	
	int logVal = log2Int(transWidth);
	
	// can have an empty state with zero transitions
	// at most one
	for(i=0;i<transWidth;i++){
		
		tempTransVar *tv = transArray[i];
		int desObjId = tv->desObjId;
		int transId = tv->transId;
		nodeStages *stages = tv->stages;

		if(tv->isSim)
			continue;
		
		for(n=0;n<numStagesGlobal-1;n++){

			if(n < stages->start || n > stages->end)
				continue;
			
			varData *trans = getTransVar(varList,transId,desObjId,n);
			assert(trans,"Trans Failed");

			int setPart = i+1;

			// set the vars to the corresponding trans
			for(x=0;x<=logVal;x++){
				
				clause = createLinked(Malloc,Free);
				
				varData *part = getTransPartVar(varList,x,n);
				if(!part)
					part = createTransPartVar(varList,x,n);
				
				clauseVar = createClauseVar(trans,1);
				addTailLinked(clause,clauseVar);
				
				int isNeg = !(setPart % 2);
				setPart = setPart >> 1;

				clauseVar = createClauseVar(part,isNeg);
				addTailLinked(clause,clauseVar);
				
				addClause(clauseList,clause);
			}
		}
	}
}
Пример #8
0
bool ClingoPropagator::isModel(Solver& s) {
	POTASSCO_REQUIRE(prop_ == trail_.size(), "Assignment not propagated");
	if (call_->checkMode() == ClingoPropagatorCheck_t::Total) {
		Control ctrl(*this, s);
		ScopedLock(call_->lock(), call_->propagator(), Inc(epoch_))->check(ctrl);
		return addClause(s, 0u) && s.numFreeVars() == 0 && s.queueSize() == 0;
	}
	return true;
}
Пример #9
0
bool SimpSMTSolver::eliminateVar(Var v, bool fail)
{
  if (!fail && asymm_mode && !asymmVar(v))    return false;

  const vec<Clause*>& cls = getOccurs(v);

  //  if (value(v) != l_Undef || cls.size() == 0) return true;
  if (value(v) != l_Undef) return true;

  // Split the occurrences into positive and negative:
  vec<Clause*>  pos, neg;
  for (int i = 0; i < cls.size(); i++)
    (find(*cls[i], Lit(v)) ? pos : neg).push(cls[i]);

  // Check if number of clauses decreases:
  int cnt = 0;
  for (int i = 0; i < pos.size(); i++)
    for (int j = 0; j < neg.size(); j++)
      if (merge(*pos[i], *neg[j], v) && ++cnt > cls.size() + grow)
	return true;
#ifdef PEDANTIC_DEBUG
  cerr << "XXY gonna-remove" << endl;
#endif
  // Delete and store old clauses:
  setDecisionVar(v, false);
  elimtable[v].order = elimorder++;
  assert(elimtable[v].eliminated.size() == 0);
  for (int i = 0; i < cls.size(); i++)
  {
    elimtable[v].eliminated.push(Clause_new(*cls[i]));
    removeClause(*cls[i]);
  }

  // Produce clauses in cross product:
  int top = clauses.size();
  vec<Lit> resolvent;
  for (int i = 0; i < pos.size(); i++)
    for (int j = 0; j < neg.size(); j++)
      if (merge(*pos[i], *neg[j], v, resolvent) && !addClause(resolvent))
	return false;

  // DEBUG: For checking that a clause set is saturated with respect to variable elimination.
  //        If the clause set is expected to be saturated at this point, this constitutes an
  //        error.
  if (fail){
    reportf("eliminated var %d, %d <= %d\n", v+1, cnt, cls.size());
    reportf("previous clauses:\n");
    for (int i = 0; i < cls.size(); i++){
      printClause(*cls[i]); reportf("\n"); }
    reportf("new clauses:\n");
    for (int i = top; i < clauses.size(); i++){
      printClause(*clauses[i]); reportf("\n"); }
    assert(0); }

    return backwardSubsumptionCheck();
}
/**
 * Generate and print a random clause with nbLiterals literals
 * @param f the formula
 * @param clauseNumber : the clause to generate
 * @param : the number of literals that contain the clause
	
 */
void generateClause(Formula * f, int nbLiterals) {
  Clause * c;
    createClause(&c);
    addClause(f,c);
  for(int i = 0;i<nbLiterals;i++) {
    int sign = rand()%2 ? 1 : -1;
    Literal l = sign*(rand()%f->nbVariables+1);
      
    addLiteralInClause(*f,c,l);
   
  }
}
Пример #11
0
bool SimpSMTSolver::addSMTClause( vector< Enode * > & smt_clause
#ifdef PRODUCE_PROOF
                                , const ipartitions_t in 
#endif
				)
{
  assert( config.sat_preprocess_theory == 0 );
  vec< Lit > sat_clause;

#ifdef PRODUCE_PROOF
  assert( config.produce_inter == 0 || in != 0 );
#endif

  for ( vector< Enode * >::iterator it = smt_clause.begin( ) ;
      it != smt_clause.end( ) ;
      it ++ )
  {
    Enode * e = *it;
    // Do not add false literals
    if ( e->isFalse( ) ) continue;
    // If a literal is true, the clause is true
    if ( e->isTrue( ) )
      return true;

    // Keep track of atoms seen, as they may
    // be interface equalities to skip later
    if ( config.logic == QF_UFIDL
      || config.logic == QF_UFLRA )
      atoms_seen.insert( e );

    Lit l = theory_handler->enodeToLit( e );
    sat_clause.push( l );
  }

#ifdef PRODUCE_PROOF
  return addClause( sat_clause, in );
#else
  return addClause( sat_clause );
#endif
}
Пример #12
0
void SAT::addClause(vec<Lit>& ps, bool one_watch) {
	int i, j;
	for (i = j = 0; i < ps.size(); i++) {
		if (value(ps[i]) == l_True) return;
		if (value(ps[i]) == l_Undef) ps[j++] = ps[i];
	}
	ps.resize(j);
	if (ps.size() == 0) {
		assert(false);
		TL_FAIL();
	}
	addClause(*Clause_new(ps), one_watch);
}
Пример #13
0
bool ClingoPropagator::propagateFixpoint(Clasp::Solver& s, Clasp::PostPropagator*) {
	POTASSCO_REQUIRE(prop_ <= trail_.size(), "Invalid propagate");
	for (Control ctrl(*this, s, state_prop); prop_ != trail_.size() || front_ < (int32)s.numAssignedVars();) {
		if (prop_ != trail_.size()) {
			// create copy because trail might change during call to user propagation
			temp_.assign(trail_.begin() + prop_, trail_.end());
			prop_ = static_cast<uint32>(trail_.size());
			ScopedLock(call_->lock(), call_->propagator(), Inc(epoch_))->propagate(ctrl, Potassco::toSpan(temp_));
		}
		else {
			registerUndo(s);
			front_ = (int32)s.numAssignedVars();
			ScopedLock(call_->lock(), call_->propagator(), Inc(epoch_))->check(ctrl);
		}
		if (!addClause(s, state_prop) || (s.queueSize() && !s.propagateUntil(this))) {
			return false;
		}
	}
	return true;
}
Пример #14
0
 void addClause(int a) {
   std::array<int const, 1>  clause{a};
   addClause(clause.begin(), clause.end());
 }
Пример #15
0
 void addClause(int a, int b, int c) {
   std::array<int const, 3>  clause{a, b, c};
   addClause(clause.begin(), clause.end());
 }
Пример #16
0
Файл: tbl.c Проект: dbunker/SABR
// this sets cellUsedStageN=>N+1 variables when that cell is used in that transition
void setUsedClauses(rootData *rdata,indexList *varList,linkedList clauseList,linkedList fullTransNodes){

	int i,n;
	linkedList clause;
	clauseVarData *clauseVar;
	
	// trans
	int transWidth = sizeLinked(fullTransNodes);
	tempTransVar **transArray = toArrayLinked(fullTransNodes);

	// board
	treeNode *boardNode = rdata->boardNode;
	setData *boardSet = boardNode->data;
	
	int boardWidth = boardSet->width;
	int boardHeight = boardSet->height;
	cellData **boardVars = boardSet->setVars;
	
	int boardX, boardY;
	int desObjX, desObjY;
		
	// for each cellStage used-var	
	// find all transitions that use that cell, put it into the set

	for(boardY=0;boardY<boardHeight;boardY++){
		for(boardX=0;boardX<boardWidth;boardX++){

			if(!boardVars[boardY*boardWidth+boardX])
				continue;
			cellData *boardCell = boardVars[boardY*boardWidth+boardX];
			int boardCellName = boardCell->cellName;

			for(n=0;n<numStagesGlobal-1;n++){
				
				varData *used = getUsedVar(varList,boardX,boardY,n);
				assert(used,"Used NULL");

				// NOT cellUsedStageN=>N+1 OR tran1StageN=>N+1 OR tran2StageN=>N+1 OR ...
				linkedList transListClause = createLinked(Malloc,Free);
				
				// contains varData
				// this is for saying at most one of these simultaneous trans that use this cell can be used
				linkedList transSimAtMostList = createLinked(Malloc,Free);

				// try to find it in trans
				for(i=0;i<transWidth;i++){

					tempTransVar *trans = transArray[i];

					// if this trans does not occur at this stage, it is not included in list that would indicate cell is used
					nodeStages *stages = trans->stages;
					if(n < stages->start || n > stages->end)
						continue;

					varData *tv = getTransVar(varList,trans->transId,trans->desObjId,n);
					assert(tv,"Trans NULL");				

					// true if the transition operates on board cell (boardX,boardY)
					int transUsesBoardCell = 0;

					// if it is the board, this x,y is used
					setData *dos = trans->desObjSet;

					manyData **desObjSet = dos->setVars;
					int desObjHeight = dos->height;
					int desObjWidth = dos->width;	
						
					for(desObjY=0;desObjY<desObjHeight;desObjY++){
						for(desObjX=0;desObjX<desObjWidth;desObjX++){
			
							if(!desObjSet[desObjY*desObjWidth + desObjX]) 
								continue;
								
							manyData *md = desObjSet[desObjY*desObjWidth + desObjX];
							linkedList brackVars = md->brackVars;
							int *objSymP = peekLinked(brackVars);
							int desObjCellName = *objSymP;

							if(boardCellName == desObjCellName){
								transUsesBoardCell = 1;
							}
						}
					}
					
					// found board cell
					if(transUsesBoardCell){

						clause = createLinked(Malloc,Free);
						clauseVar = createClauseVar(used,0);
						addTailLinked(clause,clauseVar);
						clauseVar = createClauseVar(tv,1);
						addTailLinked(clause,clauseVar);

						assertBool(sizeLinked(clause) != 0,"Empty Clause Used");
						addClause(clauseList,clause);

						clauseVar = createClauseVar(tv,0);
						addTailLinked(transListClause,clauseVar);

						// if it is not a TransSim it is already in an at-most-one
						if(trans->isSim){
							// varData
							addTailLinked(transSimAtMostList,tv);
						}
					}
				}
				
				// connect this trans to this used cell
				clauseVar = createClauseVar(used,1);
				pushLinked(transListClause,clauseVar);

				addClause(clauseList,transListClause);

				// for TransSim
				atMostOne(transSimAtMostList,clauseList);
				destroyLinked(transSimAtMostList,NULL);
			}
		}
	}
}
Пример #17
0
Файл: tbl.c Проект: dbunker/SABR
// this forces the cell to remain the same when cellUsedStageN=>N+1 is not set
void usedClauses(rootData *rdata,indexList *varList,linkedList clauseList,linkedList fullTransNodes){

	int i,n;
	linkedList clause;
	clauseVarData *clauseVar;

	// board
	treeNode *boardNode = rdata->boardNode;
	setData *boardSet = boardNode->data;
	
	int boardWidth = boardSet->width;
	int boardHeight = boardSet->height;
	cellData **boardVars = boardSet->setVars;
	int boardX, boardY;
	
	// for each cellStage used-var	
	// find all transitions that use that cell, put it into the set
	
	for(boardY=0;boardY<boardHeight;boardY++){
		for(boardX=0;boardX<boardWidth;boardX++){

			if(!boardVars[boardY*boardWidth+boardX])
				continue;

			cellData *cell = boardVars[boardY*boardWidth+boardX];
			linkedList symList = cell->symList;
			int symWidth = sizeLinked(symList);
			int **symArray = toArrayLinked(symList);

			for(n=0;n<numStagesGlobal-1;n++){

				varData *used = getUsedVar(varList,boardX,boardY,n);
				assert(used,"No Used\n");

				for(i=0;i<symWidth;i++){
					
					int sym = *symArray[i];

					// empty transitions
					// boardCell0UsedStageN=>N+1 OR NOT boardCell0IsSym0StageN OR boardCell0IsSym0StageN+1
					// and reverse
					varData *scv0 = getSymCellVar(varList,boardX,boardY,sym,n);
					assert(scv0,"No SCV0\n");
					varData *scv1 = getSymCellVar(varList,boardX,boardY,sym,n+1);
					assert(scv1,"No SCV1\n");					

					clause = createLinked(Malloc,Free);
					clauseVar = createClauseVar(used,0);
					addTailLinked(clause,clauseVar);
					clauseVar = createClauseVar(scv0,1);
					addTailLinked(clause,clauseVar);
					clauseVar = createClauseVar(scv1,0);
					addTailLinked(clause,clauseVar);

					assertBool(sizeLinked(clause) != 0,"Empty Clause Used");
					addClause(clauseList,clause);

					clause = createLinked(Malloc,Free);
					clauseVar = createClauseVar(used,0);
					addTailLinked(clause,clauseVar);
					clauseVar = createClauseVar(scv1,1);
					addTailLinked(clause,clauseVar);
					clauseVar = createClauseVar(scv0,0);
					addTailLinked(clause,clauseVar);

					assertBool(sizeLinked(clause) != 0,"Empty Clause Used");
					addClause(clauseList,clause);
				}
			}
		}
	}
}
Пример #18
0
 void addClause(int a, int b) {
   std::array<int const, 2>  clause{a, b};
   addClause(clause.begin(), clause.end());
 }