void HCComponent::iterationInternalLiterals( vector< Literal >& assumptions ) { bool hasToAddClause = true; Clause* clause = new Clause(); for( unsigned int i = 0; i < hcVariables.size(); i++ ) { Literal lit = Literal( hcVariables[ i ], NEGATIVE ); if( solver.isFalse( hcVariables[ i ] ) ) assumptions.push_back( lit ); else { unfoundedSetCandidates.push_back( lit ); if( !hasToAddClause ) continue; hasToAddClause = addLiteralInClause( lit, clause ); } } if( hasToAddClause && literalToAdd != Literal::null ) hasToAddClause = addLiteralInClause( literalToAdd, clause ); if( !hasToAddClause ) { delete clause; return; } Var addedVar = addFreshVariable(); assumptionLiteral = Literal( addedVar, POSITIVE ); clause->addLiteral( assumptionLiteral.getOppositeLiteral() ); assumptions.push_back( assumptionLiteral ); trace_msg( modelchecker, 2, "Adding clause " << *clause ); #ifndef NDEBUG bool result = #endif checker.addClauseRuntime( clause ); assert( result ); statistics( &checker, assumptionsOR( clause->size() ) ); trace_msg( modelchecker, 3, "Adding " << assumptionLiteral << " as assumption" ); }
/** * 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); } }
void HCComponent::createInitialClauseAndSimplifyHCVars() { trace_msg( modelchecker, 1, "Simplifying Head Cycle variables" ); Clause* clause = new Clause(); bool satisfied = false; int j = 0; for( unsigned int i = 0; i < hcVariables.size(); i++ ) { Var v = hcVariables[ j ] = hcVariables[ i ]; if( solver.isTrue( v ) && solver.getDecisionLevel( v ) == 0 ) { Literal lit = Literal( v, NEGATIVE ); unfoundedSetCandidates.push_back( lit ); removedHCVars++; trace_msg( modelchecker, 2, "Variable " << Literal( v ) << " is true at level 0: removed" ); if( !satisfied ) satisfied = !addLiteralInClause( lit, clause ); } else j++; } hcVariables.resize( j ); trace_msg( modelchecker, 2, "Clause before adding a fresh variable " << *clause << ", which is " << ( satisfied ? "" : "not" ) << " satisfied"); if( clause->size() == 0 || satisfied ) { trace_msg( modelchecker, 3, "Removed" ); delete clause; } else { statistics( &checker, setTrueAtLevelZero( removedHCVars ) ); assert( clause != NULL ); Var newVar = addFreshVariable(); literalToAdd = Literal( newVar, NEGATIVE ); clause->addLiteral( literalToAdd.getOppositeLiteral() ); trace_msg( modelchecker, 3, "Clause to add " << *clause ); if( !isConflictual ) isConflictual = !checker.addClauseRuntime( clause ); } assert( removedHCVars == unfoundedSetCandidates.size() ); }