package uk.ac.manchester.cs.jfact.kernel; /* This file is part of the JFact DL reasoner Copyright 2011-2013 by Ignazio Palmisano, Dmitry Tsarkov, University of Manchester This library 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 2.1 of the License, or (at your option) any later version. This library 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 this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA*/ import java.io.Serializable; import java.util.ArrayList; import java.util.List; import uk.ac.manchester.cs.jfact.helpers.DLVertex; import uk.ac.manchester.cs.jfact.helpers.Helper; import uk.ac.manchester.cs.jfact.helpers.UnreachableSituationException; import uk.ac.manchester.cs.jfact.kernel.dl.interfaces.ConceptExpression; import uk.ac.manchester.cs.jfact.kernel.dl.interfaces.DataExpression; import uk.ac.manchester.cs.jfact.kernel.dl.interfaces.Expression; import uk.ac.manchester.cs.jfact.kernel.dl.interfaces.RoleExpression; import conformance.Original; import conformance.PortedFrom; /** class to translate DAG entities into the TDL* expressions */ @PortedFrom(file = "tDag2Interface.h", name = "TDag2Interface") public class TDag2Interface implements Serializable { private static final long serialVersionUID = 11000L; /** DAG to be translated */ @PortedFrom(file = "tDag2Interface.h", name = "Dag") private final DLDag Dag; /** expression manager */ @PortedFrom(file = "tDag2Interface.h", name = "Manager") private final ExpressionManager Manager; /** vector of cached expressions */ @PortedFrom(file = "tDag2Interface.h", name = "TransC") private final List<ConceptExpression> TransConcept = new ArrayList<ConceptExpression>(); @PortedFrom(file = "tDag2Interface.h", name = "TransD") private final List<DataExpression> TransData = new ArrayList<DataExpression>(); /** * @param v * v * @return build concept expression by a vertex V */ @PortedFrom(file = "tDag2Interface.h", name = "buildCExpr") public ConceptExpression buildCExpr(DLVertex v) { switch (v.getType()) { case dtTop: return Manager.top(); case dtNConcept: case dtPConcept: return Manager.concept(v.getConcept().getName()); case dtPSingleton: case dtNSingleton: return Manager.oneOf(Manager.individual(v.getConcept() .getName())); case dtAnd: case dtCollection: List<ConceptExpression> list = new ArrayList<ConceptExpression>(); for (int p : v.begin()) { list.add(getCExpr(p)); } return Manager.and(list); case dtForall: if (v.getRole().isDataRole()) { return Manager.forall( Manager.dataRole(v.getRole().getName()), getDExpr(v.getConceptIndex())); } else { return Manager.forall( Manager.objectRole(v.getRole().getName()), getCExpr(v.getConceptIndex())); } case dtLE: if (v.getRole().isDataRole()) { return Manager.maxCardinality(v.getNumberLE(), Manager.dataRole(v.getRole().getName()), getDExpr(v.getConceptIndex())); } else { return Manager.maxCardinality(v.getNumberLE(), Manager.objectRole(v.getRole().getName()), getCExpr(v.getConceptIndex())); } case dtIrr: return Manager.not(Manager.selfReference(Manager.objectRole(v .getRole().getName()))); case dtProj: case dtNN: case dtChoose: case dtSplitConcept: // these are artificial constructions and shouldn't be visible return Manager.top(); default: throw new UnreachableSituationException(); } } /** * @param v * v * @return build data expression by a vertex V */ @PortedFrom(file = "tDag2Interface.h", name = "buildDExpr") public DataExpression buildDExpr(DLVertex v) { switch (v.getType()) { case dtTop: return Manager.dataTop(); case dtDataType: case dtDataValue: case dtDataExpr: // TODO: no data stuff yet return Manager.dataTop(); case dtAnd: case dtCollection: List<DataExpression> list = new ArrayList<DataExpression>(); for (int p : v.begin()) { list.add(getDExpr(p)); } return Manager.dataAnd(list); default: throw new UnreachableSituationException(); } } /** * init c'tor * * @param dag * dag * @param manager * manager */ public TDag2Interface(DLDag dag, ExpressionManager manager) { Dag = dag; Manager = manager; Helper.resize(TransConcept, dag.size()); Helper.resize(TransData, dag.size()); } /** * @param r * r * @return data role expression */ @Original public RoleExpression getDataRoleExpression(Role r) { return Manager.dataRole(r.getName()); } /** * @param r * r * @return object role expression */ @Original public RoleExpression getObjectRoleExpression(Role r) { return Manager.objectRole(r.getName()); } /** make sure that size of expression cache is the same as the size of a DAG */ @PortedFrom(file = "tDag2Interface.h", name = "ensureDagSize") public void ensureDagSize() { int ds = Dag.size(), ts = TransConcept.size(); if (ds == ts) { return; } Helper.resize(TransConcept, ds); Helper.resize(TransData, ds); } /** * @param p * p * @return concept expression corresponding index of vertex */ @PortedFrom(file = "tDag2Interface.h", name = "getCExpr") public ConceptExpression getCExpr(int p) { if (p < 0) { return Manager.not(getCExpr(-p)); } if (TransConcept.get(p) == null) { TransConcept.set(p, buildCExpr(Dag.get(p))); } return TransConcept.get(p); } /** * @param p * p * @return data expression corresponding index of vertex */ @PortedFrom(file = "tDag2Interface.h", name = "getDExpr") public DataExpression getDExpr(int p) { if (p < 0) { return Manager.dataNot(getDExpr(-p)); } DataExpression expression = TransData.get(p); if (expression == null) { expression = buildDExpr(Dag.get(p)); TransData.set(p, expression); } return expression; } /** * @param p * p * @param data * data * @return expression */ @PortedFrom(file = "tDag2Interface.h", name = "getExpr") public Expression getExpr(int p, boolean data) { if (data) { return getDExpr(p); } else { return getCExpr(p); } } }