Remove front-end support for Chain (#3767)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Thu, 20 Feb 2020 20:49:02 +0000 (14:49 -0600)
committerGitHub <noreply@github.com>
Thu, 20 Feb 2020 20:49:02 +0000 (14:49 -0600)
21 files changed:
src/CMakeLists.txt
src/api/cvc4cpp.cpp
src/api/cvc4cpp.h
src/api/cvc4cppkind.h
src/expr/CMakeLists.txt
src/expr/chain.h [deleted file]
src/expr/chain.i [deleted file]
src/parser/parser.cpp
src/parser/parser.h
src/parser/smt2/smt2.cpp
src/parser/tptp/tptp.cpp
src/printer/cvc/cvc_printer.cpp
src/printer/smt2/smt2_printer.cpp
src/proof/theory_proof.cpp
src/theory/builtin/kinds
src/theory/builtin/theory_builtin_rewriter.cpp
src/theory/builtin/theory_builtin_rewriter.h
src/theory/builtin/theory_builtin_type_rules.h
test/regress/regress0/printer/let_shadowing.smt2
test/unit/api/op_black.h
test/unit/api/solver_black.h

index 871cb2f99bfd80bec8614a43cda2a399f73171d6..1063452cbd82095a10c2f4cf29a8487ed4176b62 100644 (file)
@@ -893,7 +893,6 @@ install(FILES
           expr/array.h
           expr/array_store_all.h
           expr/ascription_type.h
-          expr/chain.h
           expr/datatype.h
           expr/emptyset.h
           expr/expr_iomanip.h
index 7bdc5008b53c8236cd141979d5821b351e4f05e2..7f8fc80970adb3921d4aacfa75851784822b193c 100644 (file)
@@ -76,7 +76,6 @@ const static std::unordered_map<Kind, CVC4::Kind, KindHashFunction> s_kinds{
     {VARIABLE, CVC4::Kind::BOUND_VARIABLE},
     {LAMBDA, CVC4::Kind::LAMBDA},
     {CHOICE, CVC4::Kind::CHOICE},
-    {CHAIN, CVC4::Kind::CHAIN},
     /* Boolean ------------------------------------------------------------- */
     {CONST_BOOLEAN, CVC4::Kind::CONST_BOOLEAN},
     {NOT, CVC4::Kind::NOT},
@@ -313,8 +312,6 @@ const static std::unordered_map<CVC4::Kind, Kind, CVC4::kind::KindHashFunction>
         {CVC4::Kind::BOUND_VARIABLE, VARIABLE},
         {CVC4::Kind::LAMBDA, LAMBDA},
         {CVC4::Kind::CHOICE, CHOICE},
-        {CVC4::Kind::CHAIN, CHAIN},
-        {CVC4::Kind::CHAIN_OP, CHAIN},
         /* Boolean --------------------------------------------------------- */
         {CVC4::Kind::CONST_BOOLEAN, CONST_BOOLEAN},
         {CVC4::Kind::NOT, NOT},
@@ -567,8 +564,7 @@ const static std::unordered_map<CVC4::Kind, Kind, CVC4::kind::KindHashFunction>
 
 /* Set of kinds for indexed operators */
 const static std::unordered_set<Kind, KindHashFunction> s_indexed_kinds(
-    {CHAIN,
-     RECORD_UPDATE,
+    {RECORD_UPDATE,
      DIVISIBLE,
      BITVECTOR_REPEAT,
      BITVECTOR_ZERO_EXTEND,
@@ -1146,17 +1142,6 @@ std::string Op::getIndices() const
   return i;
 }
 
-template <>
-Kind Op::getIndices() const
-{
-  CVC4_API_CHECK_NOT_NULL;
-  CVC4_API_CHECK(!d_expr->isNull())
-      << "Expecting a non-null internal expression. This Op is not indexed.";
-  Kind kind = intToExtKind(d_expr->getKind());
-  CVC4_API_KIND_CHECK_EXPECTED(kind == CHAIN, kind) << "CHAIN";
-  return intToExtKind(d_expr->getConst<Chain>().getOperator());
-}
-
 template <>
 uint32_t Op::getIndices() const
 {
@@ -3195,18 +3180,6 @@ Op Solver::mkOp(Kind kind) const
   CVC4_API_SOLVER_TRY_CATCH_END
 }
 
-Op Solver::mkOp(Kind kind, Kind k) const
-{
-  CVC4_API_SOLVER_TRY_CATCH_BEGIN;
-  CVC4_API_KIND_CHECK_EXPECTED(kind == CHAIN, kind) << "CHAIN";
-
-  return Op(
-      kind,
-      *mkValHelper<CVC4::Chain>(CVC4::Chain(extToIntKind(k))).d_expr.get());
-
-  CVC4_API_SOLVER_TRY_CATCH_END;
-}
-
 Op Solver::mkOp(Kind kind, const std::string& arg) const
 {
   CVC4_API_SOLVER_TRY_CATCH_BEGIN;
index 79c02c031d852a65352c7ec1f7439468fc58a3c7..9820aeb19a0e25f4aaeb0801dca9e5df644143ee 100644 (file)
@@ -1925,15 +1925,6 @@ class CVC4_PUBLIC Solver
    */
   Op mkOp(Kind kind) const;
 
-  /**
-   * Create operator of kind:
-   *   - CHAIN
-   * See enum Kind for a description of the parameters.
-   * @param kind the kind of the operator
-   * @param k the kind argument to this operator
-   */
-  Op mkOp(Kind kind, Kind k) const;
-
   /**
    * Create operator of kind:
    *   - RECORD_UPDATE
index 213dec56aeb379b241d7e349a5c2eb927e00e1e7..dcb05be17e07b63d6497c65387941dde4264bfdd 100644 (file)
@@ -142,25 +142,6 @@ enum CVC4_PUBLIC Kind : int32_t
    *   mkTerm(Kind kind, const std::vector<Term>& children)
    */
   CHOICE,
-  /**
-   * Chained operator.
-   * Parameters: 1
-   *   -[1]: Kind of the binary operation
-   * Create with:
-   *   mkOp(Kind opkind, Kind kind)
-
-   * Apply chained operation.
-   * Parameters: n > 1
-   *   -[1]: Op of kind CHAIN (represents a binary op)
-   *   -[2]..[n]: Arguments to that operator
-   * Create with:
-   *   mkTerm(Op op, Term child1, Term child2)
-   *   mkTerm(Op op, Term child1, Term child2, Term child3)
-   *   mkTerm(Op op, const std::vector<Term>& children)
-   * Turned into a conjunction of binary applications of the operator on
-   * adjoining parameters.
-   */
-  CHAIN,
 
   /* Boolean --------------------------------------------------------------- */
 
index f6b48048f262d0fa5f34e0f9c480d1ea62b8cadd..8357102b0f4bae540bccb966268eccabf10de19e 100644 (file)
@@ -7,7 +7,6 @@ libcvc4_add_sources(
   attribute.cpp
   attribute_internals.h
   attribute_unique_id.h
-  chain.h
   emptyset.cpp
   emptyset.h
   expr_iomanip.cpp
diff --git a/src/expr/chain.h b/src/expr/chain.h
deleted file mode 100644 (file)
index 9df819b..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*********************                                                        */
-/*! \file chain.h
- ** \verbatim
- ** Top contributors (to current version):
- **   Morgan Deters
- ** This file is part of the CVC4 project.
- ** Copyright (c) 2009-2019 by the authors listed in the file AUTHORS
- ** in the top-level source directory) and their institutional affiliations.
- ** All rights reserved.  See the file COPYING in the top-level source
- ** directory for licensing information.\endverbatim
- **
- ** \brief [[ Add one-line brief description here ]]
- **
- ** [[ Add lengthier description here ]]
- ** \todo document this file
- **/
-
-#include "cvc4_public.h"
-
-#ifndef CVC4__CHAIN_H
-#define CVC4__CHAIN_H
-
-#include "expr/kind.h"
-#include <iostream>
-
-namespace CVC4 {
-
-/** A class to represent a chained, built-in operator. */
-class CVC4_PUBLIC Chain {
-  Kind d_kind;
-public:
-  explicit Chain(Kind k) : d_kind(k) { }
-  bool operator==(const Chain& ch) const { return d_kind == ch.d_kind; }
-  bool operator!=(const Chain& ch) const { return d_kind != ch.d_kind; }
-  Kind getOperator() const { return d_kind; }
-};/* class Chain */
-
-inline std::ostream& operator<<(std::ostream& out, const Chain& ch) CVC4_PUBLIC;
-inline std::ostream& operator<<(std::ostream& out, const Chain& ch) {
-  return out << ch.getOperator();
-}
-
-struct CVC4_PUBLIC ChainHashFunction {
-  size_t operator()(const Chain& ch) const {
-    return kind::KindHashFunction()(ch.getOperator());
-  }
-};/* struct ChainHashFunction */
-
-}/* CVC4 namespace */
-
-#endif  /* CVC4__CHAIN_H */
diff --git a/src/expr/chain.i b/src/expr/chain.i
deleted file mode 100644 (file)
index 8de1665..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-%{
-#include "expr/chain.h"
-%}
-
-%rename(equals) CVC4::Chain::operator==(const Chain&) const;
-%ignore CVC4::Chain::operator!=(const Chain&) const;
-
-%ignore CVC4::operator<<(std::ostream&, const Chain&);
-
-%rename(apply) CVC4::ChainHashFunction::operator()(const CVC4::Chain&) const;
-
-%include "expr/chain.h"
index 32d55571858d5ccbcf1a27f9b285d2094872bdd3..664fa209d7b6a9e11012acd13f0d9103c201b9c3 100644 (file)
@@ -515,6 +515,22 @@ Expr Parser::mkHoApply(Expr expr, std::vector<Expr>& args)
   return expr;
 }
 
+api::Term Parser::mkChain(api::Kind k, const std::vector<api::Term>& args)
+{
+  if (args.size() == 2)
+  {
+    // if this is the case exactly 1 pair will be generated so the
+    // AND is not required
+    return d_solver->mkTerm(k, args[0], args[1]);
+  }
+  std::vector<api::Term> children;
+  for (size_t i = 0, nargsmo = args.size() - 1; i < nargsmo; i++)
+  {
+    children.push_back(d_solver->mkTerm(k, args[i], args[i + 1]));
+  }
+  return d_solver->mkTerm(api::AND, children);
+}
+
 bool Parser::isDeclared(const std::string& name, SymbolType type) {
   switch (type) {
     case SYM_VARIABLE:
index ecf1e2961154e31e35199112e2f2fb206de02e39..cd70fde0f59a9808e65f575aa05876d5a6b86010 100644 (file)
@@ -24,6 +24,7 @@
 #include <set>
 #include <string>
 
+#include "api/cvc4cpp.h"
 #include "expr/expr.h"
 #include "expr/expr_stream.h"
 #include "expr/kind.h"
@@ -677,6 +678,16 @@ public:
    */
   Expr mkHoApply(Expr expr, std::vector<Expr>& args);
 
+  /** make chain
+   *
+   * Given a kind k and argument terms t_1, ..., t_n, this returns the
+   * conjunction of:
+   *  (k t_1 t_2) .... (k t_{n-1} t_n)
+   * It is expected that k is a kind denoting a predicate, and args is a list
+   * of terms of size >= 2 such that the terms above are well-typed.
+   */
+  api::Term mkChain(api::Kind k, const std::vector<api::Term>& args);
+
   /**
    * Add an operator to the current legal set.
    *
index f3b66643a5b8319fe656417b301b29d2b9302c62..11dedb25954d8dc43b363a753168aeba63a29d0c 100644 (file)
@@ -1887,7 +1887,9 @@ Expr Smt2::applyParseOp(ParseOp& p, std::vector<Expr>& args)
                || kind == kind::LEQ || kind == kind::GEQ)
       {
         /* "chainable", but CVC4 internally only supports 2 args */
-        return em->mkExpr(em->mkConst(Chain(kind)), args);
+        api::Term ret =
+            mkChain(intToExtKind(kind), api::exprVectorToTerms(args));
+        return ret.getExpr();
       }
     }
 
index 71a3e4bee9be55d260c14ad7cea0425e26833736..bf699ae3c57491e70e8be47c0cfbd5f4f5a81114 100644 (file)
@@ -326,7 +326,9 @@ Expr Tptp::applyParseOp(ParseOp& p, std::vector<Expr>& args)
           || kind == kind::LEQ || kind == kind::GEQ)
       {
         /* "chainable", but CVC4 internally only supports 2 args */
-        return em->mkExpr(em->mkConst(Chain(kind)), args);
+        api::Term ret =
+            mkChain(intToExtKind(kind), api::exprVectorToTerms(args));
+        return ret.getExpr();
       }
     }
 
index f8448f1e9a309b3f9fbe48e816a44fd6ff289a06..f3f43220ca1ddc48397ab755e971e1d79586c87d 100644 (file)
@@ -283,8 +283,8 @@ void CvcPrinter::toStream(
       out << ")";
       return;
       break;
-    case kind::CHAIN:
-    case kind::DISTINCT: // chain and distinct not supported directly in CVC4, blast them away with the rewriter
+    case kind::DISTINCT:
+      // distinct not supported directly, blast it away with the rewriter
       toStream(out, theory::Rewriter::rewrite(n), depth, types, true);
       return;
     case kind::SORT_TYPE:
index bfdaf78529423efe4d69b363e132f46e88d7840a..8153d68568e8fc7d098606c3c4cfd6157ce2f35c 100644 (file)
@@ -193,9 +193,6 @@ void Smt2Printer::toStream(std::ostream& out,
     case kind::BUILTIN:
       out << smtKindString(n.getConst<Kind>(), d_variant);
       break;
-    case kind::CHAIN_OP:
-      out << smtKindString(n.getConst<Chain>().getOperator(), d_variant);
-      break;
     case kind::CONST_RATIONAL: {
       const Rational& r = n.getConst<Rational>();
       toStreamRational(
@@ -474,7 +471,6 @@ void Smt2Printer::toStream(std::ostream& out,
     out << smtKindString(k, d_variant) << " ";
     parametricTypeChildren = true;
     break;
-  case kind::CHAIN: break;
   case kind::FUNCTION_TYPE:
     out << "->";
     for (Node nc : n)
@@ -1027,7 +1023,6 @@ static string smtKindString(Kind k, Variant v)
     // builtin theory
   case kind::EQUAL: return "=";
   case kind::DISTINCT: return "distinct";
-  case kind::CHAIN: break;
   case kind::SEXPR: break;
 
     // bool theory
index 88a53062a31dc6a064fc4c2570c5c3997ac8bd8d..7e2ed84b171be93597f9301e9b03602b664f4b76 100644 (file)
@@ -1050,42 +1050,6 @@ void LFSCTheoryProofEngine::printCoreTerm(Expr term,
     return;
   }
 
-  case kind::CHAIN: {
-    // LFSC doesn't allow declarations with variable numbers of
-    // arguments, so we have to flatten chained operators, like =.
-    Kind op = term.getOperator().getConst<Chain>().getOperator();
-    std::string op_str;
-    bool booleanCase = false;
-    if (op==kind::EQUAL && term[0].getType().isBoolean()) {
-      booleanCase = term[0].getType().isBoolean();
-      op_str = "iff";
-    } else {
-      op_str = utils::toLFSCKind(op);
-    }
-    size_t n = term.getNumChildren();
-    std::ostringstream paren;
-    for(size_t i = 1; i < n; ++i) {
-      if(i + 1 < n) {
-        os << "(" << utils::toLFSCKind(kind::AND) << " ";
-        paren << ")";
-      }
-      os << "(" << op_str << " ";
-      if (booleanCase && printsAsBool(term[i - 1])) os << "(p_app ";
-      printBoundTerm(term[i - 1], os, map);
-      if (booleanCase && printsAsBool(term[i - 1])) os << ")";
-      os << " ";
-      if (booleanCase && printsAsBool(term[i])) os << "(p_app ";
-      printBoundTerm(term[i], os, map);
-      if (booleanCase && printsAsBool(term[i])) os << ")";
-      os << ")";
-      if(i + 1 < n) {
-        os << " ";
-      }
-    }
-    os << paren.str();
-    return;
-  }
-
   default: Unhandled() << k;
   }
 }
index 15891dfadb73bbd00fbfaef372888a8a18358509..c90419def8f803ed88e3063b072cf8f4d00d3014 100644 (file)
@@ -300,13 +300,6 @@ operator LAMBDA 2 "a lambda expression; first parameter is a BOUND_VAR_LIST, sec
 
 operator CHOICE 2 "a Hilbert choice (epsilon) expression; first parameter is a BOUND_VAR_LIST, second is the Hilbert choice body"
 
-parameterized CHAIN CHAIN_OP 2: "chained operator (N-ary), turned into a conjunction of binary applications of the operator on adjoining parameters; first parameter is a CHAIN_OP representing a binary operator, rest are arguments to that operator"
-constant CHAIN_OP \
-    ::CVC4::Chain \
-    ::CVC4::ChainHashFunction \
-    "expr/chain.h" \
-    "the chained operator; payload is an instance of the CVC4::Chain class"
-
 constant TYPE_CONSTANT \
     ::CVC4::TypeConstant \
     ::CVC4::TypeConstantHashFunction \
@@ -334,8 +327,6 @@ typerule DISTINCT ::CVC4::theory::builtin::DistinctTypeRule
 typerule SEXPR ::CVC4::theory::builtin::SExprTypeRule
 typerule LAMBDA ::CVC4::theory::builtin::LambdaTypeRule
 typerule CHOICE ::CVC4::theory::builtin::ChoiceTypeRule
-typerule CHAIN ::CVC4::theory::builtin::ChainTypeRule
-typerule CHAIN_OP ::CVC4::theory::builtin::ChainedOperatorTypeRule
 
 # lambda expressions that are isomorphic to array constants can be considered constants
 construle LAMBDA ::CVC4::theory::builtin::LambdaTypeRule
index d9fe2fecc2d4a75f26ffb4a266c26ee31ff78dcb..15c312080d346f1b0db85ed52fea1bdc15b86133 100644 (file)
@@ -18,7 +18,6 @@
 #include "theory/builtin/theory_builtin_rewriter.h"
 
 #include "expr/attribute.h"
-#include "expr/chain.h"
 #include "expr/node_algorithm.h"
 #include "theory/rewriter.h"
 
@@ -53,24 +52,6 @@ Node TheoryBuiltinRewriter::blastDistinct(TNode in) {
   return out;
 }
 
-Node TheoryBuiltinRewriter::blastChain(TNode in) {
-  Assert(in.getKind() == kind::CHAIN);
-
-  Kind chainedOp = in.getOperator().getConst<Chain>().getOperator();
-
-  if(in.getNumChildren() == 2) {
-    // if this is the case exactly 1 pair will be generated so the
-    // AND is not required
-    return NodeManager::currentNM()->mkNode(chainedOp, in[0], in[1]);
-  } else {
-    NodeBuilder<> conj(kind::AND);
-    for(TNode::iterator i = in.begin(), j = i + 1; j != in.end(); ++i, ++j) {
-      conj << NodeManager::currentNM()->mkNode(chainedOp, *i, *j);
-    }
-    return conj;
-  }
-}
-
 RewriteResponse TheoryBuiltinRewriter::postRewrite(TNode node) {
   if( node.getKind()==kind::LAMBDA ){
     Trace("builtin-rewrite") << "Rewriting lambda " << node << "..." << std::endl;
index 60a8f29f0ebbcb7b8b4a9cd77fa89bed9c5e032b..4b75d7e3a750ff2b9986535a8d42436bb1db033d 100644 (file)
@@ -32,18 +32,6 @@ class TheoryBuiltinRewriter : public TheoryRewriter
   static Node blastDistinct(TNode node);
 
  public:
-  /**
-   * Takes a chained application of a binary operator and returns a conjunction
-   * of binary applications of that operator.
-   *
-   * For example:
-   *
-   * (= x y z) ---> (and (= x y) (= y z))
-   *
-   * @param node A node that is a chained application of a binary operator
-   * @return A conjunction of binary applications of the chained operator
-   */
-  static Node blastChain(TNode node);
 
   static inline RewriteResponse doRewrite(TNode node)
   {
@@ -51,7 +39,6 @@ class TheoryBuiltinRewriter : public TheoryRewriter
     {
       case kind::DISTINCT:
         return RewriteResponse(REWRITE_DONE, blastDistinct(node));
-      case kind::CHAIN: return RewriteResponse(REWRITE_DONE, blastChain(node));
       default: return RewriteResponse(REWRITE_DONE, node);
     }
   }
index bb88b64ee5eb3542c7ed818e123cc693cdbcd8c0..d49edbc8ce3f3a5aeb6a947e670c486e7dc17b2b 100644 (file)
@@ -194,59 +194,6 @@ class ChoiceTypeRule
   }
 }; /* class ChoiceTypeRule */
 
-class ChainTypeRule {
- public:
-  inline static TypeNode computeType(NodeManager* nodeManager, TNode n, bool check) {
-    Assert(n.getKind() == kind::CHAIN);
-
-    if(!check) {
-      return nodeManager->booleanType();
-    }
-
-    TypeNode tn;
-    try {
-      tn = nodeManager->getType(TheoryBuiltinRewriter::blastChain(n), check);
-    } catch(TypeCheckingExceptionPrivate& e) {
-      std::stringstream ss;
-      ss << "Cannot typecheck the expansion of chained operator `" << n.getOperator() << "':"
-         << std::endl;
-      // indent the sub-exception for clarity
-      std::stringstream ss2;
-      ss2 << e;
-      std::string eStr = ss2.str();
-      for(size_t i = eStr.find('\n'); i != std::string::npos; i = eStr.find('\n', i)) {
-        eStr.insert(++i, "| ");
-      }
-      ss << "| " << eStr;
-      throw TypeCheckingExceptionPrivate(n, ss.str());
-    }
-
-    // This check is intentionally != booleanType() rather than
-    // !(...isBoolean()): if we ever add a type compatible with
-    // Boolean (pseudobooleans or whatever), we have to revisit
-    // the above "!check" case where booleanType() is returned
-    // directly.  Putting this check here will cause a failure if
-    // it's ever relevant.
-    if(tn != nodeManager->booleanType()) {
-      std::stringstream ss;
-      ss << "Chains can only be formed over predicates; "
-         << "the operator here returns `" << tn << "', expected `"
-         << nodeManager->booleanType() << "'.";
-      throw TypeCheckingExceptionPrivate(n, ss.str());
-    }
-
-    return nodeManager->booleanType();
-  }
-};/* class ChainTypeRule */
-
-class ChainedOperatorTypeRule {
- public:
-  inline static TypeNode computeType(NodeManager* nodeManager, TNode n, bool check) {
-    Assert(n.getKind() == kind::CHAIN_OP);
-    return nodeManager->getType(nodeManager->operatorOf(n.getConst<Chain>().getOperator()), check);
-  }
-};/* class ChainedOperatorTypeRule */
-
 class SortProperties {
  public:
   inline static bool isWellFounded(TypeNode type) {
index 9b5ffe747b5a866231b01f8c01819375414be91e..0174798719cacb4b4ddfe3adca24470c8bbd45d9 100644 (file)
@@ -1,9 +1,9 @@
 ; REQUIRES: dumping
 ; COMMAND-LINE: --dump raw-benchmark --preprocess-only
 ; SCRUBBER: grep assert
-; EXPECT: (assert (let ((_let_1 (* x y))) (= _let_1 _let_1 _let_0)))
-; EXPECT: (assert (let ((_let_1 (and a b))) (= _let_1 _let_1 (forall ((_let_0 Int)) (= 0 _let_0) ))))
-; EXPECT: (assert (let ((_let_1 (and a b))) (= _let_1 _let_1 (forall ((x Int)) (forall ((y Int)) (let ((_let_2 (and b a))) (and _let_1 _let_2 _let_2 (= 0 _let_0))) ) ))))
+; EXPECT: (assert (let ((_let_1 (* x y))) (and (= _let_1 _let_1) (= _let_1 _let_0))))
+; EXPECT: (assert (let ((_let_1 (and a b))) (and (= _let_1 _let_1) (= _let_1 (forall ((_let_0 Int)) (= 0 _let_0) )))))
+; EXPECT: (assert (let ((_let_1 (and a b))) (and (= _let_1 _let_1) (= _let_1 (forall ((x Int)) (forall ((y Int)) (let ((_let_2 (and b a))) (and _let_1 _let_2 _let_2 (= 0 _let_0))) ) )))))
 (set-logic NIA)
 (declare-const _let_0 Int)
 (declare-const x Int)
index dcad8b6490668aa95ca5c38ca862b111f749a1ba..6fb7e839cba897bb4ae66725617e4fbb77efbbcf 100644 (file)
@@ -29,7 +29,6 @@ class OpBlack : public CxxTest::TestSuite
   void testIsNull();
   void testOpFromKind();
   void testGetIndicesString();
-  void testGetIndicesKind();
   void testGetIndicesUint();
   void testGetIndicesPairUint();
 
@@ -88,14 +87,6 @@ void OpBlack::testGetIndicesString()
   TS_ASSERT_THROWS(record_update_ot.getIndices<uint32_t>(), CVC4ApiException&);
 }
 
-void OpBlack::testGetIndicesKind()
-{
-  Op chain_ot = d_solver.mkOp(CHAIN, AND);
-  TS_ASSERT(chain_ot.isIndexed());
-  Kind chain_idx = chain_ot.getIndices<Kind>();
-  TS_ASSERT(chain_idx == AND);
-}
-
 void OpBlack::testGetIndicesUint()
 {
   Op bitvector_repeat_ot = d_solver.mkOp(BITVECTOR_REPEAT, 5);
index bf992d2d5807c44346b186c07c604431043f6ebb..aea41a42bedc307bf25ce7e7e3abba546d8cf053 100644 (file)
@@ -461,7 +461,6 @@ void SolverBlack::testMkPosZero()
 void SolverBlack::testMkOp()
 {
   // mkOp(Kind kind, Kind k)
-  TS_ASSERT_THROWS_NOTHING(d_solver->mkOp(CHAIN, EQUAL));
   TS_ASSERT_THROWS(d_solver->mkOp(BITVECTOR_EXTRACT, EQUAL), CVC4ApiException&);
 
   // mkOp(Kind kind, const std::string& arg)
@@ -622,10 +621,10 @@ void SolverBlack::testMkTermFromOp()
   std::vector<Term> v1 = {d_solver->mkReal(1), d_solver->mkReal(2)};
   std::vector<Term> v2 = {d_solver->mkReal(1), Term()};
   std::vector<Term> v3 = {};
+  std::vector<Term> v4 = {d_solver->mkReal(5)};
   // simple operator terms
   Op opterm1 = d_solver->mkOp(BITVECTOR_EXTRACT, 2, 1);
   Op opterm2 = d_solver->mkOp(DIVISIBLE, 1);
-  Op opterm3 = d_solver->mkOp(CHAIN, EQUAL);
   // list datatype
 
   Sort sort = d_solver->mkParamSort("T");
@@ -679,33 +678,33 @@ void SolverBlack::testMkTermFromOp()
       CVC4ApiException&);
 
   // mkTerm(Op op, Term child1, Term child2) const
-  TS_ASSERT_THROWS_NOTHING(
-      d_solver->mkTerm(opterm3, d_solver->mkReal(1), d_solver->mkReal(2)));
+  TS_ASSERT_THROWS(
+      d_solver->mkTerm(opterm2, d_solver->mkReal(1), d_solver->mkReal(2)),
+      CVC4ApiException&);
   TS_ASSERT_THROWS_NOTHING(
       d_solver->mkTerm(APPLY_CONSTRUCTOR,
                        consTerm1,
                        d_solver->mkReal(0),
                        d_solver->mkTerm(APPLY_CONSTRUCTOR, nilTerm1)));
   TS_ASSERT_THROWS(d_solver->mkTerm(opterm1, a, b), CVC4ApiException&);
-  TS_ASSERT_THROWS(d_solver->mkTerm(opterm3, d_solver->mkReal(1), Term()),
+  TS_ASSERT_THROWS(d_solver->mkTerm(opterm2, d_solver->mkReal(1), Term()),
                    CVC4ApiException&);
-  TS_ASSERT_THROWS(d_solver->mkTerm(opterm3, Term(), d_solver->mkReal(1)),
+  TS_ASSERT_THROWS(d_solver->mkTerm(opterm2, Term(), d_solver->mkReal(1)),
                    CVC4ApiException&);
 
   // mkTerm(Op op, Term child1, Term child2, Term child3)
   // const
-  TS_ASSERT_THROWS_NOTHING(d_solver->mkTerm(
-      opterm3, d_solver->mkReal(1), d_solver->mkReal(1), d_solver->mkReal(2)));
   TS_ASSERT_THROWS(d_solver->mkTerm(opterm1, a, b, a), CVC4ApiException&);
   TS_ASSERT_THROWS(
       d_solver->mkTerm(
-          opterm3, d_solver->mkReal(1), d_solver->mkReal(1), Term()),
+          opterm2, d_solver->mkReal(1), d_solver->mkReal(1), Term()),
       CVC4ApiException&);
 
   // mkTerm(Op op, const std::vector<Term>& children) const
-  TS_ASSERT_THROWS_NOTHING(d_solver->mkTerm(opterm3, v1));
-  TS_ASSERT_THROWS(d_solver->mkTerm(opterm3, v2), CVC4ApiException&);
-  TS_ASSERT_THROWS(d_solver->mkTerm(opterm3, v3), CVC4ApiException&);
+  TS_ASSERT_THROWS_NOTHING(d_solver->mkTerm(opterm2, v4));
+  TS_ASSERT_THROWS(d_solver->mkTerm(opterm2, v1), CVC4ApiException&);
+  TS_ASSERT_THROWS(d_solver->mkTerm(opterm2, v2), CVC4ApiException&);
+  TS_ASSERT_THROWS(d_solver->mkTerm(opterm2, v3), CVC4ApiException&);
 }
 
 void SolverBlack::testMkTrue()