package uk.ac.ox.cs.pagoda.constraints; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; import java.util.Set; import org.semanticweb.HermiT.model.Atom; import org.semanticweb.HermiT.model.AtomicConcept; import org.semanticweb.HermiT.model.DLClause; import org.semanticweb.HermiT.model.Individual; import org.semanticweb.HermiT.model.Term; import org.semanticweb.HermiT.model.Variable; public class UnaryBottom implements BottomStrategy { @Override public Collection process(Collection clauses) { Collection ret = new LinkedList(); for (DLClause clause: clauses) if (clause.getHeadLength() == 0) { ret.add(DLClause.create(getEmptyHead(pickRepresentative(clause.getBodyAtoms())), clause.getBodyAtoms())); } else ret.add(clause); return ret; } protected Term pickRepresentative(Atom[] atoms) { Term rep = null; Set vars = new HashSet(); for (Atom atom: atoms) { atom.getVariables(vars); for (Variable v: vars) if (rep == null || ((Variable) rep).getName().compareTo(v.getName()) > 0) rep = v; vars.clear(); } if (rep != null) return rep; Set inds = new HashSet(); for (Atom atom: atoms) { atom.getIndividuals(inds); for (Individual i: inds) if (rep == null || ((Individual) rep).getIRI().compareTo(i.getIRI()) > 0) rep = i; inds.clear(); } return rep; } @Override public boolean isBottomRule(DLClause clause) { return clause.getHeadLength() == 1 && clause.getHeadAtom(0).getDLPredicate().equals(AtomicConcept.NOTHING); } public Atom[] getEmptyHead(Term t) { return new Atom[] {Atom.create(AtomicConcept.NOTHING, t)}; } @Override public int getBottomNumber() { return 1; } }