/* Copyright 2009 by the Oxford University Computing Laboratory
This file is part of HermiT.
HermiT is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
HermiT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with HermiT. If not, see <http://www.gnu.org/licenses/>.
*/
package org.semanticweb.HermiT.structural;
import java.util.HashSet;
import java.util.Set;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLClassExpression;
import org.semanticweb.owlapi.model.OWLClassExpressionVisitorEx;
import org.semanticweb.owlapi.model.OWLDataAllValuesFrom;
import org.semanticweb.owlapi.model.OWLDataComplementOf;
import org.semanticweb.owlapi.model.OWLDataExactCardinality;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLDataHasValue;
import org.semanticweb.owlapi.model.OWLDataIntersectionOf;
import org.semanticweb.owlapi.model.OWLDataMaxCardinality;
import org.semanticweb.owlapi.model.OWLDataMinCardinality;
import org.semanticweb.owlapi.model.OWLDataOneOf;
import org.semanticweb.owlapi.model.OWLDataRange;
import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom;
import org.semanticweb.owlapi.model.OWLDataUnionOf;
import org.semanticweb.owlapi.model.OWLDataVisitorEx;
import org.semanticweb.owlapi.model.OWLDatatype;
import org.semanticweb.owlapi.model.OWLDatatypeRestriction;
import org.semanticweb.owlapi.model.OWLFacetRestriction;
import org.semanticweb.owlapi.model.OWLLiteral;
import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom;
import org.semanticweb.owlapi.model.OWLObjectComplementOf;
import org.semanticweb.owlapi.model.OWLObjectExactCardinality;
import org.semanticweb.owlapi.model.OWLObjectHasSelf;
import org.semanticweb.owlapi.model.OWLObjectHasValue;
import org.semanticweb.owlapi.model.OWLObjectIntersectionOf;
import org.semanticweb.owlapi.model.OWLObjectMaxCardinality;
import org.semanticweb.owlapi.model.OWLObjectMinCardinality;
import org.semanticweb.owlapi.model.OWLObjectOneOf;
import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom;
import org.semanticweb.owlapi.model.OWLObjectUnionOf;
public class ExpressionManager {
protected final OWLDataFactory m_factory;
protected final DescriptionNNFVisitor m_descriptionNNFVisitor;
protected final DataRangeNNFVisitor m_dataRangeNNFVisitor;
protected final DescriptionComplementNNFVisitor m_descriptionComplementNNFVisitor;
protected final DataRangeComplementNNFVisitor m_dataRangeComplementNNFVisitor;
protected final DescriptionSimplificationVisitor m_descriptionSimplificationVisitor;
protected final DataRangeSimplificationVisitor m_dataRangeSimplificationVisitor;
public ExpressionManager(OWLDataFactory factory) {
m_factory=factory;
m_descriptionNNFVisitor=new DescriptionNNFVisitor();
m_dataRangeNNFVisitor=new DataRangeNNFVisitor();
m_descriptionComplementNNFVisitor=new DescriptionComplementNNFVisitor();
m_dataRangeComplementNNFVisitor=new DataRangeComplementNNFVisitor();
m_descriptionSimplificationVisitor=new DescriptionSimplificationVisitor();
m_dataRangeSimplificationVisitor=new DataRangeSimplificationVisitor();
}
public OWLClassExpression getNNF(OWLClassExpression description) {
return description.accept(m_descriptionNNFVisitor);
}
public OWLDataRange getNNF(OWLDataRange dataRange) {
return dataRange.accept(m_dataRangeNNFVisitor);
}
public OWLClassExpression getComplementNNF(OWLClassExpression description) {
return description.accept(m_descriptionComplementNNFVisitor);
}
public OWLDataRange getComplementNNF(OWLDataRange dataRange) {
return dataRange.accept(m_dataRangeComplementNNFVisitor);
}
public OWLClassExpression getSimplified(OWLClassExpression description) {
return description.accept(m_descriptionSimplificationVisitor);
}
public OWLDataRange getSimplified(OWLDataRange dataRange) {
return dataRange.accept(m_dataRangeSimplificationVisitor);
}
// -----------------------------------------------------------------------------------
// NNF
// -----------------------------------------------------------------------------------
protected class DescriptionNNFVisitor implements OWLClassExpressionVisitorEx<OWLClassExpression> {
public OWLClassExpression visit(OWLClass d) {
return d;
}
public OWLClassExpression visit(OWLObjectIntersectionOf d) {
Set<OWLClassExpression> newConjuncts=new HashSet<OWLClassExpression>();
for (OWLClassExpression description : d.getOperands()) {
OWLClassExpression descriptionNNF=getNNF(description);
newConjuncts.add(descriptionNNF);
}
return m_factory.getOWLObjectIntersectionOf(newConjuncts);
}
public OWLClassExpression visit(OWLObjectUnionOf d) {
Set<OWLClassExpression> newDisjuncts=new HashSet<OWLClassExpression>();
for (OWLClassExpression description : d.getOperands()) {
OWLClassExpression descriptionNNF=getNNF(description);
newDisjuncts.add(descriptionNNF);
}
return m_factory.getOWLObjectUnionOf(newDisjuncts);
}
public OWLClassExpression visit(OWLObjectComplementOf d) {
return getComplementNNF(d.getOperand());
}
public OWLClassExpression visit(OWLObjectOneOf d) {
return d;
}
public OWLClassExpression visit(OWLObjectSomeValuesFrom d) {
OWLClassExpression filler=getNNF(d.getFiller());
return m_factory.getOWLObjectSomeValuesFrom(d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLObjectAllValuesFrom d) {
OWLClassExpression filler=getNNF(d.getFiller());
return m_factory.getOWLObjectAllValuesFrom(d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLObjectHasValue d) {
return m_factory.getOWLObjectHasValue(d.getProperty().getSimplified(),d.getValue());
}
public OWLClassExpression visit(OWLObjectHasSelf d) {
return m_factory.getOWLObjectHasSelf(d.getProperty().getSimplified());
}
public OWLClassExpression visit(OWLObjectMinCardinality d) {
OWLClassExpression filler=getNNF(d.getFiller());
return m_factory.getOWLObjectMinCardinality(d.getCardinality(),d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLObjectMaxCardinality d) {
OWLClassExpression filler=getNNF(d.getFiller());
return m_factory.getOWLObjectMaxCardinality(d.getCardinality(),d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLObjectExactCardinality d) {
OWLClassExpression filler=getNNF(d.getFiller());
return m_factory.getOWLObjectExactCardinality(d.getCardinality(),d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLDataSomeValuesFrom d) {
OWLDataRange filler=getNNF(d.getFiller());
return m_factory.getOWLDataSomeValuesFrom(d.getProperty(),filler);
}
public OWLClassExpression visit(OWLDataAllValuesFrom d) {
OWLDataRange filler=getNNF(d.getFiller());
return m_factory.getOWLDataAllValuesFrom(d.getProperty(),filler);
}
public OWLClassExpression visit(OWLDataHasValue d) {
return d;
}
public OWLClassExpression visit(OWLDataMinCardinality d) {
OWLDataRange filler=getNNF(d.getFiller());
return m_factory.getOWLDataMinCardinality(d.getCardinality(),d.getProperty(),filler);
}
public OWLClassExpression visit(OWLDataMaxCardinality d) {
OWLDataRange filler=getNNF(d.getFiller());
return m_factory.getOWLDataMaxCardinality(d.getCardinality(),d.getProperty(),filler);
}
public OWLClassExpression visit(OWLDataExactCardinality d) {
OWLDataRange filler=getNNF(d.getFiller());
return m_factory.getOWLDataExactCardinality(d.getCardinality(),d.getProperty(),filler);
}
}
protected class DataRangeNNFVisitor implements OWLDataVisitorEx<OWLDataRange> {
public OWLDataRange visit(OWLDatatype o) {
return o;
}
public OWLDataRange visit(OWLDataComplementOf o) {
return getComplementNNF(o.getDataRange());
}
public OWLDataRange visit(OWLDataOneOf o) {
return o;
}
public OWLDataRange visit(OWLDataRange o) {
return o;
}
public OWLDataRange visit(OWLDatatypeRestriction o) {
return o;
}
public OWLDataRange visit(OWLFacetRestriction node) {
return null;
}
public OWLDataRange visit(OWLLiteral o) {
return null;
}
public OWLDataRange visit(OWLDataIntersectionOf range) {
Set<OWLDataRange> newConjuncts=new HashSet<OWLDataRange>();
for (OWLDataRange dr : range.getOperands())
newConjuncts.add(getNNF(dr));
return m_factory.getOWLDataIntersectionOf(newConjuncts);
}
public OWLDataRange visit(OWLDataUnionOf range) {
Set<OWLDataRange> newDisjuncts=new HashSet<OWLDataRange>();
for (OWLDataRange dr : range.getOperands())
newDisjuncts.add(getNNF(dr));
return m_factory.getOWLDataUnionOf(newDisjuncts);
}
}
// -----------------------------------------------------------------------------------
// Complement NNF
// -----------------------------------------------------------------------------------
protected class DescriptionComplementNNFVisitor implements OWLClassExpressionVisitorEx<OWLClassExpression> {
public OWLClassExpression visit(OWLClass d) {
if (d.isOWLThing())
return m_factory.getOWLNothing();
if (d.isOWLNothing())
return m_factory.getOWLThing();
return m_factory.getOWLObjectComplementOf(d);
}
public OWLClassExpression visit(OWLObjectIntersectionOf d) {
Set<OWLClassExpression> newDisjuncts=new HashSet<OWLClassExpression>();
for (OWLClassExpression description : d.getOperands())
newDisjuncts.add(getComplementNNF(description));
return m_factory.getOWLObjectUnionOf(newDisjuncts);
}
public OWLClassExpression visit(OWLObjectUnionOf d) {
Set<OWLClassExpression> newConjuncts=new HashSet<OWLClassExpression>();
for (OWLClassExpression description : d.getOperands())
newConjuncts.add(getComplementNNF(description));
return m_factory.getOWLObjectIntersectionOf(newConjuncts);
}
public OWLClassExpression visit(OWLObjectComplementOf d) {
return getNNF(d.getOperand());
}
public OWLClassExpression visit(OWLObjectOneOf d) {
return m_factory.getOWLObjectComplementOf(d);
}
public OWLClassExpression visit(OWLObjectSomeValuesFrom d) {
OWLClassExpression filler=getComplementNNF(d.getFiller());
return m_factory.getOWLObjectAllValuesFrom(d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLObjectAllValuesFrom d) {
OWLClassExpression filler=getComplementNNF(d.getFiller());
return m_factory.getOWLObjectSomeValuesFrom(d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLObjectHasValue d) {
return m_factory.getOWLObjectComplementOf(getNNF(d));
}
public OWLClassExpression visit(OWLObjectHasSelf d) {
return m_factory.getOWLObjectComplementOf(getNNF(d));
}
public OWLClassExpression visit(OWLObjectMinCardinality d) {
if (d.getCardinality()==0)
return m_factory.getOWLNothing();
else {
OWLClassExpression filler=getNNF(d.getFiller());
return m_factory.getOWLObjectMaxCardinality(d.getCardinality()-1,d.getProperty().getSimplified(),filler);
}
}
public OWLClassExpression visit(OWLObjectMaxCardinality d) {
OWLClassExpression filler=getNNF(d.getFiller());
return m_factory.getOWLObjectMinCardinality(d.getCardinality()+1,d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLObjectExactCardinality d) {
OWLClassExpression filler=getNNF(d.getFiller());
if (d.getCardinality()==0)
return m_factory.getOWLObjectMinCardinality(1,d.getProperty().getSimplified(),filler);
else {
Set<OWLClassExpression> disjuncts=new HashSet<OWLClassExpression>();
disjuncts.add(m_factory.getOWLObjectMaxCardinality(d.getCardinality()-1,d.getProperty().getSimplified(),filler));
disjuncts.add(m_factory.getOWLObjectMinCardinality(d.getCardinality()+1,d.getProperty().getSimplified(),filler));
return m_factory.getOWLObjectUnionOf(disjuncts);
}
}
public OWLClassExpression visit(OWLDataSomeValuesFrom d) {
OWLDataRange filler=getComplementNNF(d.getFiller());
return m_factory.getOWLDataAllValuesFrom(d.getProperty(),filler);
}
public OWLClassExpression visit(OWLDataAllValuesFrom d) {
OWLDataRange filler=getComplementNNF(d.getFiller());
return m_factory.getOWLDataSomeValuesFrom(d.getProperty(),filler);
}
public OWLClassExpression visit(OWLDataHasValue d) {
return m_factory.getOWLObjectComplementOf(d);
}
public OWLClassExpression visit(OWLDataMinCardinality d) {
if (d.getCardinality()==0)
return m_factory.getOWLNothing();
else {
OWLDataRange filler=getNNF(d.getFiller());
return m_factory.getOWLDataMaxCardinality(d.getCardinality()-1,d.getProperty(),filler);
}
}
public OWLClassExpression visit(OWLDataMaxCardinality d) {
OWLDataRange filler=getNNF(d.getFiller());
return m_factory.getOWLDataMinCardinality(d.getCardinality()+1,d.getProperty(),filler);
}
public OWLClassExpression visit(OWLDataExactCardinality d) {
OWLDataRange filler=getNNF(d.getFiller());
if (d.getCardinality()==0)
return m_factory.getOWLDataMinCardinality(1,d.getProperty(),filler);
else {
Set<OWLClassExpression> disjuncts=new HashSet<OWLClassExpression>();
disjuncts.add(m_factory.getOWLDataMaxCardinality(d.getCardinality()-1,d.getProperty(),filler));
disjuncts.add(m_factory.getOWLDataMinCardinality(d.getCardinality()+1,d.getProperty(),filler));
return m_factory.getOWLObjectUnionOf(disjuncts);
}
}
}
protected class DataRangeComplementNNFVisitor implements OWLDataVisitorEx<OWLDataRange> {
public OWLDataRange visit(OWLDatatype o) {
return m_factory.getOWLDataComplementOf(o);
}
public OWLDataRange visit(OWLDataComplementOf o) {
return getNNF(o.getDataRange());
}
public OWLDataRange visit(OWLDataOneOf o) {
return m_factory.getOWLDataComplementOf(o);
}
public OWLDataRange visit(OWLDatatypeRestriction o) {
return m_factory.getOWLDataComplementOf(o);
}
public OWLDataRange visit(OWLFacetRestriction o) {
return null;
}
public OWLDataRange visit(OWLLiteral o) {
return null;
}
public OWLDataRange visit(OWLDataIntersectionOf range) {
Set<OWLDataRange> newDisjuncts=new HashSet<OWLDataRange>();
for (OWLDataRange dr : range.getOperands())
newDisjuncts.add(getComplementNNF(dr));
return m_factory.getOWLDataUnionOf(newDisjuncts);
}
public OWLDataRange visit(OWLDataUnionOf range) {
Set<OWLDataRange> newConjuncts=new HashSet<OWLDataRange>();
for (OWLDataRange dr : range.getOperands())
newConjuncts.add(getComplementNNF(dr));
return m_factory.getOWLDataIntersectionOf(newConjuncts);
}
}
// -----------------------------------------------------------------------------------
// Simplification
// -----------------------------------------------------------------------------------
protected class DescriptionSimplificationVisitor implements OWLClassExpressionVisitorEx<OWLClassExpression> {
public OWLClassExpression visit(OWLClass d) {
return d;
}
public OWLClassExpression visit(OWLObjectIntersectionOf d) {
Set<OWLClassExpression> newConjuncts=new HashSet<OWLClassExpression>();
for (OWLClassExpression description : d.getOperands()) {
OWLClassExpression descriptionSimplified=getSimplified(description);
if (descriptionSimplified.isOWLThing())
continue;
else if (descriptionSimplified.isOWLNothing())
return m_factory.getOWLNothing();
else if (descriptionSimplified instanceof OWLObjectIntersectionOf)
newConjuncts.addAll(((OWLObjectIntersectionOf)descriptionSimplified).getOperands());
else
newConjuncts.add(descriptionSimplified);
}
return m_factory.getOWLObjectIntersectionOf(newConjuncts);
}
public OWLClassExpression visit(OWLObjectUnionOf d) {
Set<OWLClassExpression> newDisjuncts=new HashSet<OWLClassExpression>();
for (OWLClassExpression description : d.getOperands()) {
OWLClassExpression descriptionSimplified=getSimplified(description);
if (descriptionSimplified.isOWLThing())
return m_factory.getOWLThing();
else if (descriptionSimplified.isOWLNothing())
continue;
else if (descriptionSimplified instanceof OWLObjectUnionOf)
newDisjuncts.addAll(((OWLObjectUnionOf)descriptionSimplified).getOperands());
else
newDisjuncts.add(descriptionSimplified);
}
return m_factory.getOWLObjectUnionOf(newDisjuncts);
}
public OWLClassExpression visit(OWLObjectComplementOf d) {
OWLClassExpression operandSimplified=getSimplified(d.getOperand());
if (operandSimplified.isOWLThing())
return m_factory.getOWLNothing();
else if (operandSimplified.isOWLNothing())
return m_factory.getOWLThing();
else if (operandSimplified instanceof OWLObjectComplementOf)
return ((OWLObjectComplementOf)operandSimplified).getOperand();
else
return m_factory.getOWLObjectComplementOf(operandSimplified);
}
public OWLClassExpression visit(OWLObjectOneOf d) {
return d;
}
public OWLClassExpression visit(OWLObjectSomeValuesFrom d) {
OWLClassExpression filler=getSimplified(d.getFiller());
if (filler.isOWLNothing())
return m_factory.getOWLNothing();
else
return m_factory.getOWLObjectSomeValuesFrom(d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLObjectAllValuesFrom d) {
OWLClassExpression filler=getSimplified(d.getFiller());
if (filler.isOWLThing())
return m_factory.getOWLThing();
else
return m_factory.getOWLObjectAllValuesFrom(d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLObjectHasValue d) {
OWLObjectOneOf nominal=m_factory.getOWLObjectOneOf(d.getValue());
return m_factory.getOWLObjectSomeValuesFrom(d.getProperty().getSimplified(),nominal);
}
public OWLClassExpression visit(OWLObjectHasSelf d) {
return m_factory.getOWLObjectHasSelf(d.getProperty().getSimplified());
}
public OWLClassExpression visit(OWLObjectMinCardinality d) {
OWLClassExpression filler=getSimplified(d.getFiller());
if (d.getCardinality()<=0)
return m_factory.getOWLThing();
else if (filler.isOWLNothing())
return m_factory.getOWLNothing();
else if (d.getCardinality()==1)
return m_factory.getOWLObjectSomeValuesFrom(d.getProperty().getSimplified(),filler);
else
return m_factory.getOWLObjectMinCardinality(d.getCardinality(),d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLObjectMaxCardinality d) {
OWLClassExpression filler=getSimplified(d.getFiller());
if (filler.isOWLNothing())
return m_factory.getOWLThing();
else if (d.getCardinality()<=0)
return m_factory.getOWLObjectAllValuesFrom(d.getProperty().getSimplified(),m_factory.getOWLObjectComplementOf(filler));
else
return m_factory.getOWLObjectMaxCardinality(d.getCardinality(),d.getProperty().getSimplified(),filler);
}
public OWLClassExpression visit(OWLObjectExactCardinality d) {
OWLClassExpression filler=getSimplified(d.getFiller());
if (d.getCardinality()<0)
return m_factory.getOWLNothing();
else if (d.getCardinality()==0)
return m_factory.getOWLObjectAllValuesFrom(d.getProperty().getSimplified(),m_factory.getOWLObjectComplementOf(filler));
else if (filler.isOWLNothing())
return m_factory.getOWLNothing();
else {
OWLObjectMinCardinality minCardinality=m_factory.getOWLObjectMinCardinality(d.getCardinality(),d.getProperty().getSimplified(),filler);
OWLObjectMaxCardinality maxCardinality=m_factory.getOWLObjectMaxCardinality(d.getCardinality(),d.getProperty().getSimplified(),filler);
return m_factory.getOWLObjectIntersectionOf(minCardinality,maxCardinality);
}
}
public OWLClassExpression visit(OWLDataSomeValuesFrom d) {
OWLDataRange filler=getSimplified(d.getFiller());
if (isBottomDataRange(filler))
return m_factory.getOWLNothing();
else
return m_factory.getOWLDataSomeValuesFrom(d.getProperty(),filler);
}
public OWLClassExpression visit(OWLDataAllValuesFrom d) {
OWLDataRange filler=getSimplified(d.getFiller());
if (filler.isTopDatatype())
return m_factory.getOWLThing();
else
return m_factory.getOWLDataAllValuesFrom(d.getProperty(),filler);
}
public OWLClassExpression visit(OWLDataHasValue d) {
OWLDataOneOf nominal=m_factory.getOWLDataOneOf(d.getValue());
return m_factory.getOWLDataSomeValuesFrom(d.getProperty(),nominal);
}
public OWLClassExpression visit(OWLDataMinCardinality d) {
OWLDataRange filler=getSimplified(d.getFiller());
if (d.getCardinality()<=0)
return m_factory.getOWLThing();
else if (isBottomDataRange(filler))
return m_factory.getOWLNothing();
else if (d.getCardinality()==1)
return m_factory.getOWLDataSomeValuesFrom(d.getProperty(),filler);
else
return m_factory.getOWLDataMinCardinality(d.getCardinality(),d.getProperty(),filler);
}
public OWLClassExpression visit(OWLDataMaxCardinality d) {
OWLDataRange filler=getSimplified(d.getFiller());
if (isBottomDataRange(filler))
return m_factory.getOWLThing();
else if (d.getCardinality()<=0)
return m_factory.getOWLDataAllValuesFrom(d.getProperty(),m_factory.getOWLDataComplementOf(filler));
else
return m_factory.getOWLDataMaxCardinality(d.getCardinality(),d.getProperty(),filler);
}
public OWLClassExpression visit(OWLDataExactCardinality d) {
OWLDataRange filler=getSimplified(d.getFiller());
if (d.getCardinality()<0)
return m_factory.getOWLNothing();
else if (d.getCardinality()==0)
return m_factory.getOWLDataAllValuesFrom(d.getProperty(),m_factory.getOWLDataComplementOf(filler));
else if (isBottomDataRange(filler))
return m_factory.getOWLNothing();
else {
OWLDataMinCardinality minCardinality=m_factory.getOWLDataMinCardinality(d.getCardinality(),d.getProperty(),filler);
OWLDataMaxCardinality maxCardinality=m_factory.getOWLDataMaxCardinality(d.getCardinality(),d.getProperty(),filler);
return m_factory.getOWLObjectIntersectionOf(minCardinality,maxCardinality);
}
}
protected boolean isBottomDataRange(OWLDataRange dataRange) {
return dataRange instanceof OWLDataComplementOf && ((OWLDataComplementOf)dataRange).getDataRange().isTopDatatype();
}
}
protected class DataRangeSimplificationVisitor implements OWLDataVisitorEx<OWLDataRange> {
public OWLDataRange visit(OWLDatatype o) {
return o;
}
public OWLDataRange visit(OWLDataComplementOf o) {
OWLDataRange dataRangeSimplified=getSimplified(o.getDataRange());
if (dataRangeSimplified instanceof OWLDataComplementOf)
return ((OWLDataComplementOf)dataRangeSimplified).getDataRange();
else
return m_factory.getOWLDataComplementOf(dataRangeSimplified);
}
public OWLDataRange visit(OWLDataOneOf o) {
return o;
}
public OWLDataRange visit(OWLDatatypeRestriction o) {
return o;
}
public OWLDataRange visit(OWLFacetRestriction o) {
return null;
}
public OWLDataRange visit(OWLLiteral o) {
return null;
}
public OWLDataRange visit(OWLDataIntersectionOf range) {
Set<OWLDataRange> newConjuncts=new HashSet<OWLDataRange>();
for (OWLDataRange dr : range.getOperands()) {
OWLDataRange drSimplified=getSimplified(dr);
if (drSimplified.isTopDatatype())
continue;
else if (drSimplified instanceof OWLDataIntersectionOf)
newConjuncts.addAll(((OWLDataIntersectionOf)drSimplified).getOperands());
else
newConjuncts.add(drSimplified);
}
return m_factory.getOWLDataIntersectionOf(newConjuncts);
}
public OWLDataRange visit(OWLDataUnionOf range) {
Set<OWLDataRange> newDisjuncts=new HashSet<OWLDataRange>();
for (OWLDataRange dr : range.getOperands()) {
OWLDataRange drSimplified=getSimplified(dr);
if (drSimplified.isTopDatatype())
return m_factory.getTopDatatype();
else if (drSimplified instanceof OWLDataUnionOf)
newDisjuncts.addAll(((OWLDataUnionOf)drSimplified).getOperands());
else
newDisjuncts.add(drSimplified);
}
return m_factory.getOWLDataUnionOf(newDisjuncts);
}
}
}