当前位置: 首页>>代码示例>>C++>>正文


C++ FunctionTerm::get_id方法代码示例

本文整理汇总了C++中FunctionTerm::get_id方法的典型用法代码示例。如果您正苦于以下问题:C++ FunctionTerm::get_id方法的具体用法?C++ FunctionTerm::get_id怎么用?C++ FunctionTerm::get_id使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在FunctionTerm的用法示例。


在下文中一共展示了FunctionTerm::get_id方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: replace_argument

Term* Term::replace_argument(int fun_id, int arg_num, Term* replacement)
{
    switch(this->get_term_type())
    {
    case CONSTANT_TERM:
    case VARIABLE_TERM:
        return this;
    case FUNCTION_TERM:
    {
        FunctionTerm* ft = (FunctionTerm*)this;
        const vector<Term*>& args = ft->get_args();
        bool changed = false;
        vector<Term*> new_args;
        for(unsigned int i=0; i < args.size(); i++)
        {
            Term* cur = args[i];
            Term* new_cur = cur->replace_argument(fun_id, arg_num, replacement);
            if(cur != new_cur) {
                changed = true;
            }
            new_args.push_back(new_cur);
        }
        if(ft->get_id() == fun_id )
        {
            changed = true;
            new_args[arg_num] = replacement;
        }
        if(!changed) return this;
        return FunctionTerm::make(ft->get_id(), new_args, ft->is_invertible());

    }
    case ARITHMETIC_TERM:
    {
        ArithmeticTerm* at = (ArithmeticTerm*) this;
        const map<Term*, long int>& elems = at->get_elems();
        map<Term*, long int>::const_iterator it = elems.begin();
        bool changed = false;
        map<Term*, long int> new_elems;
        for(; it!=elems.end(); it++)
        {
            Term* t = it->first;
            long int c = it->second;
            Term* new_t = t->replace_argument(fun_id, arg_num, replacement);
            new_elems[new_t] = c;
            if(t!= new_t) changed = true;

        }
        if(!changed) return this;
        return ArithmeticTerm::make(new_elems, at->get_constant());
    }
    default:
        assert(false);
    }
}
开发者ID:xwangsd,项目名称:mistral,代码行数:54,代码来源:Term.cpp

示例2: get_function_terms_in_clause

void VariableEliminator::get_function_terms_in_clause(Clause& cl,
        map<int, set<FunctionTerm*> >& functions_in_clause)
{

    set<EqLeaf*>::iterator it = cl.pos_eq.begin();
    for(; it!= cl.pos_eq.end(); it++) {
        set<Term*> terms;
        EqLeaf* eq = *it;
        eq->get_lhs()->get_nested_terms(terms);
        eq->get_rhs()->get_nested_terms(terms);
        set<Term*>::iterator it2 = terms.begin();
        for(; it2 != terms.end(); it2++) {
            Term* t = *it2;
            if(t->get_term_type() != FUNCTION_TERM) continue;
            FunctionTerm* ft = (FunctionTerm*) t;
            functions_in_clause[ft->get_id()].insert(ft);
        }

    }

     it = cl.neg_eq.begin();
    for(; it!= cl.neg_eq.end(); it++) {
        set<Term*> terms;
        EqLeaf* eq = *it;
        if(eq->get_lhs() == NULL) {
            cout << eq->get_type() << endl;
            cout << "EQ: " << eq->to_string() << endl;
        }

        eq->get_lhs()->get_nested_terms(terms);
        eq->get_rhs()->get_nested_terms(terms);
        set<Term*>::iterator it2 = terms.begin();
        for(; it2 != terms.end(); it2++) {
            Term* t = *it2;
            if(t->get_term_type() != FUNCTION_TERM) continue;
            FunctionTerm* ft = (FunctionTerm*) t;
            functions_in_clause[ft->get_id()].insert(ft);
        }
    }

    if(DEBUG)
    {
        cout << " --- FUNCTIONS IN CLAUSE ---- " << endl;
        map<int, set<FunctionTerm*> >::iterator it = functions_in_clause.begin();
        for(; it != functions_in_clause.end(); it++) {
            cout << "Function: " << CNode::get_varmap().get_name(it->first) << endl;
            set<FunctionTerm*>::iterator it2 = it->second.begin();
            for(; it2!= it->second.end(); it2++) {
                cout << "\t " << (*it2)->to_string() << endl;
            }
        }
    }
}
开发者ID:xwangsd,项目名称:mistral,代码行数:53,代码来源:VariableEliminator.cpp

