@Override public void addSubClass(final ATermAppl sub, final ATermAppl sup) { if (null == sub || null == sup || sub.equals(sup)) return; _changes.add(ChangeType.TBOX_ADD); _tbox.addAxiom(ATermUtils.makeSub(sub, sup)); _logger.finer(() -> "sub-class " + sub + " " + sup); }
@Test public void propertyChainClasses() { // Tests #367 classes(_A, _B, _C); objectProperties(_p, _q, _r); _kb.addSubProperty(list(_p, _q), _r); _kb.addSubClass(_A, some(_p, some(_q, _B))); _kb.addSubClass(some(_r, _B), _C); explainEntailment(_kb.isSubClassOf(_A, _C), ATermUtils.makeSub(_A, some(_p, some(_q, _B))), ATermUtils.makeSub(some(_r, _B), _C), ATermUtils.makeSubProp(list(_p, _q), _r)); }
@Override public void addSubClass(final ATermAppl sub, final ATermAppl sup) { if (null == sub || null == sup || sub.equals(sup)) return; _changes.add(ChangeType.TBOX_ADD); _tbox.addAxiom(ATermUtils.makeSub(sub, sup)); _logger.finer(() -> "sub-class " + sub + " " + sup); }
@Ignore("Fails due to #294") @Test public void propertyChainNested() { // Tests #367, #294 classes(_A, _B, _C); objectProperties(_p, _q, _r, _f); _kb.addSubProperty(list(_p, _q), _p); _kb.addSubProperty(list(_p, _r), _f); _kb.addSubProperty(_r, _q); _kb.addSubClass(_A, some(_p, some(_r, some(_r, _B)))); _kb.addSubClass(some(_f, _B), _C); explainEntailment(_kb.isSubClassOf(_A, _C), ATermUtils.makeSub(_A, some(_p, some(_q, _B))), ATermUtils.makeSub(some(_r, _B), _C), ATermUtils.makeSubProp(list(_p, _q), _r), ATermUtils.makeSubProp(list(_r, _p), _f)); }
private static void addDisjointAxiom(final ATermAppl c1, final ATermAppl c2, final List<ATermAppl> axioms) { final ATermAppl notC2 = ATermUtils.makeNot(c2); axioms.add(ATermUtils.makeSub(c1, notC2)); if (ATermUtils.isPrimitive(c2)) { final ATermAppl notC1 = ATermUtils.makeNot(c1); axioms.add(ATermUtils.makeSub(c2, notC1)); } }
private static void addDisjointAxiom(final ATermAppl c1, final ATermAppl c2, final List<ATermAppl> axioms) { final ATermAppl notC2 = ATermUtils.makeNot(c2); axioms.add(ATermUtils.makeSub(c1, notC2)); if (ATermUtils.isPrimitive(c2)) { final ATermAppl notC1 = ATermUtils.makeNot(c1); axioms.add(ATermUtils.makeSub(c2, notC1)); } }
private static List<ATermAppl> normalizeDisjointAxiom(final ATermAppl... concepts) { final List<ATermAppl> axioms = CollectionUtils.makeList(); for (int i = 0; i < concepts.length - 1; i++) { final ATermAppl c1 = concepts[i]; final ATermAppl notC1 = ATermUtils.makeNot(c1); for (int j = i + 1; j < concepts.length; j++) { final ATermAppl c2 = concepts[j]; final ATermAppl notC2 = ATermUtils.makeNot(c2); axioms.add(ATermUtils.makeSub(c1, notC2)); if (ATermUtils.isPrimitive(c2)) axioms.add(ATermUtils.makeSub(c2, notC1)); } } return axioms; }
private static List<ATermAppl> normalizeDisjointAxiom(final ATermAppl... concepts) { final List<ATermAppl> axioms = CollectionUtils.makeList(); for (int i = 0; i < concepts.length - 1; i++) { final ATermAppl c1 = concepts[i]; final ATermAppl notC1 = ATermUtils.makeNot(c1); for (int j = i + 1; j < concepts.length; j++) { final ATermAppl c2 = concepts[j]; final ATermAppl notC2 = ATermUtils.makeNot(c2); axioms.add(ATermUtils.makeSub(c1, notC2)); if (ATermUtils.isPrimitive(c2)) axioms.add(ATermUtils.makeSub(c2, notC1)); } } return axioms; }
@Override public void visit(final OWLSubClassOfAxiom axiom) { axiom.getSubClass().accept(this); final ATermAppl c1 = _term; axiom.getSuperClass().accept(this); final ATermAppl c2 = _term; if (_addAxioms) _kb.addSubClass(c1, c2); else { // create the TBox axiom to remove final ATermAppl subAxiom = ATermUtils.makeSub(c1, c2); // reload is required if remove fails _reloadRequired = !_kb.removeAxiom(subAxiom); } }
@Override public void visit(final OWLSubClassOfAxiom axiom) { axiom.getSubClass().accept(this); final ATermAppl c1 = _term; axiom.getSuperClass().accept(this); final ATermAppl c2 = _term; if (_addAxioms) _kb.addSubClass(c1, c2); else { // create the TBox axiom to remove final ATermAppl subAxiom = ATermUtils.makeSub(c1, c2); // reload is required if remove fails _reloadRequired = !_kb.removeAxiom(subAxiom); } }
@Override public void visit(final OWLSubClassOfAxiom axiom) { axiom.getSubClass().accept(this); final ATermAppl c1 = _term; axiom.getSuperClass().accept(this); final ATermAppl c2 = _term; if (_addAxioms) _kb.addSubClass(c1, c2); else { // create the TBox axiom to remove final ATermAppl subAxiom = ATermUtils.makeSub(c1, c2); // reload is required if remove fails _reloadRequired = !_kb.removeAxiom(subAxiom); } }
private boolean absorbVII(final Set<ATermAppl> set) { ATermList list = ATermUtils.makeList(set); final ATermAppl sub = ATermUtils.nnf((ATermAppl) list.getFirst()); list = list.getNext(); ATermAppl sup = list.isEmpty() ? ATermUtils.makeNot(sub) : ATermUtils.makeNot(ATermUtils.makeAnd(list)); sup = ATermUtils.nnf(sup); final ATermAppl subClassAxiom = ATermUtils.makeSub(sub, sup); _subLogger.fine(() -> "GCI: " + subClassAxiom + "\nexplanation: " + _explanation); addDef(subClassAxiom); _tbox.addAxiomExplanation(subClassAxiom, _explanation); return true; }
private boolean absorbVII(final Set<ATermAppl> set) { ATermList list = ATermUtils.makeList(set); final ATermAppl sub = ATermUtils.nnf((ATermAppl) list.getFirst()); list = list.getNext(); ATermAppl sup = list.isEmpty() ? ATermUtils.makeNot(sub) : ATermUtils.makeNot(ATermUtils.makeAnd(list)); sup = ATermUtils.nnf(sup); final ATermAppl subClassAxiom = ATermUtils.makeSub(sub, sup); _subLogger.fine(() -> "GCI: " + subClassAxiom + "\nexplanation: " + _explanation); addDef(subClassAxiom); _tbox.addAxiomExplanation(subClassAxiom, _explanation); return true; }
@Test public void testTopBottom() { _kb = new KnowledgeBaseImpl(); _kb.addSubClass(ATermUtils.TOP, ATermUtils.BOTTOM); assertFalse(_kb.isConsistent()); final Set<ATermAppl> explanation = _kb.getExplanationSet(); assertIteratorValues(explanation.iterator(), new Object[] { ATermUtils.makeSub(ATermUtils.TOP, ATermUtils.BOTTOM), }); }
@Test public void assertedAxioms() { classes(_A, _B, _C, _D); final ATermAppl axiom = makeSub(makeAnd(_A, _B), makeNot(_B)); tbox.addAxiom(axiom); prepareTBox(); assertTrue(tbox.getAxioms().size() > 1); assertTrue(tbox.getAxioms().contains(axiom)); assertEquals(Collections.singleton(axiom), tbox.getAssertedAxioms()); }
@Test public void testMaxOneDataProp() { _kb.addClass(person); _kb.addDatatypeProperty(ssn); final ATermAppl max1ssn = ATermUtils.makeMax(ssn, 1, ATermUtils.TOP_LIT); _kb.addSubClass(person, max1ssn); _kb.addSubClass(person, ATermUtils.makeMin(ssn, 1, ATermUtils.TOP_LIT)); _kb.addIndividual(robert); _kb.addType(robert, person); final ATermAppl ssn1 = ATermUtils.makePlainLiteral("012345678"); final ATermAppl ssn2 = ATermUtils.makePlainLiteral("123456789"); _kb.addPropertyValue(ssn, robert, ssn1); _kb.addPropertyValue(ssn, robert, ssn2); assertFalse(_kb.isConsistent()); final Set<ATermAppl> explanation = _kb.getExplanationSet(); assertIteratorValues(explanation.iterator(), new Object[] { ATermUtils.makePropAtom(ssn, robert, ssn1), ATermUtils.makePropAtom(ssn, robert, ssn2), ATermUtils.makeSub(person, max1ssn), ATermUtils.makeTypeAtom(robert, person), }); }
@Test public void testInverseAllValues2() { classes(_C, _D); objectProperties(_p, _q); individuals(_a, _b, _c); _kb.addSubClass(_C, all(_q, _D)); _kb.addTransitiveProperty(_p); _kb.addInverseProperty(_p, _q); _kb.addPropertyValue(_p, _a, _b); _kb.addPropertyValue(_p, _b, _c); _kb.addType(_c, _C); _kb.addType(_a, not(_D)); assertFalse(_kb.isConsistent()); final Set<ATermAppl> explanation = _kb.getExplanationSet(); assertIteratorValues(explanation.iterator(), new Object[] { ATermUtils.makeSub(_C, all(_q, _D)), ATermUtils.makeTransitive(_p), ATermUtils.makeInvProp(_p, _q), ATermUtils.makePropAtom(_p, _a, _b), ATermUtils.makePropAtom(_p, _b, _c), ATermUtils.makeTypeAtom(_a, not(_D)), ATermUtils.makeTypeAtom(_c, _C) }); }
@Test public void testInverseCardinality1() { final ATermAppl C = term("C"); final ATermAppl p = term("p"); final ATermAppl invP = term("invP"); final ATermAppl a = term("a"); final ATermAppl b = term("b"); _kb.addClass(C); _kb.addObjectProperty(p); _kb.addObjectProperty(invP); _kb.addIndividual(a); _kb.addIndividual(b); _kb.addSubClass(C, max(invP, 0, TOP)); _kb.addInverseProperty(p, invP); _kb.addPropertyValue(p, b, a); _kb.addType(a, C); assertFalse(_kb.isConsistent()); final Set<ATermAppl> explanation = _kb.getExplanationSet(); assertIteratorValues(explanation.iterator(), new Object[] { ATermUtils.makeSub(C, max(invP, 0, TOP)), ATermUtils.makeInvProp(p, invP), ATermUtils.makePropAtom(p, b, a), ATermUtils.makeTypeAtom(a, C) }); }
@Test public void binaryAbsorption() { final ATermAppl SPECIALCLIENT = term("SPECIALCLIENT"); final ATermAppl CLIENT = term("CLIENT"); final ATermAppl EXPENSIVE = term("EXPENSIVE"); final ATermAppl PROFITABLE = term("PROFITABLE"); final ATermAppl TRUSTEDCLIENT = term("TRUSTEDCLIENT"); final ATermAppl Recommend = term("Recommend"); final ATermAppl Buy = term("Buy"); classes(SPECIALCLIENT, CLIENT, EXPENSIVE, PROFITABLE, TRUSTEDCLIENT); objectProperties(Buy, Recommend); tbox.addAxiom(makeSub(SPECIALCLIENT, TRUSTEDCLIENT)); tbox.addAxiom(makeEqClasses(SPECIALCLIENT, and(CLIENT, some(Buy, or(EXPENSIVE, PROFITABLE)), some(inv(Recommend), TRUSTEDCLIENT)))); prepareTBox(); }