package org.semanticweb.HermiT.tableau;
import org.semanticweb.HermiT.Prefixes;
import org.semanticweb.HermiT.model.Concept;
import org.semanticweb.HermiT.model.DLPredicate;
import org.semanticweb.HermiT.model.Role;
import org.semanticweb.HermiT.model.Term;
public class ReasoningTaskDescription {
public static enum StandardTestType {
CONCEPT_SATISFIABILITY("satisfiability of concept '{0}'"),
CONSISTENCY("ABox satisfiability"),
CONCEPT_SUBSUMPTION("concept subsumption '{0}' => '{1}'"),
OBJECT_ROLE_SATISFIABILITY("satisfiability of object role '{0}'"),
DATA_ROLE_SATISFIABILITY("satisfiability of data role '{0}'"),
OBJECT_ROLE_SUBSUMPTION("object role subsumption '{0}' => '{1}'"),
DATA_ROLE_SUBSUMPTION("data role subsumption '{0}' => '{1}'"),
INSTANCE_OF("class instance '{0}'('{1}')"),
OBJECT_ROLE_INSTANCE_OF("object role instance '{0}'('{1}', '{2}')"),
DATA_ROLE_INSTANCE_OF("data role instance '{0}'('{1}', '{2}')"),
ENTAILMENT("entailment of '{0}'"),
DOMAIN("check if {0} is domain of {1}"),
RANGE("check if {0} is range of {1}");
public final String messagePattern;
StandardTestType(String messagePattern) {
this.messagePattern=messagePattern;
}
}
protected final boolean m_flipSatisfiabilityResult;
protected final String m_messagePattern;
protected final Object[] m_arguments;
public ReasoningTaskDescription(boolean flipSatisfiabilityResult,StandardTestType testType,Object... arguments) {
this(flipSatisfiabilityResult,testType.messagePattern,arguments);
}
public ReasoningTaskDescription(boolean flipSatisfiabilityResult,String message,Object... arguments) {
m_flipSatisfiabilityResult=flipSatisfiabilityResult;
m_messagePattern=message;
m_arguments=arguments;
}
public boolean flipSatisfiabilityResult() {
return m_flipSatisfiabilityResult;
}
public String getTaskDescription(Prefixes prefixes) {
String result=m_messagePattern;
for (int argumentIndex=0;argumentIndex<m_arguments.length;argumentIndex++) {
Object argument=m_arguments[argumentIndex];
String argumentString;
if (argument instanceof DLPredicate)
argumentString=((DLPredicate)argument).toString(prefixes);
else if (argument instanceof Role)
argumentString=((Role)argument).toString(prefixes);
else if (argument instanceof Concept)
argumentString=((Concept)argument).toString(prefixes);
else if (argument instanceof Term)
argumentString=((Term)argument).toString(prefixes);
else
argumentString=argument.toString();
result=result.replace("{"+argumentIndex+"}",argumentString);
}
return result;
}
public String getMessagePattern() {
return m_messagePattern;
}
public String toString() {
return getTaskDescription(Prefixes.STANDARD_PREFIXES);
}
public static ReasoningTaskDescription isABoxSatisfiable() {
return new ReasoningTaskDescription(false,StandardTestType.CONSISTENCY);
}
public static ReasoningTaskDescription isConceptSatisfiable(Object atomicConcept) {
return new ReasoningTaskDescription(false,StandardTestType.CONCEPT_SATISFIABILITY,atomicConcept);
}
public static ReasoningTaskDescription isConceptSubsumedBy(Object atomicSubconcept,Object atomicSuperconcept) {
return new ReasoningTaskDescription(true,StandardTestType.CONCEPT_SUBSUMPTION,atomicSubconcept,atomicSuperconcept);
}
public static ReasoningTaskDescription isConceptSubsumedByList(Object atomicSubconcept,Object... atomicSuperconcepts) {
StringBuffer message=new StringBuffer();
message.append("satisiability of concept '{0}' ");
for (int index=0;index<atomicSuperconcepts.length;index++) {
message.append(" and not({");
message.append(index+1);
message.append("})");
}
Object[] arguments=new Object[atomicSuperconcepts.length+1];
arguments[0]=atomicSubconcept;
System.arraycopy(atomicSuperconcepts,0,arguments,1,atomicSuperconcepts.length);
return new ReasoningTaskDescription(false,message.toString(),arguments);
}
public static ReasoningTaskDescription isRoleSubsumedByList(Object subrole,Object... superroles) {
StringBuffer message=new StringBuffer();
message.append("satisiability of role '{0}' ");
for (int index=0;index<superroles.length;index++) {
message.append(" and not({");
message.append(index+1);
message.append("})");
}
Object[] arguments=new Object[superroles.length+1];
arguments[0]=subrole;
System.arraycopy(superroles,0,arguments,1,superroles.length);
return new ReasoningTaskDescription(false,message.toString(),arguments);
}
public static ReasoningTaskDescription isRoleSatisfiable(Object role,boolean isObjectRole) {
return new ReasoningTaskDescription(false,(isObjectRole ? StandardTestType.OBJECT_ROLE_SATISFIABILITY : StandardTestType.DATA_ROLE_SATISFIABILITY),role);
}
public static ReasoningTaskDescription isRoleSubsumedBy(Object subrole,Object superrole,boolean isObjectRole) {
return new ReasoningTaskDescription(true,(isObjectRole ? StandardTestType.OBJECT_ROLE_SUBSUMPTION : StandardTestType.DATA_ROLE_SUBSUMPTION),subrole,superrole);
}
public static ReasoningTaskDescription isInstanceOf(Object atomicConcept,Object individual) {
return new ReasoningTaskDescription(true,StandardTestType.INSTANCE_OF,atomicConcept,individual);
}
public static ReasoningTaskDescription isObjectRoleInstanceOf(Object atomicRole,Object individual1,Object individual2) {
return new ReasoningTaskDescription(true,StandardTestType.OBJECT_ROLE_INSTANCE_OF,atomicRole,individual1,individual2);
}
public static ReasoningTaskDescription isDataRoleInstanceOf(Object atomicRole,Object individual1,Object individual2) {
return new ReasoningTaskDescription(true,StandardTestType.DATA_ROLE_INSTANCE_OF,atomicRole,individual1,individual2);
}
public static ReasoningTaskDescription isAxiomEntailed(Object axiom) {
return new ReasoningTaskDescription(true,StandardTestType.ENTAILMENT,axiom);
}
public static ReasoningTaskDescription isDomainOf(Object domain,Object role) {
return new ReasoningTaskDescription(true,StandardTestType.DOMAIN,domain,role);
}
public static ReasoningTaskDescription isRangeOf(Object range,Object role) {
return new ReasoningTaskDescription(true,StandardTestType.RANGE,range,role);
}
}