示例3: get_all_fun_ids

void Term::get_all_fun_ids(set<int> & ids)
{
    switch(this->get_term_type())
    {
    case CONSTANT_TERM:
    case VARIABLE_TERM:
        return;
    case FUNCTION_TERM:
    {
        FunctionTerm* ft = (FunctionTerm*)this;
        ids.insert(ft->get_id());
        for(unsigned int i=0; i < ft->get_args().size(); i++)
        {
            ft->get_args()[i]->get_all_fun_ids(ids);
        }
        return;
    }
    case ARITHMETIC_TERM:
    {
        ArithmeticTerm* at = (ArithmeticTerm*) this;
        const map<Term*, long int>& elems = at->get_elems();
        map<Term*, long int>::const_iterator it = elems.begin();
        for(; it!=elems.end(); it++)
        {
            it->first->get_all_fun_ids(ids);

        }
        return;
    }
    default:
        assert(false);
    }
}
开发者ID:xwangsd,项目名称:mistral,代码行数:33,代码来源:Term.cpp

示例4: instantiate_term

Term* UniversalInstantiator::instantiate_term(Term* t,
            map<int, Term*> &sub_map)
{
    if(t->get_term_type() == CONSTANT_TERM)
        return t;
    if(t->get_term_type() == VARIABLE_TERM){
        VariableTerm *vt = (VariableTerm*)t;
        if(sub_map.count(vt->get_var_id()) == 0)
            return vt;
        return sub_map[vt->get_var_id()];
    }
    if(t->get_term_type() == ARITHMETIC_TERM) {
        ArithmeticTerm* at = (ArithmeticTerm*)t;
        bool changed = false;
        map<Term*, long int> new_elems;
        map<Term*, long int>::const_iterator it = at->get_elems().begin();
        for(; it!= at->get_elems().end(); it++) {
            Term* new_t = instantiate_term(it->first, sub_map);
            if(new_t != t) changed = true;
            new_elems[new_t] = it->second;
        }
        if(!changed) return at;
        return ArithmeticTerm::make(new_elems, at->get_constant());
    }
    FunctionTerm *ft = (FunctionTerm*)t;
    vector<Term*> new_args;
    for(unsigned int i=0; i < ft->get_args().size(); i++)
    {
        Term* cur = instantiate_term(ft->get_args()[i], sub_map);
        new_args.push_back(cur);
    }
    return FunctionTerm::make(ft->get_id(), new_args, ft->is_invertible());
}
开发者ID:xwangsd,项目名称:mistral,代码行数:33,代码来源:UniversalInstantiator.cpp

示例5: substitute

Term* Term::substitute(Term* (*sub_func)(Term* t, void* data), void* my_data)
{
    Term* new_t = (*sub_func)(this, my_data);
    if(new_t != this) {
        return new_t;
    }
    Term* res = NULL;
    switch (get_term_type()) {
        case CONSTANT_TERM:
        case VARIABLE_TERM: {
            res=  this;
            break;
        }
        case FUNCTION_TERM: {
            FunctionTerm* ft = (FunctionTerm*) this;
            const vector<Term*>& args = ft->get_args();
            vector<Term*> new_args;
            bool changed = false;
            for (unsigned int i = 0; i < args.size(); i++) {
                Term* new_arg = args[i]->substitute(sub_func, my_data);
                if (new_arg != args[i])
                    changed = true;
                new_args.push_back(new_arg);
            }

            if (!changed) {
                res = this;
                break;
            }
            res= FunctionTerm::make(ft->get_id(), new_args, ft->is_invertible());

            break;

        }
        case ARITHMETIC_TERM: {
            ArithmeticTerm* at = (ArithmeticTerm*) this;
            bool changed = false;
            map<Term*, long int> new_elems;
            map<Term*, long int>::const_iterator it = at->get_elems().begin();
            for (; it != at->get_elems().end(); it++) {
                Term* new_t = it->first->substitute(sub_func, my_data);
                if (new_t != it->first)
                    changed = true;
                new_elems[new_t]+= it->second;
            }
            if (!changed) {
                res =  at;
                break;
            }
            res = ArithmeticTerm::make(new_elems, at->get_constant());
            break;
        }
        default:
            assert(false);
    }
    return res;
}
开发者ID:xwangsd,项目名称:mistral,代码行数:57,代码来源:Term.cpp

