コード例 #1
0
ファイル: dltree.cpp プロジェクト: smilencezq/factplusplus
/// create conjunction of given formulas
DLTree* createSNFAnd ( DLTree* C, DLTree* D )
{
    // try to simplify conjunction
    if ( C == NULL )	// single element
        return D;
    if ( D == NULL )
        return C;

    if ( C->Element() == TOP ||		// T\and D = D
            D->Element() == BOTTOM )	// C\and F = F
    {
        deleteTree(C);
        return D;
    }

    if ( D->Element() == TOP ||		// C\and T = C
            C->Element() == BOTTOM )	// F\and D = F
    {
        deleteTree(D);
        return C;
    }

    // no simplification possible -- return actual conjunction
    return new DLTree ( TLexeme(AND), C, D );
}
コード例 #2
0
ファイル: Queries.cpp プロジェクト: ethz-asl/libfactplusplus
/*
 * Class:     uk_ac_manchester_cs_factplusplus_FaCTPlusPlus
 * Method:    askRelatedValues
 * Signature: (Luk/ac/manchester/cs/factplusplus/IndividualPointer;Luk/ac/manchester/cs/factplusplus/DataPropertyPointer;)[Luk/ac/manchester/cs/factplusplus/DataValuePointer;
 */
JNIEXPORT jobjectArray JNICALL Java_uk_ac_manchester_cs_factplusplus_FaCTPlusPlus_askRelatedValues
(JNIEnv * env, jobject obj ATTR_UNUSED, jobject arg1 ATTR_UNUSED, jobject arg2 ATTR_UNUSED)
{
    TRACE_JNI("askRelatedValues");
    TRACE_ARG(env,obj,arg1);
    TRACE_ARG(env,obj,arg2);
    Throw ( env, "FaCT++ Kernel: unsupported operation 'askRelatedValues'" );
    return nullptr;
#if 0
    ReasoningKernel::NamesVector Js;
    PROCESS_SIMPLE_QUERY ( J->K->getRoleFillers ( getROIndividualExpr(env,arg1), getRODRoleExpr(env,arg2), Js ) );
    std::vector<TExpr*> acc;
    for ( ReasoningKernel::NamesVector::const_iterator p = Js.begin(), p_end = Js.end(); p < p_end; ++p )
        acc.push_back(new TExpr(TLexeme(DATAEXPR,const_cast<TNamedEntry*>(*p))));
    return J->buildArray ( acc, J->DataValuePointer );
#endif
}
コード例 #3
0
ファイル: dltree.cpp プロジェクト: smilencezq/factplusplus
/// create inverse of role R
DLTree* createInverse ( DLTree* R )
{
    fpp_assert ( R != NULL );	// sanity check
    switch ( R->Element().getToken() )
    {
    case INV:	// R-- = R
    {
        DLTree* p = clone(R->Left());
        deleteTree(R);
        return p;
    }
    case RNAME:	// object role name
        if ( unlikely(isTopRole(R)) || unlikely(isBotRole(R)) )
            return R;	// top/bottom roles are inverses of themselves
        return new DLTree ( TLexeme(INV), R );
    default:	// no other elements can have inverses
        fpp_unreachable();
    }
}
コード例 #4
0
ファイル: dltree.cpp プロジェクト: smilencezq/factplusplus
/// create negation of given formula
DLTree* createSNFNot ( DLTree* C )
{
    fpp_assert ( C != NULL );	// sanity check
    if ( C->Element() == BOTTOM )
    {   // \not F = T
        deleteTree(C);
        return createTop();
    }
    if ( C->Element() == TOP )
    {   // \not T = F
        deleteTree(C);
        return createBottom();
    }
    if ( C->Element () == NOT )
    {   // \not\not C = C
        DLTree* p = clone(C->Left());
        deleteTree(C);
        return p;
    }

    // general case
    return new DLTree ( TLexeme(NOT), C );
}
コード例 #5
0
ファイル: BuildDAG.cpp プロジェクト: dgu123/factplusplus
void TBox :: buildDAG ( void )
{
	nNominalReferences = 0;

	// init concept indexing
	nC = 1;	// start with 1 to make index 0 an indicator of "not processed"
	ConceptMap.push_back(NULL);

	// make fresh concept and datatype
	concept2dag(pTemp);
	DLTree* freshDT = DTCenter.getFreshDataType();
	addDataExprToHeap ( static_cast<TDataEntry*>(freshDT->Element().getNE()) );
	deleteTree(freshDT);

	for ( c_const_iterator pc = c_begin(); pc != c_end(); ++pc )
		concept2dag(*pc);
	for ( i_const_iterator pi = i_begin(); pi != i_end(); ++pi )
		concept2dag(*pi);

	// init heads of simple rules
	for ( TSimpleRules::iterator q = SimpleRules.begin(), q_end = SimpleRules.end(); q < q_end; ++q )
		(*q)->bpHead = tree2dag((*q)->tHead);

	// builds Roles range and domain
	initRangeDomain(ORM);
	initRangeDomain(DRM);

	// build all splits
	for ( TSplitVars::iterator s = getSplits()->begin(), s_end = getSplits()->end(); s != s_end; ++s )
		split2dag(*s);

	RoleMaster::iterator p, p_end;

	// build all GCIs
	DLTree* GCI = Axioms.getGCI();

	// add special domains to the GCIs
	if ( likely(useSpecialDomains) )
		for ( p = ORM.begin(), p_end = ORM.end(); p < p_end; ++p )
			if ( !(*p)->isSynonym() && (*p)->hasSpecialDomain() )
				GCI = createSNFAnd ( GCI, clone((*p)->getTSpecialDomain()) );

	// take chains that lead to Bot role into account
	if ( !ORM.getBotRole()->isSimple() )
		GCI = createSNFAnd ( GCI,
				new DLTree ( TLexeme(FORALL), createRole(ORM.getBotRole()), createBottom() ) );

	T_G = tree2dag(GCI);
	deleteTree(GCI);

	// mark GCI flags
	GCIs.setGCI(T_G != bpTOP);
	GCIs.setReflexive(ORM.hasReflexiveRoles());

	// builds functional labels for roles
	for ( p = ORM.begin(), p_end = ORM.end(); p < p_end; ++p )
		if ( !(*p)->isSynonym() && (*p)->isTopFunc() )
			(*p)->setFunctional ( atmost2dag ( 1, *p, bpTOP ) );
	for ( p = DRM.begin(), p_end = DRM.end(); p < p_end; ++p )
		if ( !(*p)->isSynonym() && (*p)->isTopFunc() )
			(*p)->setFunctional ( atmost2dag ( 1, *p, bpTOP ) );

	// check the type of the ontology
	if ( nNominalReferences > 0 )
	{
		unsigned int nInd = i_end() - i_begin();
		if ( nInd > 100 && nNominalReferences > nInd )
			isLikeWINE = true;
	}

	// here DAG is complete; set its final size
	DLHeap.setFinalSize();
}