bool TAxiom :: absorbIntoConcept ( TBox& KB ) const { WorkSet Cons; DLTree* bestConcept = NULL; // finds all primitive concept names for ( const_iterator p = begin(), p_end = end(); p != p_end; ++p ) if ( InAx::isNegPC(*p) ) // FIXME!! review this during implementation of Nominal Absorption { Stat::SAbsCAttempt(); Cons.push_back(*p); if ( InAx::getConcept(*p)->isSystem() ) bestConcept = *p; } // if no concept names -- return; if ( Cons.empty() ) return false; Stat::SAbsCApply(); // FIXME!! as for now: just take the 1st concept name if ( bestConcept == NULL ) bestConcept = Cons[0]; // normal concept absorption TConcept* Concept = InAx::getConcept(bestConcept); #ifdef RKG_DEBUG_ABSORPTION std::cout << " C-Absorb GCI to concept " << Concept->getName(); if ( Cons.size() > 1 ) { std::cout << " (other options are"; for ( WorkSet::iterator q = Cons.begin(), q_end = Cons.end(); q != q_end; ++q ) if ( *q != bestConcept ) std::cout << " " << InAx::getConcept(*q)->getName(); std::cout << ")"; } #endif // adds a new definition Concept->addDesc(createAnAxiom(bestConcept)); Concept->removeSelfFromDescription(); // in case T [= (A or \neg B) and (B and \neg A) there appears a cycle A [= B [= A // so remove potential cycle // FIXME!! just because TConcept can't get rid of cycle by itself KB.clearRelevanceInfo(); KB.checkToldCycle(Concept); KB.clearRelevanceInfo(); return true; }
/// absorb into negation of a concept; @return true if absorption is performed bool TAxiom :: absorbIntoNegConcept ( TBox& KB ) const { WorkSet Cons; TConcept* Concept; const DLTree* bestConcept = NULL; // finds all primitive negated concept names without description for ( const_iterator p = begin(), p_end = end(); p != p_end; ++p ) if ( (*p)->Element().getToken() == NOT && isName((*p)->Left()) && (Concept = InAx::getConcept((*p)->Left()))->isPrimitive() && !Concept->isSingleton() && Concept->Description == NULL ) { Stat::SAbsNAttempt(); Cons.push_back(*p); } // if no concept names -- return; if ( Cons.empty() ) return false; Stat::SAbsNApply(); // FIXME!! as for now: just take the 1st concept name if ( bestConcept == NULL ) bestConcept = Cons[0]; // normal concept absorption Concept = InAx::getConcept(bestConcept->Left()); #ifdef RKG_DEBUG_ABSORPTION std::cout << " N-Absorb GCI to concept " << Concept->getName(); if ( Cons.size() > 1 ) { std::cout << " (other options are"; for ( WorkSet::iterator q = Cons.begin(), q_end = Cons.end(); q != q_end; ++q ) if ( *q != bestConcept ) std::cout << " " << InAx::getConcept((*q)->Left())->getName(); std::cout << ")"; } #endif // replace ~C [= D with C=~notC, notC [= D: // make notC [= D TConcept* nC = KB.getAuxConcept(createAnAxiom(bestConcept)); // define C = ~notC; C had an empty desc, so it's safe not to delete it KB.makeNonPrimitive ( Concept, createSNFNot(KB.getTree(nC)) ); return true; }
bool TAxiom :: absorbIntoTop ( TBox& KB ) const { TConcept* C = NULL; // check whether the axiom is Top [= C for ( const_iterator p = begin(), p_end = end(); p != p_end; ++p ) if ( InAx::isBot(*p) ) // BOTTOMS are fine continue; else if ( InAx::isPosCN(*p) ) // CN found { if ( C != NULL ) // more than one concept return false; C = InAx::getConcept((*p)->Left()); if ( C->isSingleton() ) // doesn't work with nominals return false; } else return false; if ( C == NULL ) return false; // make an absorption Stat::SAbsTApply(); DLTree* desc = KB.makeNonPrimitive ( C, createTop() ); #ifdef RKG_DEBUG_ABSORPTION std::cout << " T-Absorb GCI to axiom"; if ( desc ) std::cout << "s *TOP* [=" << desc << " and"; std::cout << " " << C->getName() << " = *TOP*"; #endif if ( desc ) KB.addSubsumeAxiom ( createTop(), desc ); return true; }
bool TAxiom :: absorbIntoTop ( TBox& KB ) const { TConcept* Cand = nullptr; // check whether the axiom is Top [= C for ( const auto& C: Disjuncts ) if ( InAx::isBot(C) ) // BOTTOMS are fine continue; else if ( InAx::isPosCN(C) ) // CN found { if ( Cand != nullptr ) // more than one concept return false; Cand = InAx::getConcept(C->Left()); if ( Cand->isSingleton() ) // doesn't work with nominals return false; } else return false; if ( Cand == nullptr ) return false; // make an absorption Stat::SAbsTApply(); DLTree* desc = KB.makeNonPrimitive ( Cand, createTop() ); #ifdef RKG_DEBUG_ABSORPTION std::cout << " T-Absorb GCI to axiom"; if ( desc ) std::cout << "s *TOP* [=" << desc << " and"; std::cout << " " << Cand->getName() << " = *TOP*"; #endif if ( desc ) KB.addSubsumeAxiom ( createTop(), desc ); return true; }