示例6: evalute_term

Term* Term::evalute_term(map<Term*, SatValue>& assignments)
{
    switch(this->get_term_type())
    {
    case CONSTANT_TERM:
        return this;
    case VARIABLE_TERM:
    {
        if(assignments.count(this) > 0){
            return ConstantTerm::make(assignments[this].value.to_int());
        }
        return this;
    }
    case FUNCTION_TERM:
    {
        if(assignments.count(this) > 0){
            return ConstantTerm::make(assignments[this].value.to_int());
        }
        vector<Term*> new_args;
        FunctionTerm* ft = (FunctionTerm*) this;
        for(unsigned int i = 0; i < ft->get_args().size(); i++)
        {
            Term* arg = ft->get_args()[i];
            arg = arg->evalute_term(assignments);
            new_args.push_back(arg);
        }
        Term* new_t =
                FunctionTerm::make(ft->get_id(), new_args, ft->is_invertible());

        if(assignments.count(new_t) > 0)
            return ConstantTerm::make(assignments[new_t].value.to_int());
        return new_t;

    }
    case ARITHMETIC_TERM:
    {
        ArithmeticTerm* at = (ArithmeticTerm*) this;
        Term* res = ConstantTerm::make(at->get_constant());
        const map<Term*, long int>& elems = at->get_elems();
        map<Term*, long int>::const_iterator it = elems.begin();
        for(; it!=elems.end(); it++)
        {
            Term* t = it->first;
            Term* val = t->evalute_term(assignments);
            res = res->add(val->multiply(it->second));
        }
        if(assignments.count(res) > 0)
            return ConstantTerm::make(assignments[res].value.to_int());

        return res;
    }
    default:
        assert(false);
    }
}
开发者ID:xwangsd,项目名称:mistral,代码行数:55,代码来源:Term.cpp

示例7: build_index_set_term

/*
 * Cdr's down terms to build the index set.
 * This can only be called if the term is not in index guard.
 */
bool  UniversalInstantiator::build_index_set_term(Term* t, set<int> &qvars,
        int fun_id, int arg_num)
{
    if(t->get_term_type() == FUNCTION_TERM)
    {
        FunctionTerm* ft = (FunctionTerm*)t;
        bool contains_uvar = false;
        for(unsigned int i=0; i < ft->get_args().size(); i++) {
            bool res =
                build_index_set_term(ft->get_args()[i], qvars, ft->get_id(), i);
            if(res) contains_uvar = true;
        }
        if(contains_uvar) return true;
    }
    if(t->get_term_type() == ARITHMETIC_TERM)
    {
        bool contains_uvar = false;
        ArithmeticTerm* at = (ArithmeticTerm*) t;
        map<Term*, long int>::const_iterator it = at->get_elems().begin();
        for(; it!=at->get_elems().end(); it++){
            bool res = build_index_set_term(it->first, qvars, -1, -1);
            if(res) contains_uvar = true;
        }
        if(contains_uvar) return true;
    }


    pair<int, int> key(fun_id, arg_num);
    if(reverse_fun_arg_universal.count(key) ==0) return false;
    if(t->get_term_type() == VARIABLE_TERM){
        VariableTerm* vt = (VariableTerm*) t;
        if(qvars.count(vt->get_var_id()) != 0){
            return true;
        }
    }

    Term* se = t;
    set<qvar>* val = reverse_fun_arg_universal[key];
    if(val->size() == 0) {
        return false;
    }
    bool added = false;
    set<qvar>::iterator it = val->begin();
    for(; it!= val->end(); it++){
        set<Term*>* s = index_set[*it];
        if(s == NULL){
            s= new set<Term*>();
            index_set[*it] =s;
        }
        unsigned int old_size = s->size();
        s->insert(se);
        if(s->size() > old_size) added = true;
    }
    return false;
}
开发者ID:xwangsd,项目名称:mistral,代码行数:59,代码来源:UniversalInstantiator.cpp

