Theory of Linear Arithmetic
This example asserts three constraints over an integer variable
x
and a real variable
y
.
Firstly, it checks that these constraints entail an upper bound on the difference
y
-
x
<=
2/3
.
Secondly, it checks that this bound is tight by asserting
y
-
x
=
2/3
and checking for satisfiability.
The two checks are separated by using
push
and
pop
.
examples/api/cpp/linear_arith.cpp
1 /******************************************************************************
2 * Top contributors (to current version):
3 * Aina Niemetz, Tim King, Mathias Preiner
4 *
5 * This file is part of the cvc5 project.
6 *
7 * Copyright (c) 2009-2022 by the authors listed in the file AUTHORS
8 * in the top-level source directory and their institutional affiliations.
9 * All rights reserved. See the file COPYING in the top-level source
10 * directory for licensing information.
11 * ****************************************************************************
12 *
13 * A simple demonstration of the linear arithmetic solving capabilities and
14 * the push pop of cvc5. This also gives an example option.
15 */
16
17 #include <iostream>
18
19 #include <cvc5/cvc5.h>
20
21 using namespace std;
22 using namespace cvc5;
23
24 int main()
25 {
26 Solver slv;
27 slv.setLogic("QF_LIRA"); // Set the logic
28
29 // Prove that if given x (Integer) and y (Real) then
30 // the maximum value of y - x is 2/3
31
32 // Sorts
33 Sort real = slv.getRealSort();
34 Sort integer = slv.getIntegerSort();
35
36 // Variables
37 Term x = slv.mkConst(integer, "x");
38 Term y = slv.mkConst(real, "y");
39
40 // Constants
41 Term three = slv.mkInteger(3);
42 Term neg2 = slv.mkInteger(-2);
43 Term two_thirds = slv.mkReal(2, 3);
44
45 // Terms
46 Term three_y = slv.mkTerm(MULT, {three, y});
47 Term diff = slv.mkTerm(SUB, {y, x});
48
49 // Formulas
50 Term x_geq_3y = slv.mkTerm(GEQ, {x, three_y});
51 Term x_leq_y = slv.mkTerm(LEQ, {x, y});
52 Term neg2_lt_x = slv.mkTerm(LT, {neg2, x});
53
54 Term assertions = slv.mkTerm(AND, {x_geq_3y, x_leq_y, neg2_lt_x});
55
56 cout << "Given the assertions " << assertions << endl;
57 slv.assertFormula(assertions);
58
59
60 slv.push();
61 Term diff_leq_two_thirds = slv.mkTerm(LEQ, {diff, two_thirds});
62 cout << "Prove that " << diff_leq_two_thirds << " with cvc5." << endl;
63 cout << "cvc5 should report UNSAT." << endl;
64 cout << "Result from cvc5 is: "
65 << slv.checkSatAssuming(diff_leq_two_thirds.notTerm()) << endl;
66 slv.pop();
67
68 cout << endl;
69
70 slv.push();
71 Term diff_is_two_thirds = slv.mkTerm(EQUAL, {diff, two_thirds});
72 slv.assertFormula(diff_is_two_thirds);
73 cout << "Show that the assertions are consistent with " << endl;
74 cout << diff_is_two_thirds << " with cvc5." << endl;
75 cout << "cvc5 should report SAT." << endl;
76 cout << "Result from cvc5 is: " << slv.checkSat() << endl;
77 slv.pop();
78
79 cout << "Thus the maximum value of (y - x) is 2/3."<< endl;
80
81 return 0;
82 }
examples/api/java/LinearArith.java
1 /******************************************************************************
2 * Top contributors (to current version):
3 * Mudathir Mohamed, Morgan Deters, Tim King
4 *
5 * This file is part of the cvc5 project.
6 *
7 * Copyright (c) 2009-2022 by the authors listed in the file AUTHORS
8 * in the top-level source directory and their institutional affiliations.
9 * All rights reserved. See the file COPYING in the top-level source
10 * directory for licensing information.
11 * ****************************************************************************
12 *
13 * A simple demonstration of the linear arithmetic solving capabilities and
14 * the push pop of cvc5. This also gives an example option.
15 */
16
17 import io.github.cvc5.*;
18 public class LinearArith
19 {
20 public static void main(String args[]) throws CVC5ApiException
21 {
22 try (Solver slv = new Solver())
23 {
24 slv.setLogic("QF_LIRA"); // Set the logic
25
26 // Prove that if given x (Integer) and y (Real) then
27 // the maximum value of y - x is 2/3
28
29 // Sorts
30 Sort real = slv.getRealSort();
31 Sort integer = slv.getIntegerSort();
32
33 // Variables
34 Term x = slv.mkConst(integer, "x");
35 Term y = slv.mkConst(real, "y");
36
37 // Constants
38 Term three = slv.mkInteger(3);
39 Term neg2 = slv.mkInteger(-2);
40 Term two_thirds = slv.mkReal(2, 3);
41
42 // Terms
43 Term three_y = slv.mkTerm(Kind.MULT, three, y);
44 Term diff = slv.mkTerm(Kind.SUB, y, x);
45
46 // Formulas
47 Term x_geq_3y = slv.mkTerm(Kind.GEQ, x, three_y);
48 Term x_leq_y = slv.mkTerm(Kind.LEQ, x, y);
49 Term neg2_lt_x = slv.mkTerm(Kind.LT, neg2, x);
50
51 Term assertions = slv.mkTerm(Kind.AND, x_geq_3y, x_leq_y, neg2_lt_x);
52
53 System.out.println("Given the assertions " + assertions);
54 slv.assertFormula(assertions);
55
56 slv.push();
57 Term diff_leq_two_thirds = slv.mkTerm(Kind.LEQ, diff, two_thirds);
58 System.out.println("Prove that " + diff_leq_two_thirds + " with cvc5.");
59 System.out.println("cvc5 should report UNSAT.");
60 System.out.println(
61 "Result from cvc5 is: " + slv.checkSatAssuming(diff_leq_two_thirds.notTerm()));
62 slv.pop();
63
64 System.out.println();
65
66 slv.push();
67 Term diff_is_two_thirds = slv.mkTerm(Kind.EQUAL, diff, two_thirds);
68 slv.assertFormula(diff_is_two_thirds);
69 System.out.println("Show that the assertions are consistent with ");
70 System.out.println(diff_is_two_thirds + " with cvc5.");
71 System.out.println("cvc5 should report SAT.");
72 System.out.println("Result from cvc5 is: " + slv.checkSat());
73 slv.pop();
74
75 System.out.println("Thus the maximum value of (y - x) is 2/3.");
76 }
77 }
78 }
examples/api/python/pythonic/linear_arith.py
1 from cvc5.pythonic import *
2
3 slv = SolverFor('QF_LIRA')
4
5 x = Int('x')
6 y = Real('y')
7
8 slv += And(x >= 3 * y, x <= y, -2 < x)
9 slv.push()
10 print(slv.check(y-x <= 2/3))
11 slv.pop()
12 slv.push()
13 slv += y-x == 2/3
14 print(slv.check())
15 slv.pop()
examples/api/python/linear_arith.py
1 #!/usr/bin/env python
2 ###############################################################################
3 # Top contributors (to current version):
4 # Makai Mann, Aina Niemetz, Mathias Preiner
5 #
6 # This file is part of the cvc5 project.
7 #
8 # Copyright (c) 2009-2022 by the authors listed in the file AUTHORS
9 # in the top-level source directory and their institutional affiliations.
10 # All rights reserved. See the file COPYING in the top-level source
11 # directory for licensing information.
12 # #############################################################################
13 #
14 # A simple demonstration of the solving capabilities of the cvc5 linear
15 # arithmetic solver through the Python API. This is a direct translation of
16 # linear_arith-new.cpp.
17 ##
18
19 import cvc5
20 from cvc5 import Kind
21
22 if __name__ == "__main__":
23 slv = cvc5.Solver()
24 slv.setLogic("QF_LIRA")
25
26 # Prove that if given x (Integer) and y (Real) and some constraints
27 # then the maximum value of y - x is 2/3
28
29 # Sorts
30 real = slv.getRealSort()
31 integer = slv.getIntegerSort()
32
33 # Variables
34 x = slv.mkConst(integer, "x")
35 y = slv.mkConst(real, "y")
36
37 # Constants
38 three = slv.mkInteger(3)
39 neg2 = slv.mkInteger(-2)
40 two_thirds = slv.mkReal(2, 3)
41
42 # Terms
43 three_y = slv.mkTerm(Kind.MULT, three, y)
44 diff = slv.mkTerm(Kind.SUB, y, x)
45
46 # Formulas
47 x_geq_3y = slv.mkTerm(Kind.GEQ, x, three_y)
48 x_leq_y = slv.mkTerm(Kind.LEQ, x ,y)
49 neg2_lt_x = slv.mkTerm(Kind.LT, neg2, x)
50
51 assertions = slv.mkTerm(Kind.AND, x_geq_3y, x_leq_y, neg2_lt_x)
52
53 print("Given the assertions", assertions)
54 slv.assertFormula(assertions)
55
56 slv.push()
57 diff_leq_two_thirds = slv.mkTerm(Kind.LEQ, diff, two_thirds)
58 print("Prove that", diff_leq_two_thirds, "with cvc5")
59 print("cvc5 should report UNSAT")
60 print("Result from cvc5 is:",
61 slv.checkSatAssuming(diff_leq_two_thirds.notTerm()))
62 slv.pop()
63
64 print()
65
66 slv.push()
67 diff_is_two_thirds = slv.mkTerm(Kind.EQUAL, diff, two_thirds)
68 slv.assertFormula(diff_is_two_thirds)
69 print("Show that the assertions are consistent with\n", diff_is_two_thirds, "with cvc5")
70 print("cvc5 should report SAT")
71 print("Result from cvc5 is:", slv.checkSat())
72 slv.pop()
examples/api/smtlib/linear_arith.smt2
1 (set-logic QF_LIRA)
2 (declare-const x Int)
3 (declare-const y Real)
4 (assert
5 (and
6 (>= x (* 3 y))
7 (<= x y)
8 (< (- 2) x)
9 )
10 )
11 (push 1)
12 (echo "Checking entailement by asserting the negation")
13 (echo "Unsat == ENTAILED")
14 (assert (not (<= (- y x) (/ 2 3))))
15 (check-sat)
16 (pop 1)
17 (push 1)
18 (echo "Checking that the assertions are consistent")
19 (assert (= (- y x) (/ 2 3)))
20 (check-sat)
21 (pop 1)