예제 #1
0
void goal::elim_redundancies() {
    if (inconsistent())
        return;
    expr_ref_fast_mark1 neg_lits(m());
    expr_ref_fast_mark2 pos_lits(m());
    unsigned sz = size();
    unsigned j  = 0;
    for (unsigned i = 0; i < sz; i++) {
        expr * f = form(i);
        if (m().is_true(f))
            continue;
        if (m().is_not(f)) {
            expr * atom = to_app(f)->get_arg(0);
            if (neg_lits.is_marked(atom))
                continue;
            if (pos_lits.is_marked(atom)) {
                proof * p = 0;
                if (proofs_enabled()) {
                    proof * prs[2] = { pr(get_idx(atom)), pr(i) };
                    p = m().mk_unit_resolution(2, prs);
                }
                expr_dependency_ref d(m());
                if (unsat_core_enabled())
                    d = m().mk_join(dep(get_idx(atom)), dep(i));
                push_back(m().mk_false(), p, d);                    
                return;
            }
            neg_lits.mark(atom);
        }
        else {
            if (pos_lits.is_marked(f))
                continue;
            if (neg_lits.is_marked(f)) {
                proof * p = 0;
                if (proofs_enabled()) {
                    proof * prs[2] = { pr(get_not_idx(f)), pr(i) };
                    p = m().mk_unit_resolution(2, prs);
                }
                expr_dependency_ref d(m());
                if (unsat_core_enabled())
                    d = m().mk_join(dep(get_not_idx(f)), dep(i));
                push_back(m().mk_false(), p, d);
                return;
            }
            pos_lits.mark(f);
        }
        if (i == j) {
            j++;
            continue;
        }
        m().set(m_forms, j, f);
        if (proofs_enabled())
            m().set(m_proofs, j, pr(i));
        if (unsat_core_enabled())
            m().set(m_dependencies, j, dep(i));
        j++;
    }
    shrink(j);
}
예제 #2
0
void assertion_set::elim_redundancies() {
    if (inconsistent())
        return;
    expr_ref_fast_mark1 neg_lits(m());
    expr_ref_fast_mark2 pos_lits(m());
    unsigned sz = size();
    unsigned j  = 0;
    for (unsigned i = 0; i < sz; i++) {
        expr * f = form(i);
        if (m().is_true(f))
            continue;
        if (m().is_not(f)) {
            expr * atom = to_app(f)->get_arg(0);
            if (neg_lits.is_marked(atom))
                continue;
            if (pos_lits.is_marked(atom)) {
                proof * p = 0;
                if (m().proofs_enabled()) {
                    proof * pr1 = 0;
                    proof * pr2 = pr(i);
                    for (unsigned j = 0; j < i; j++) {
                        if (form(j) == atom) {
                            pr1 = pr(j);
                            break;
                        }
                    }
                    SASSERT(pr1);
                    proof * prs[2] = { pr1, pr2 };
                    p = m().mk_unit_resolution(2, prs);
                }
                push_back(m().mk_false(), p);                    
                return;
            }
            neg_lits.mark(atom);
        }
        else {
            if (pos_lits.is_marked(f))
                continue;
            if (neg_lits.is_marked(f)) {
                proof * p = 0;
                if (m().proofs_enabled()) {
                    proof * pr1 = 0;
                    proof * pr2 = pr(i);
                    for (unsigned j = 0; j < i; j++) {
                        expr * curr = form(j);
                        expr * atom;
                        if (m().is_not(curr, atom) && atom == f) {
                            pr1 = pr(j);
                            break;
                        }
                    }
                    SASSERT(pr1);
                    proof * prs[2] = { pr1, pr2 };
                    p = m().mk_unit_resolution(2, prs);
                }
                push_back(m().mk_false(), p);
                return;
            }
            pos_lits.mark(f);
        }
        if (i == j) {
            j++;
            continue;
        }
        m().set(m_forms, j, f);
        if (m().proofs_enabled())
            m().set(m_proofs, j, pr(i));
        j++;
    }
    
    for (; j < sz; j++) {
        m().pop_back(m_forms);
        if (m().proofs_enabled())
            m().pop_back(m_proofs);
    }
}