All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.invation.code.toval.math.logic.DavisPutnamProcedure Maven / Gradle / Ivy

package de.invation.code.toval.math.logic;

import java.util.Iterator;

import de.invation.code.toval.types.HashList;



public class DavisPutnamProcedure {
	
	public static boolean isSatisfiable(ClauseSet clauseSet){
		return !execute(clauseSet).isEmpty();
	}
	
	private static ClauseSet execute(ClauseSet clauseSet){
		HashList tempClauses = new HashList();
		HashList varSet = clauseSet.getItems();
		int count = 1;
		while(count < varSet.size()+1){
			if(clauseSet.isEmpty() || clauseSet.get(0).isEmpty())
				break;
			//Debug.message("variable: "+varSet.get(count-1));
			//Step 1: Remove all clauses from ClauseSet, that contain a literal l and its inverse dl
			tempClauses.clear();
			for(Clause c1: clauseSet)
				if(c1.hasTwinLiterals())
					tempClauses.add(c1);
			clauseSet.removeAll(tempClauses);
			//Debug.message("(A"+count+") "+clauseSet);
			
			//Step 2: Add all possible resolvents for variable varSet.get(count)
			tempClauses.clear();
			for(int i=0; i iter=clauseSet.iterator(); iter.hasNext();){
				Clause nextClause = iter.next();
				if(nextClause.containsItem(varSet.get(count-1)))
					tempClauses.add(nextClause);
			}
			clauseSet.removeAll(tempClauses);
			//Debug.message("(C"+count+") "+clauseSet);
			
			count++;
		}
		return clauseSet;
	}

}