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; }