/*++ Copyright (c) 2020 Microsoft Corporation Module Name: sat_aig_finder.h Abstract: extract AIG definitions from clauses. An example AIG clause is: head \/ l1 \/ l2 such that ~l1 /\ ~l2 => head head => ~l1, head => ~l2 Author: Nikolaj Bjorner 2020-01-02 Notes: AIG finder --*/ #pragma once #include "util/params.h" #include "util/statistics.h" #include "sat/sat_clause.h" #include "sat/sat_types.h" #include "sat/sat_big.h" namespace sat { class solver; class aig_finder { solver& s; big m_big; literal_vector m_ands; std::function m_on_aig; std::function m_on_if; bool implies(literal a, literal b); bool find_aig(clause& c); void find_ifs(clause_vector& clauses); void find_aigs(clause_vector& clauses); void validate_and(literal head, literal_vector const& ands, clause const& c); void validate_if(literal x, literal c, literal t, literal e, clause const& c0, clause const* c1, clause const* c2, clause const* c3); void validate_clause(literal x, literal y, literal z, vector const& clauses); void validate_clause(literal_vector const& clause, vector const& clauses); public: aig_finder(solver& s); void set(std::function const& f) { m_on_aig = f; } void set(std::function const& f) { m_on_if = f; } void operator()(clause_vector& clauses); }; }