Пример #1
0
PTRef Logic::mkConst(SRef s, const char* name) {
    vec<SRef> sort_args;
    sort_args.push(s);
    const char* msg;
    SymRef sr = newSymb(name, sort_args, &msg);
    if (sr == SymRef_Undef) {
        cerr << "Warning: while mkConst " << name << ": " << msg << endl;
        assert(symNameToRef(name).size() == 1);
        sr = symNameToRef(name)[0];
    }
    vec<PTRef> tmp;
    PTRef ptr = insertTerm(sr, tmp, &msg);
    assert (ptr != PTRef_Undef);
    return ptr;
}
Пример #2
0
// The vec argument might be sorted!
PTRef Logic::resolveTerm(const char* s, vec<PTRef>& args, char** msg) {
    SymRef sref = term_store.lookupSymbol(s, args);
    if (sref == SymRef_Undef) {
        asprintf(msg, "Unknown symbol %s", s);
        return PTRef_Undef;
    }
    assert(sref != SymRef_Undef);
    simplify(sref, args);
    PTRef rval;
    const char** msg2 = NULL;
    if (sref == SymRef_Undef)
        rval = PTRef_Undef;
    else
        rval = insertTerm(sref, args, msg2);
    if (msg2 != NULL)
        asprintf(msg, "%s", *msg2);
    return rval;
}
Пример #3
0
//
// Wrapper for simplify.  After running this, the reference should be checked
// for other occurrences since simplification might result in duplicate terms.
//
// In order to avoid duplicate appearances of terms making solving after
// cnfization slow a simplifyTree should be called to the subtree after calling
// the method.
//
void Logic::simplify(PTRef& tr) {
    Pterm& t = getPterm(tr);
    vec<PTRef> args;
    for (int i = 0; i < t.size(); i++)
        args.push(t[i]);
    SymRef sr = t.symb();
    SymRef sr_prev = sr;
    simplify(sr, args);

    const char** msg;

    // The if statement is not strictly speaking necessary, since checking for
    // duplicates needs to be performed anyway after this step
    if (sr != sr_prev && sr == getSym_true())
        tr = getTerm_true();
    else if (sr != sr_prev && sr == getSym_false())
        tr = getTerm_false();
    else
        tr = insertTerm(sr, args, msg);
}
Пример #4
0
PTRef Logic::mkFun(SymRef f, vec<PTRef>& args, const char** msg)
{
    return insertTerm(f, args, msg);
}
Пример #5
0
// The constructor initiates the base logic (Boolean)
Logic::Logic(SMTConfig& c, SStore& s, SymStore& t, PtStore& pt) :
      config(c)
    , sort_store(s)
    , sym_store(t)
    , term_store(pt)
    , is_set(false)
{
    sort_store.insertStore(new Sort(*(new Identifier("Bool"))));
    sort_BOOL = sort_store["Bool 0"];

    vec<SRef> params;

    params.push(sort_store["Bool 0"]);

    SymRef tr;

    const char* msg;
    tr = sym_store.newSymb(tk_true, params, &msg);
    if (tr == SymRef_Undef) { assert(false); }
    sym_store[tr].setNoScoping();
    sym_TRUE = tr;
    vec<PTRef> tmp;
    term_TRUE  = insertTerm(sym_TRUE,  tmp, &msg);
    assert(term_TRUE != PTRef_Undef);

    tr = sym_store.newSymb(tk_false, params, &msg);
    if (tr == SymRef_Undef) { assert(false); }
    sym_store[tr].setNoScoping();
    sym_FALSE = tr;
    term_FALSE = insertTerm(sym_FALSE, tmp, &msg);
    assert(term_FALSE != PTRef_Undef);

    params.push(sort_store["Bool 0"]);
    tr = sym_store.newSymb(tk_not, params, &msg);
    if (tr == SymRef_Undef) { assert(false); }
    sym_store[tr].setNoScoping();
    sym_NOT = tr;

    params.push(sort_store["Bool 0"]);

    tr = sym_store.newSymb(tk_equals, params, &msg);
    if (tr == SymRef_Undef) { assert(false); }
    if (sym_store[tr].setRightAssoc() == false) { assert(false); } // TODO: Remove and clean
    sym_store[tr].setNoScoping();
    sym_store[tr].setCommutes();
    sym_EQ = tr;
    equalities.insert(sym_EQ, true);

    tr = sym_store.newSymb(tk_implies, params, &msg);
    if (tr == SymRef_Undef) { assert(false); }
    if (sym_store[tr].setRightAssoc() == false) { assert(false); } // TODO: Remove and clean
    sym_store[tr].setNoScoping();
    sym_IMPLIES = tr;

    tr = sym_store.newSymb(tk_and, params, &msg);
    if (tr == SymRef_Undef) { assert(false); }
    if (sym_store[tr].setLeftAssoc() == false) assert(false);
    sym_store[tr].setNoScoping();
    sym_store[tr].setCommutes();
    sym_AND = tr;

    tr = sym_store.newSymb(tk_or, params, &msg);
    if (tr == SymRef_Undef) { assert(false); }
    if (sym_store[tr].setLeftAssoc() == false) assert(false);
    sym_store[tr].setNoScoping();
    sym_store[tr].setCommutes();
    sym_OR = tr;

    tr = sym_store.newSymb(tk_xor, params, &msg);
    if (tr == SymRef_Undef) { assert(false); }
    if (sym_store[tr].setLeftAssoc() == false) assert(false);
    sym_store[tr].setCommutes();
    sym_store[tr].setNoScoping();
    sym_XOR = tr;

    tr = sym_store.newSymb(tk_distinct, params, &msg);
    if (tr == SymRef_Undef) { assert(false); }
    if (sym_store[tr].setPairwise() == false) assert(false);
    sym_store[tr].setNoScoping();
    sym_store[tr].setCommutes();
    sym_DISTINCT = tr;

    params.push(sort_store["Bool 0"]);
    tr = sym_store.newSymb(tk_ite, params, &msg);
    if (tr == SymRef_Undef) { assert(false); }
    sym_store[tr].setNoScoping();
    sym_ITE = tr;
    ites.insert(tr, true);
}
Пример #6
0
poly::poly(int c[], int e[], int size)
{
	for (int i=0; i<size; i++)
		insertTerm(c[i], e[i]);
	//polynomial.selectionSortList(); //orders the link in descending order based on exponent
}