package aima.core.logic.fol.inference.otter.defaultimpl;
import java.util.Comparator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import aima.core.logic.fol.inference.otter.LightestClauseHeuristic;
import aima.core.logic.fol.kb.data.Clause;
/**
* @author Ciaran O'Reilly
*
*/
public class DefaultLightestClauseHeuristic implements LightestClauseHeuristic {
private LightestClauseSorter c = new LightestClauseSorter();
private SortedSet<Clause> sos = new TreeSet<Clause>(c);
public DefaultLightestClauseHeuristic() {
}
//
// START-LightestClauseHeuristic
public Clause getLightestClause() {
Clause lightest = null;
if (sos.size() > 0) {
lightest = sos.first();
}
return lightest;
}
public void initialSOS(Set<Clause> clauses) {
sos.clear();
sos.addAll(clauses);
}
public void addedClauseToSOS(Clause clause) {
sos.add(clause);
}
public void removedClauseFromSOS(Clause clause) {
sos.remove(clause);
}
// END-LightestClauseHeuristic
//
}
class LightestClauseSorter implements Comparator<Clause> {
public int compare(Clause c1, Clause c2) {
if (c1 == c2) {
return 0;
}
int c1Val = c1.getNumberLiterals();
int c2Val = c2.getNumberLiterals();
return (c1Val < c2Val ? -1
: (c1Val == c2Val ? (compareEqualityIdentities(c1, c2)) : 1));
}
private int compareEqualityIdentities(Clause c1, Clause c2) {
int c1Len = c1.getEqualityIdentity().length();
int c2Len = c2.getEqualityIdentity().length();
return (c1Len < c2Len ? -1 : (c1Len == c2Len ? c1.getEqualityIdentity()
.compareTo(c2.getEqualityIdentity()) : 1));
}
}