示例8: rename_variables

Term* Term::rename_variables(map<int, int>& replacements)
{
    switch (get_term_type()) {
        case CONSTANT_TERM:
            return this;
        case VARIABLE_TERM: {
            VariableTerm* vt = (VariableTerm*) this;
            int var_id = vt->get_var_id();
            if (replacements.count(var_id)==0)
                return this;
            Term* res= VariableTerm::make(replacements[var_id]);
            return res;
        }
        case FUNCTION_TERM: {
            FunctionTerm* ft = (FunctionTerm*) this;
            const vector<Term*>& args = ft->get_args();
            vector<Term*> new_args;
            bool changed = false;
            for (unsigned int i = 0; i < args.size(); i++) {
                Term* new_arg = args[i]->rename_variables(replacements);
                if (new_arg != args[i])
                    changed = true;
                new_args.push_back(new_arg);
            }

            if (!changed)
                return this;
            Term* res= FunctionTerm::make(ft->get_id(), new_args,
                    ft->is_invertible());
            return res;

        }
        case ARITHMETIC_TERM: {
            ArithmeticTerm* at = (ArithmeticTerm*) this;
            bool changed = false;
            map<Term*, long int> new_elems;
            map<Term*, long int>::const_iterator it = at->get_elems().begin();
            for (; it != at->get_elems().end(); it++) {
                Term* new_t = it->first->rename_variables(replacements);
                if (new_t != it->first)
                    changed = true;
                new_elems[new_t] += it->second;
            }
            if (!changed)
                return at;
            Term* res= ArithmeticTerm::make(new_elems, at->get_constant());
            return res;
        }
        default:
            assert(false);
    }
}
开发者ID:xwangsd,项目名称:mistral,代码行数:52,代码来源:Term.cpp

示例9: get_all_first_arguments

void Term::get_all_first_arguments(set<int>& fn_ids, map<int, set<Term*> >&
        fn_id_to_first_arg)
{
    switch(this->get_term_type())
    {
    case CONSTANT_TERM:
    case VARIABLE_TERM:
        return;
    case FUNCTION_TERM:
    {

        FunctionTerm* ft = (FunctionTerm*)this;
        const vector<Term*>& args = ft->get_args();
        int my_id = ft->get_id();
        if(fn_ids.count(my_id) > 0) {
            Term* arg = args[0];
            fn_id_to_first_arg[my_id].insert(arg);
        }

        for(unsigned int i=0; i < args.size(); i++)
        {
            Term* cur = args[i];
            cur->get_all_first_arguments(fn_ids, fn_id_to_first_arg);
        }
        return;

    }
    case ARITHMETIC_TERM:
    {
        ArithmeticTerm* at = (ArithmeticTerm*) this;
        const map<Term*, long int>& elems = at->get_elems();
        map<Term*, long int>::const_iterator it = elems.begin();
        for(; it!=elems.end(); it++)
        {
            Term* t = it->first;
            t->get_all_first_arguments(fn_ids, fn_id_to_first_arg);

        }
        return;
    }
    default:
        assert(false);
    }
}
开发者ID:xwangsd,项目名称:mistral,代码行数:44,代码来源:Term.cpp

示例10: get_all_arguments

