-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Use SMT solvers to solve linear systems over integers and rationals -- -- Solve linear systems of equations over integers and rationals, using -- an SMT solver. -- -- Currently, the following SMT solvers are supported: -- --
-- 2x + 3y + 4z = 20 -- 6x - 3y + 9z = -6 -- 2x + z = 8 ---- --
-- >>> solveIntegerLinearEqs z3 [[2, 3, 4],[6, -3, 9],[2, 0, 1]] [20, -6, 8] -- Just [5,6,-2] ---- -- The first argument picks the SMT solver to use. Valid values are -- z3 and cvc4. Naturally, you should have the chosen -- solver installed on your system. -- -- In case there are no solutions, we will get Nothing: -- --
-- >>> solveIntegerLinearEqs z3 [[1], [1]] [2, 3] -- Nothing ---- -- Note that there are no solutions to this second system as it -- stipulates the unknown is equal to both 2 and 3. (Overspecified.) solveIntegerLinearEqs :: Solver -> [[Integer]] -> [Integer] -> IO (Maybe [Integer]) -- | Similar to solveIntegerLinearEqs, except returns all possible -- solutions. Note that there might be an infinite number of solutions if -- the system is underspecified, in which case the result will be a lazy -- list of solutions that the caller can consume as much as needed. -- -- Here's an example call, where we underspecify the system and hence -- there are multiple (in this case an infinite number of) solutions. -- Here, we only take the first 3 elements, for testing purposes, but all -- such results can be computed lazily. Our system is: -- --
-- 2x + 3y + 4z = 20 -- 6x - 3y + 9z = -6 ---- -- We have: -- --
-- >>> take 3 `fmap` solveIntegerLinearEqsAll z3 [[2, 3, 4],[6, -3, 9]] [20, -6] -- [[5,6,-2],[-8,4,6],[18,8,-10]] --solveIntegerLinearEqsAll :: Solver -> [[Integer]] -> [Integer] -> IO [[Integer]] -- | Solve a system of linear equations over rationals. Same as the integer -- version solveIntegerLinearEqs, except it takes rational -- coefficients and returns rational results. -- -- Here's an example call, to solve the following system of equations: -- --
-- 2.4x + 3.6y = 12 -- 7.2x - 5y = -8.5 ---- --
-- >>> solveRationalLinearEqs z3 [[2.4, 3.6],[7.2, -5]] [12, -8.5] -- Just [245 % 316,445 % 158] --solveRationalLinearEqs :: Solver -> [[Rational]] -> [Rational] -> IO (Maybe [Rational]) -- | Solve a system of linear equations over rationals. Similar to -- solveRationalLinearEqs, except it returns all solutions lazily. -- -- Example system: -- --
-- 2.4x + 3.6y = 12 ---- -- In this case, the system has infinitely many solutions. We can compute -- three of them as follows: -- --
-- >>> take 3 `fmap` solveRationalLinearEqsAll z3 [[2.4, 3.6]] [12] -- [[5 % 1,0 % 1],[0 % 1,10 % 3],[3 % 2,7 % 3]] --solveRationalLinearEqsAll :: Solver -> [[Rational]] -> [Rational] -> IO [[Rational]]