bool TAxiom :: absorbIntoDomain ( void ) const { WorkSet Cons; const DLTree* bestSome = NULL; // find all forall concepts for ( const_iterator p = begin(), p_end = end(); p != p_end; ++p ) if ( (*p)->Element() == NOT && ( (*p)->Left()->Element() == FORALL // \neg ER.C || (*p)->Left()->Element() == LE )) // \neg >= n R.C { Stat::SAbsRAttempt(); Cons.push_back(*p); // check for the direct domain case if ( (*p)->Left()->Right()->Element() == BOTTOM ) { // found proper absorption candidate bestSome = *p; break; } } // if there are no EXISTS concepts -- return; if ( Cons.empty() ) return false; Stat::SAbsRApply(); TRole* Role; if ( bestSome != NULL ) Role = resolveRole(bestSome->Left()->Left()); else // FIXME!! as for now: just take the 1st role name Role = resolveRole(Cons[0]->Left()->Left()); #ifdef RKG_DEBUG_ABSORPTION std::cout << " R-Absorb GCI to the domain of role " << Role->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 != bestSome ) std::cout << " " << resolveRole((*q)->Left()->Left())->getName(); std::cout << ")"; } #endif // here bestSome is either actual domain, or END(); both cases are fine Role->setDomain(createAnAxiom(bestSome)); return true; }
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; }