/* Copyright 2008, 2009, 2010 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 org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLClassAssertionAxiom;
import org.semanticweb.owlapi.model.OWLClassExpression;
import org.semanticweb.owlapi.model.OWLClassExpressionVisitor;
import org.semanticweb.owlapi.model.OWLDataAllValuesFrom;
import org.semanticweb.owlapi.model.OWLDataExactCardinality;
import org.semanticweb.owlapi.model.OWLDataHasValue;
import org.semanticweb.owlapi.model.OWLDataMaxCardinality;
import org.semanticweb.owlapi.model.OWLDataMinCardinality;
import org.semanticweb.owlapi.model.OWLDataPropertyAssertionAxiom;
import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom;
import org.semanticweb.owlapi.model.OWLIndividualAxiom;
import org.semanticweb.owlapi.model.OWLNegativeObjectPropertyAssertionAxiom;
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.OWLObjectPropertyAssertionAxiom;
import org.semanticweb.owlapi.model.OWLObjectPropertyExpression;
import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom;
import org.semanticweb.owlapi.model.OWLObjectUnionOf;
import org.semanticweb.owlapi.util.OWLAxiomVisitorAdapter;
public class OWLAxiomsExpressivity extends OWLAxiomVisitorAdapter implements OWLClassExpressionVisitor {
public boolean m_hasAtMostRestrictions;
public boolean m_hasInverseRoles;
public boolean m_hasNominals;
public boolean m_hasDatatypes;
public boolean m_hasSWRLRules;
public OWLAxiomsExpressivity(OWLAxioms axioms) {
for (OWLClassExpression[] inclusion : axioms.m_conceptInclusions)
for (OWLClassExpression description : inclusion)
description.accept(this);
for (OWLObjectPropertyExpression[] inclusion : axioms.m_simpleObjectPropertyInclusions) {
visitProperty(inclusion[0]);
visitProperty(inclusion[1]);
}
for (OWLAxioms.ComplexObjectPropertyInclusion inclusion : axioms.m_complexObjectPropertyInclusions) {
for (OWLObjectPropertyExpression subObjectProperty : inclusion.m_subObjectProperties)
visitProperty(subObjectProperty);
visitProperty(inclusion.m_superObjectProperty);
}
for (OWLObjectPropertyExpression[] disjoint : axioms.m_disjointObjectProperties)
for (int index=0;index<disjoint.length;index++)
visitProperty(disjoint[index]);
for (OWLObjectPropertyExpression property : axioms.m_reflexiveObjectProperties)
visitProperty(property);
for (OWLObjectPropertyExpression property : axioms.m_irreflexiveObjectProperties)
visitProperty(property);
for (OWLObjectPropertyExpression property : axioms.m_asymmetricObjectProperties)
visitProperty(property);
if (!axioms.m_dataProperties.isEmpty()
|| !axioms.m_disjointDataProperties.isEmpty()
|| !axioms.m_dataPropertyInclusions.isEmpty()
|| !axioms.m_dataRangeInclusions.isEmpty()
|| !axioms.m_definedDatatypesIRIs.isEmpty())
m_hasDatatypes=true;
for (OWLIndividualAxiom fact : axioms.m_facts)
fact.accept(this);
m_hasSWRLRules=!axioms.m_rules.isEmpty();
}
protected void visitProperty(OWLObjectPropertyExpression object) {
if (object.getSimplified().isAnonymous())
m_hasInverseRoles=true;
}
public void visit(OWLClass desc) {
}
public void visit(OWLObjectComplementOf object) {
object.getOperand().accept(this);
}
public void visit(OWLObjectIntersectionOf object) {
for (OWLClassExpression description : object.getOperands())
description.accept(this);
}
public void visit(OWLObjectUnionOf object) {
for (OWLClassExpression description : object.getOperands())
description.accept(this);
}
public void visit(OWLObjectOneOf object) {
m_hasNominals=true;
}
public void visit(OWLObjectSomeValuesFrom object) {
visitProperty(object.getProperty());
object.getFiller().accept(this);
}
public void visit(OWLObjectHasValue object) {
m_hasNominals=true;
visitProperty(object.getProperty());
}
public void visit(OWLObjectHasSelf object) {
visitProperty(object.getProperty());
}
public void visit(OWLObjectAllValuesFrom object) {
visitProperty(object.getProperty());
object.getFiller().accept(this);
}
public void visit(OWLObjectMinCardinality object) {
visitProperty(object.getProperty());
object.getFiller().accept(this);
}
public void visit(OWLObjectMaxCardinality object) {
m_hasAtMostRestrictions=true;
visitProperty(object.getProperty());
object.getFiller().accept(this);
}
public void visit(OWLObjectExactCardinality object) {
m_hasAtMostRestrictions=true;
visitProperty(object.getProperty());
object.getFiller().accept(this);
}
public void visit(OWLDataHasValue object) {
m_hasDatatypes=true;
}
public void visit(OWLDataSomeValuesFrom object) {
m_hasDatatypes=true;
}
public void visit(OWLDataAllValuesFrom object) {
m_hasDatatypes=true;
}
public void visit(OWLDataMinCardinality object) {
m_hasDatatypes=true;
}
public void visit(OWLDataMaxCardinality object) {
m_hasDatatypes=true;
}
public void visit(OWLDataExactCardinality object) {
m_hasDatatypes=true;
}
public void visit(OWLClassAssertionAxiom object) {
object.getClassExpression().accept(OWLAxiomsExpressivity.this);
}
public void visit(OWLObjectPropertyAssertionAxiom object) {
visitProperty(object.getProperty());
}
public void visit(OWLNegativeObjectPropertyAssertionAxiom object) {
visitProperty(object.getProperty());
}
public void visit(OWLDataPropertyAssertionAxiom object) {
m_hasDatatypes=true;
}
}