Theory of Sequences 
examples/api/cpp/sequences.cpp
 1/******************************************************************************
 2 * Top contributors (to current version):
 3 *   Andres Noetzli, Mathias Preiner, Aina Niemetz
 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 reasoning about sequences with cvc5 via C++ API.
14 */
15
16#include <cvc5/cvc5.h>
17
18#include <iostream>
19
20using namespace cvc5;
21
22int main()
23{
24  Solver slv;
25
26  // Set the logic
27  slv.setLogic("QF_SLIA");
28  // Produce models
29  slv.setOption("produce-models", "true");
30  // The option strings-exp is needed
31  slv.setOption("strings-exp", "true");
32  // Set output language to SMTLIB2
33  slv.setOption("output-language", "smt2");
34
35  // Sequence sort
36  Sort intSeq = slv.mkSequenceSort(slv.getIntegerSort());
37
38  // Sequence variables
39  Term x = slv.mkConst(intSeq, "x");
40  Term y = slv.mkConst(intSeq, "y");
41
42  // Empty sequence
43  Term empty = slv.mkEmptySequence(slv.getIntegerSort());
44  // Sequence concatenation: x.y.empty
45  Term concat = slv.mkTerm(Kind::SEQ_CONCAT, {x, y, empty});
46  // Sequence length: |x.y.empty|
47  Term concat_len = slv.mkTerm(Kind::SEQ_LENGTH, {concat});
48  // |x.y.empty| > 1
49  Term formula1 = slv.mkTerm(Kind::GT, {concat_len, slv.mkInteger(1)});
50  // Sequence unit: seq(1)
51  Term unit = slv.mkTerm(Kind::SEQ_UNIT, {slv.mkInteger(1)});
52  // x = seq(1)
53  Term formula2 = slv.mkTerm(Kind::EQUAL, {x, unit});
54
55  // Make a query
56  Term q = slv.mkTerm(Kind::AND, {formula1, formula2});
57
58  // check sat
59  Result result = slv.checkSatAssuming(q);
60  std::cout << "cvc5 reports: " << q << " is " << result << "." << std::endl;
61
62  if (result.isSat())
63  {
64    std::cout << "  x = " << slv.getValue(x) << std::endl;
65    std::cout << "  y = " << slv.getValue(y) << std::endl;
66  }
67}
            examples/api/java/Sequences.java
 1/******************************************************************************
 2 * Top contributors (to current version):
 3 *   Mudathir Mohamed, Andres Noetzli
 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 reasoning about sequences with cvc5 via C++ API.
14 */
15
16import static io.github.cvc5.Kind.*;
17
18import io.github.cvc5.*;
19
20public class Sequences
21{
22  public static void main(String args[]) throws CVC5ApiException
23  {
24    Solver slv = new Solver();
25    {
26      // Set the logic
27      slv.setLogic("QF_SLIA");
28      // Produce models
29      slv.setOption("produce-models", "true");
30      // The option strings-exp is needed
31      slv.setOption("strings-exp", "true");
32      // Set output language to SMTLIB2
33      slv.setOption("output-language", "smt2");
34
35      // Sequence sort
36      Sort intSeq = slv.mkSequenceSort(slv.getIntegerSort());
37
38      // Sequence variables
39      Term x = slv.mkConst(intSeq, "x");
40      Term y = slv.mkConst(intSeq, "y");
41
42      // Empty sequence
43      Term empty = slv.mkEmptySequence(slv.getIntegerSort());
44      // Sequence concatenation: x.y.empty
45      Term concat = slv.mkTerm(SEQ_CONCAT, x, y, empty);
46      // Sequence length: |x.y.empty|
47      Term concat_len = slv.mkTerm(SEQ_LENGTH, concat);
48      // |x.y.empty| > 1
49      Term formula1 = slv.mkTerm(GT, concat_len, slv.mkInteger(1));
50      // Sequence unit: seq(1)
51      Term unit = slv.mkTerm(SEQ_UNIT, slv.mkInteger(1));
52      // x = seq(1)
53      Term formula2 = slv.mkTerm(EQUAL, x, unit);
54
55      // Make a query
56      Term q = slv.mkTerm(AND, formula1, formula2);
57
58      // check sat
59      Result result = slv.checkSatAssuming(q);
60      System.out.println("cvc5 reports: " + q + " is " + result + ".");
61
62      if (result.isSat())
63      {
64        System.out.println("  x = " + slv.getValue(x));
65        System.out.println("  y = " + slv.getValue(y));
66      }
67    }
68    Context.deletePointers();
69  }
70}
            examples/api/python/sequences.py
 1#!/usr/bin/env python
 2###############################################################################
 3# Top contributors (to current version):
 4#   Andres Noetzli, Makai Mann, Aina Niemetz
 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 strings solver
15# through the Python API. This is a direct translation of sequences.cpp.
16##
17
18import cvc5
19from cvc5 import Kind
20
21if __name__ == "__main__":
22    slv = cvc5.Solver()
23    # Set the logic
24    slv.setLogic("QF_SLIA")
25    # Produce models
26    slv.setOption("produce-models", "true")
27    # The option strings-exp is needed
28    slv.setOption("strings-exp", "true")
29    # Set output language to SMTLIB2
30    slv.setOption("output-language", "smt2")
31
32    # Sequence sort
33    int_seq = slv.mkSequenceSort(slv.getIntegerSort())
34
35    # Sequence variables
36    x = slv.mkConst(int_seq, "x")
37    y = slv.mkConst(int_seq, "y")
38
39    # Empty sequence
40    empty = slv.mkEmptySequence(slv.getIntegerSort())
41    # Sequence concatenation: x.y.empty
42    concat = slv.mkTerm(Kind.SEQ_CONCAT, x, y, empty)
43    # Sequence length: |x.y.empty|
44    concat_len = slv.mkTerm(Kind.SEQ_LENGTH, concat)
45    # |x.y.empty| > 1
46    formula1 = slv.mkTerm(Kind.GT, concat_len, slv.mkInteger(1))
47    # Sequence unit: seq(1)
48    unit = slv.mkTerm(Kind.SEQ_UNIT, slv.mkInteger(1))
49    # x = seq(1)
50    formula2 = slv.mkTerm(Kind.EQUAL, x, unit)
51
52    # Make a query
53    q = slv.mkTerm(Kind.AND, formula1, formula2)
54
55    # Check satisfiability
56    result = slv.checkSatAssuming(q)
57    print("cvc5 reports:", q, "is", result)
58
59    if result:
60        print("x = {}".format(slv.getValue(x)))
61        print("y = {}".format(slv.getValue(y)))
            examples/api/smtlib/sequences.smt2
 1(set-logic QF_SLIA)
 2(set-option :produce-models true)
 3
 4; create integer sequence constants
 5(declare-const x (Seq Int))
 6(declare-const y (Seq Int))
 7
 8; |x.y.empty| > 1
 9(assert (> (seq.len (seq.++ x y (as seq.empty (Seq Int)))) 1))
10; x = seq(1)
11(assert (= x (seq.unit 1)))
12
13(check-sat)
14(get-value (x y))