1288{
1290 lit *i,*j,*iFree = NULL;
1291 int maxvar, count, temp;
1292 assert( solver2_dlevel(s) == 0 );
1295
1296
1298 for ( i = begin; i < end; i++ )
1302
1303
1304 maxvar = lit_var(*begin);
1305 for (i = begin + 1; i < end; i++){
1307 maxvar = lit_var(l) > maxvar ? lit_var(l) : maxvar;
1308 for (j = i; j > begin && *(j-1) > l; j--)
1309 *j = *(j-1);
1310 *j = l;
1311 }
1313
1314
1315
1316 for (i = j = begin + 1; i < end; i++)
1317 {
1318 if ( *(i-1) == lit_neg(*i) )
1319 return clause2_create_new( s, begin, end, 0, 0 );
1320 if ( *(i-1) != *i )
1321 *j++ = *i;
1322 }
1323 end = j;
1325
1326
1327 count = 0;
1328 for ( i = begin; i < end; i++ )
1329 {
1330
1331 assert( i == begin || lit_var(*(i-1)) != lit_var(*i) );
1332
1333 if ( var_value(s, lit_var(*i)) == lit_sign(*i) )
1334 return clause2_create_new( s, begin, end, 0, 0 );
1335 if ( var_value(s, lit_var(*i)) == varX )
1336 iFree = i;
1337 else
1338 count++;
1339 }
1340 assert( count < end-begin );
1341
1342
1343 temp = *iFree;
1344 *iFree = *begin;
1345 *begin = temp;
1346
1347
1348 Cid = clause2_create_new( s, begin, end, 0, 0 );
1349 if ( Id )
1350 clause2_set_id( s, Cid, Id );
1351
1352
1353 if ( count+1 == end-begin )
1354 {
1356 {
1357 if ( count == 0 )
1358 {
1359 var_set_unit_clause( s, lit_var(begin[0]), Cid );
1360 if ( !solver2_enqueue(s,begin[0],0) )
1362 }
1363 else
1364 {
1365
1366 int x, k, proof_id, CidNew;
1367 clause* c = clause2_read(s, Cid);
1368 proof_chain_start( s, c );
1370 proof_chain_resolve( s, NULL, x );
1371 proof_id = proof_chain_stop( s );
1372
1373 CidNew = clause2_create_new( s, begin, begin+1, 1, proof_id );
1374 var_set_unit_clause( s, lit_var(begin[0]), CidNew );
1375 if ( !solver2_enqueue(s,begin[0],Cid) )
1377 }
1378 }
1379 }
1380 return Cid;
1381}
#define clause_foreach_var(p, var, i, start)
void sat_solver2_setnvars(sat_solver2 *s, int n)