void Term::get_all_arguments(int fun_id, int arg_num, set<Term*> & args)
{
    switch(this->get_term_type())
    {
    case CONSTANT_TERM:
    case VARIABLE_TERM:
        return;
    case FUNCTION_TERM:
    {
        FunctionTerm* ft = (FunctionTerm*)this;
        if(ft->get_id() == fun_id){
            assert((int) ft->get_args().size() > arg_num);
            args.insert(ft->get_args()[arg_num]);
        }
        for(unsigned int i=0; i < ft->get_args().size(); i++)
        {
            ft->get_args()[i]->get_all_arguments(fun_id, arg_num, args);
        }
        return;
    }
    case ARITHMETIC_TERM:
    {
        ArithmeticTerm* at = (ArithmeticTerm*) this;
        const map<Term*, long int>& elems = at->get_elems();
        map<Term*, long int>::const_iterator it = elems.begin();
        for(; it!=elems.end(); it++)
        {
            it->first->get_all_arguments(fun_id, arg_num, args);

        }
        return;
    }
    default:
        assert(false);
    }
}
开发者ID:xwangsd,项目名称:mistral,代码行数:36,代码来源:Term.cpp

示例11: process_term

/*
 * Substitutes variables if there are any
 * active subtituitons & byuilds the fun_arg_universal
 * and reverse_fun_arg universal maps. This is
 * recursive since we need to cdr down
 * nested function terms.
 */
Term* UniversalInstantiator::process_term(Term* t, map<int,int> & var_subs,
        int fun_id, int arg_num, QuantifiedLeaf* ql)
{
    if(t->get_term_type() == CONSTANT_TERM) return t;

    if(t->get_term_type() == VARIABLE_TERM){
        VariableTerm* vt = (VariableTerm*)t;
        int var_id = vt->get_var_id();
        if(var_subs.count(var_id)>0){
            Term* new_vt = VariableTerm::make(var_subs[var_id]);
            return new_vt;
        }
        else if(fun_id != -1 && ql!= NULL &&
                ql->get_quantified_vars().count(var_id) >0)
        {
            assert(arg_num != -1);
            qvar qv;

            //qv.orig_id = ql->get_orig_id();
            qv.id = (long int) ql;
            qv.var_id = var_id;

            map<int, int> *fun_map = NULL;
            if(fun_arg_universal.count(qv)>0) {
                fun_map = fun_arg_universal[qv];
            }
            else
            {
                fun_map = new map<int, int>();
                fun_arg_universal[qv] = fun_map;
            }
            if(fun_map->count(fun_id) == 0){
                (*fun_map)[fun_id] = arg_num;
                pair<int, int> key(fun_id, arg_num);
                set<qvar>* val = reverse_fun_arg_universal[key];
                if(val == NULL){
                    val = new set<qvar>();
                    reverse_fun_arg_universal[key] = val;

                }
                val->insert(qv);
            }
            else {
                if((*fun_map)[fun_id] != arg_num)
                    return NULL;
            }
        }
        return t;
    }
    if(t->get_term_type() == FUNCTION_TERM)
    {
        FunctionTerm* ft = (FunctionTerm*)t;
        vector<Term*> new_args;
        for(unsigned int i=0; i < ft->get_args().size(); i++)
        {
            Term* cur_arg = process_term(ft->get_args()[i], var_subs,
                    ft->get_id(), i, ql);
            if(cur_arg == NULL){
                return NULL;
            }
            new_args.push_back(cur_arg);
        }
        Term* new_ft = FunctionTerm::make(ft->get_id(), new_args,
                ft->is_invertible());
        return new_ft;
    }
    else {
        assert(t->get_term_type() == ARITHMETIC_TERM);
        ArithmeticTerm* at = (ArithmeticTerm*) t;
        bool changed = false;
        map<Term*, long int> new_elems;
        map<Term*, long int>::const_iterator it = at->get_elems().begin();
        for(; it!= at->get_elems().end(); it++){
            Term* new_t = process_term(it->first, var_subs, -1, -1, ql);
            if(new_t == NULL) return NULL;
            new_elems[new_t] = it->second;
        }
        if(!changed) return at;
        Term* new_at = ArithmeticTerm::make(new_elems, at->get_constant());
        return new_at;
    }


}
开发者ID:xwangsd,项目名称:mistral,代码行数:91,代码来源:UniversalInstantiator.cpp


注:本文中的FunctionTerm::get_id方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。