package org.semanticweb.HermiT.tableau;
import java.util.Collections;
import java.util.HashMap;
import java.util.Set;
import org.semanticweb.HermiT.blocking.AnywhereBlocking;
import org.semanticweb.HermiT.blocking.BlockingSignatureCache;
import org.semanticweb.HermiT.blocking.BlockingStrategy;
import org.semanticweb.HermiT.blocking.DirectBlockingChecker;
import org.semanticweb.HermiT.blocking.PairWiseDirectBlockingChecker;
import org.semanticweb.HermiT.existentials.CreationOrderStrategy;
import org.semanticweb.HermiT.existentials.ExistentialExpansionStrategy;
import org.semanticweb.HermiT.model.AtLeastConcept;
import org.semanticweb.HermiT.model.Atom;
import org.semanticweb.HermiT.model.AtomicConcept;
import org.semanticweb.HermiT.model.AtomicNegationConcept;
import org.semanticweb.HermiT.model.AtomicRole;
import org.semanticweb.HermiT.model.Concept;
import org.semanticweb.HermiT.model.DLClause;
import org.semanticweb.HermiT.model.DLOntology;
import org.semanticweb.HermiT.model.Equality;
import org.semanticweb.HermiT.model.Inequality;
import org.semanticweb.HermiT.model.Variable;
public class MergeTest extends AbstractReasonerInternalsTest {
protected static final AtomicConcept A=AtomicConcept.create("A");
protected static final AtomicConcept B=AtomicConcept.create("B");
protected static final AtomicConcept C=AtomicConcept.create("C");
protected static final AtomicConcept D=AtomicConcept.create("D");
protected static final AtomicRole R=AtomicRole.create("R");
protected static final AtomicNegationConcept NEG_A=AtomicNegationConcept.create(A);
protected static final AtLeastConcept EXISTS_NEG_A=AtLeastConcept.create(1,R,NEG_A);
protected static final DLOntology TEST_DL_ONTOLOGY;
static {
Variable X=Variable.create("X");
Variable Y=Variable.create("Y");
DLClause cl=DLClause.create(new Atom[] { Atom.create(EXISTS_NEG_A,X) },new Atom[] { Atom.create(R,X,Y),Atom.create(A,Y) });
Set<DLClause> dlClauses=Collections.singleton(cl);
TEST_DL_ONTOLOGY=getTestDLOntology(dlClauses);
}
protected Tableau m_tableau;
protected ExtensionManager m_extensionManager;
public MergeTest(String name) {
super(name);
}
protected void setUp() {
DirectBlockingChecker directBlockingChecker=new PairWiseDirectBlockingChecker();
BlockingSignatureCache blockingSignatureCache=new BlockingSignatureCache(directBlockingChecker);
BlockingStrategy blockingStrategy=new AnywhereBlocking(directBlockingChecker,blockingSignatureCache);
ExistentialExpansionStrategy ExpansionStrategy=new CreationOrderStrategy(blockingStrategy);
m_tableau=new Tableau(new InterruptFlag(-1),null,ExpansionStrategy,false,TEST_DL_ONTOLOGY,null,new HashMap<String,Object>());
m_extensionManager=m_tableau.getExtensionManager();
}
public void testMergeAndBacktrack() {
DependencySet emptySet=m_tableau.getDependencySetFactory().emptySet();
Node a=m_tableau.createNewNINode(emptySet);
Node b=m_tableau.createNewNINode(emptySet);
Node a1=m_tableau.createNewTreeNode(emptySet,a);
Node a2=m_tableau.createNewTreeNode(emptySet,a);
Node a11=m_tableau.createNewTreeNode(emptySet,a1);
Node a12=m_tableau.createNewTreeNode(emptySet,a1);
m_extensionManager.addAssertion(R,a,a1,emptySet,false);
m_extensionManager.addAssertion(R,a,a2,emptySet,false);
m_extensionManager.addConceptAssertion(A,a1,emptySet,false);
m_extensionManager.addConceptAssertion(EXISTS_NEG_A,a1,emptySet,false);
m_extensionManager.addConceptAssertion(NEG_A,a2,emptySet,false);
m_extensionManager.addConceptAssertion(B,a2,emptySet,false);
m_extensionManager.addConceptAssertion(C,a2,emptySet,false);
m_extensionManager.addConceptAssertion(D,a2,emptySet,false);
m_extensionManager.addAssertion(R,a1,a11,emptySet,false);
m_extensionManager.addAssertion(R,a1,a12,emptySet,false);
m_extensionManager.addConceptAssertion(A,a11,emptySet,false);
m_extensionManager.addConceptAssertion(A,a12,emptySet,false);
m_extensionManager.addAssertion(R,a1,b,emptySet,false);
BranchingPoint bp=new BranchingPoint(m_tableau);
m_tableau.pushBranchingPoint(bp);
// The label of a2 is larger, so a1 is merged into a2
m_extensionManager.addAssertion(Equality.INSTANCE,a1,a2,emptySet,false);
assertTrue(m_extensionManager.containsClash());
assertLabel(a2,A,B,C,D,NEG_A,EXISTS_NEG_A);
assertTrue(a1.isMerged());
assertSame(a1.getCanonicalNode(),a2);
assertFalse(a11.isActive());
assertFalse(a12.isActive());
assertRetrieval(m_extensionManager.getTernaryExtensionTable(),T(R,null,null),ExtensionTable.View.TOTAL,new Object[][] { T(R,a,a2),T(R,a2,b) });
assertRetrieval(m_extensionManager.getBinaryExtensionTable(),T(A,null),ExtensionTable.View.TOTAL,new Object[][] { T(A,a2) });
m_tableau.backtrackTo(bp.getLevel());
assertFalse(m_extensionManager.containsClash());
assertLabel(a2,B,C,D,NEG_A);
assertFalse(a1.isMerged());
assertSame(a1.getCanonicalNode(),a1);
assertTrue(a11.isActive());
assertTrue(a12.isActive());
assertRetrieval(m_extensionManager.getTernaryExtensionTable(),T(R,null,null),ExtensionTable.View.TOTAL,new Object[][] { T(R,a,a1),T(R,a1,a11),T(R,a1,a12),T(R,a1,b),T(R,a,a2) });
assertRetrieval(m_extensionManager.getBinaryExtensionTable(),T(A,null),ExtensionTable.View.TOTAL,new Object[][] { T(A,a1),T(A,a11),T(A,a12) });
m_extensionManager.addAssertion(Inequality.INSTANCE,a11,a12,emptySet,false);
assertRetrieval(m_extensionManager.getTernaryExtensionTable(),T(Inequality.INSTANCE,null,null),ExtensionTable.View.TOTAL,new Object[][] { T(Inequality.INSTANCE,a11,a12) });
m_extensionManager.addAssertion(Equality.INSTANCE,a11,a12,emptySet,false);
assertTrue(m_extensionManager.containsClash());
m_tableau.backtrackTo(bp.getLevel());
assertFalse(m_extensionManager.containsClash());
assertRetrieval(m_extensionManager.getTernaryExtensionTable(),T(Inequality.INSTANCE,null,null),ExtensionTable.View.TOTAL,new Node[0][]);
}
protected void assertLabel(Node node,Concept... expected) {
assertLabel(m_tableau,node,expected);
}
}