z3-src 503.3.0

Source distribution of the Z3 SMT solver, for use as a build dependency
Documentation
/*++
Copyright (c) 2017 Microsoft Corporation

Module Name:

  nla_divisions.h

Author:
  Lev Nachmanson (levnach)
  Nikolaj Bjorner (nbjorner)

Description:
  Check division constraints.
  
--*/

#include "math/lp/nla_types.h"

namespace nla {
    
    class core;
    
    class divisions {
        core& m_core;
        vector<std::tuple<lpvar, lpvar, lpvar, lpvar>> m_idivisions;
        vector<std::tuple<lpvar, lpvar, lpvar, lpvar>> m_rdivisions;
        vector<std::tuple<lpvar, lpvar, lpvar, lpvar>> m_bounded_divisions;
        // divisibility facts (r, x, y, d) meaning r = mod(x, y) and d = div(x, y)
        vector<std::tuple<lpvar, lpvar, lpvar, lpvar>> m_divisibility;

    public:
        divisions(core& c):m_core(c) {}
        void add_idivision(lpvar q, lpvar x, lpvar y, lpvar r);
        void add_rdivision(lpvar q, lpvar x, lpvar y, lpvar r);
        void add_bounded_division(lpvar q, lpvar x, lpvar y, lpvar r);
        void add_divisibility(lpvar r, lpvar x, lpvar y, lpvar d);
        void check();
        void check_bounded_divisions();
        void check_mod_mult();
        void check_linear_divisibility();
        void check_mod_congruence();
    };
}