/* SAT solver Bin Fu binf@cs.cmu.edu 2009.02.17 modified by Byron Boots 2009.02.17 compile with g++ -O3 satSolver.cpp -o satSolver */ #include #include #include #include #define MAX_CLAUSE_SIZE 3 using namespace std; int varNum; int clauseNum; int* varDec; //0 unassined. 1 pos, -1 neg int** clauseVar; int* clauseVal; //0 pending. 1 pos, -1 neg int* clauseLength; inline int decidedVar(int index) //index: clause index. { int sum = 0; for(int i=0; i < clauseLength[index];i++) { sum = sum+abs(varDec[abs(clauseVar[index][i])]); } return sum; } inline int evaluateClause(int index) //index: clause index //1= true. -1=false. 0=pending { for(int i = 0; i0) return 1; } if (decidedVar(index)==clauseLength[index]) return -1; else return 0; } inline bool updateClause() //false=conflict! { for (int i=0;i0) { choose=j; numPos++; } } if (numPos>1) return choose; else return -1; } void readformula(char * filename) { // read into data structure ifstream fin; fin.open(filename); if (fin.bad()) { cerr << "Cannot open " << filename << "!" << endl; exit(-1); } string s; int state=0; int currentClauseNum=0; while (getline(fin,s)) { if (state==0) { if (s.substr(0,1)=="p") { state=1; int pos=s.find(" ",6); varNum = atoi(s.substr(5,pos-5).c_str()); clauseNum = atoi(s.substr(pos,s.size()-pos).c_str()); varDec = new int[varNum+1]; for (int i=1;i<=varNum;i++) varDec[i]=0; clauseVar = new int*[clauseNum]; clauseVal = new int[clauseNum]; clauseLength = new int[clauseNum]; for (int i=0;i0) varDec[clauseVar[i][unit]]=1; else varDec[-clauseVar[i][unit]]=-1; //no backtrack if (generateSolution()) return true; varDec[abs(clauseVar[i][unit])]=0; return false; } } //heuristic: Simple one. Choose a positive variable in a non-Horn clause for (int i=0;i=0) { int dec; if (clauseVar[i][unit]>0) { varDec[clauseVar[i][unit]]=1; dec=1; } else { varDec[-clauseVar[i][unit]]=-1; dec=-1; } if (generateSolution()) { return true; } else { varDec[abs(clauseVar[i][unit])]=-dec; if (generateSolution()) return true; else { varDec[abs(clauseVar[i][unit])]=0; return false; } } } } return false; } int main(int argc, char** argv) //argv[1] = data file. argv[2] = out file { clock_t start,finish; start=clock(); if (argc!=3) { cout<<"satSolver data_file output_file"<0) out<