Renamed operator CHOICE to WITNESS (#4207)
authormudathirmahgoub <mudathirmahgoub@gmail.com>
Tue, 19 May 2020 21:24:59 +0000 (16:24 -0500)
committerGitHub <noreply@github.com>
Tue, 19 May 2020 21:24:59 +0000 (16:24 -0500)
Renamed operator CHOICE to WITNESS, and removed it from the front end

33 files changed:
src/api/cvc4cpp.cpp
src/api/cvc4cppkind.h
src/expr/expr_manager_template.h
src/expr/node.h
src/expr/node_algorithm.h
src/options/smt_options.toml
src/parser/cvc/Cvc.g
src/parser/smt2/Smt2.g
src/parser/tptp/Tptp.g
src/printer/smt2/smt2_printer.cpp
src/smt/term_formula_removal.cpp
src/smt/term_formula_removal.h
src/theory/arith/nl_model.cpp
src/theory/arith/theory_arith_private.cpp
src/theory/builtin/kinds
src/theory/builtin/theory_builtin.cpp
src/theory/builtin/theory_builtin_rewriter.cpp
src/theory/builtin/theory_builtin_type_rules.h
src/theory/quantifiers/bv_inverter.cpp
src/theory/quantifiers/bv_inverter.h
src/theory/quantifiers/cegqi/ceg_bv_instantiator.cpp
src/theory/quantifiers/cegqi/ceg_instantiator.cpp
src/theory/quantifiers/cegqi/ceg_instantiator.h
src/theory/quantifiers/fmf/bounded_integers.cpp
src/theory/quantifiers/fmf/bounded_integers.h
src/theory/sets/theory_sets_private.cpp
src/theory/strings/theory_strings.cpp
src/theory/theory_model.cpp
test/regress/CMakeLists.txt
test/regress/regress0/nl/sqrt2-value.smt2
test/regress/regress0/parser/choice.cvc [deleted file]
test/regress/regress0/parser/choice.smt2 [deleted file]
test/regress/regress1/nl/issue3300-approx-sqrt-witness.smt2

index b27cc48b460f712eb742a396c6d5224f4d7a68ef..5c0c4a750e212b82ae96dd6147c2f662ceac14ae 100644 (file)
@@ -76,7 +76,7 @@ const static std::unordered_map<Kind, CVC4::Kind, KindHashFunction> s_kinds{
     {CONSTANT, CVC4::Kind::VARIABLE},
     {VARIABLE, CVC4::Kind::BOUND_VARIABLE},
     {LAMBDA, CVC4::Kind::LAMBDA},
-    {CHOICE, CVC4::Kind::CHOICE},
+    {WITNESS, CVC4::Kind::WITNESS},
     /* Boolean ------------------------------------------------------------- */
     {CONST_BOOLEAN, CVC4::Kind::CONST_BOOLEAN},
     {NOT, CVC4::Kind::NOT},
@@ -309,7 +309,7 @@ const static std::unordered_map<CVC4::Kind, Kind, CVC4::kind::KindHashFunction>
         {CVC4::Kind::VARIABLE, CONSTANT},
         {CVC4::Kind::BOUND_VARIABLE, VARIABLE},
         {CVC4::Kind::LAMBDA, LAMBDA},
-        {CVC4::Kind::CHOICE, CHOICE},
+        {CVC4::Kind::WITNESS, WITNESS},
         /* Boolean --------------------------------------------------------- */
         {CVC4::Kind::CONST_BOOLEAN, CONST_BOOLEAN},
         {CVC4::Kind::NOT, NOT},
index 6c1a2256b921e45c056d8ac948e7b6bd89c93441..05423a95225447ddec4e5f12fd48bcf9c5bd13aa 100644 (file)
@@ -134,15 +134,42 @@ enum CVC4_PUBLIC Kind : int32_t
    */
   LAMBDA,
   /**
-   * Hilbert choice (epsilon) expression.
+   * The syntax of a witness term is similar to a quantified formula except that
+   * only one bound variable is allowed.
+   * The term (witness ((x T)) F) returns an element x of type T
+   * and asserts F.
+   *
+   * The witness operator behaves like the description operator
+   * (see https://planetmath.org/hilbertsvarepsilonoperator) if there is no x
+   * that satisfies F. But if such x exists, the witness operator does not
+   * enforce the axiom that ensures uniqueness up to logical equivalence:
+   * forall x. F \equiv G => witness x. F =  witness x. G
+   *
+   * For example if there are 2 elements of type T that satisfy F, then the
+   * following formula is satisfiable:
+   * (distinct
+   *    (witness ((x Int)) F)
+   *    (witness ((x Int)) F))
+   *
+   * This kind is primarily used internally, but may be returned in models
+   * (e.g. for arithmetic terms in non-linear queries). However, it is not
+   * supported by the parser. Moreover, the user of the API should be cautious
+   * when using this operator. In general, all witness terms
+   * (witness ((x Int)) F) should be such that (exists ((x Int)) F) is a valid
+   * formula. If this is not the case, then the semantics in formulas that use
+   * witness terms may be unintuitive. For example, the following formula is
+   * unsatisfiable:
+   * (or (= (witness ((x Int)) false) 0) (not (= (witness ((x Int)) false) 0))
+   * whereas notice that (or (= z 0) (not (= z 0))) is true for any z.
+   *
    * Parameters: 2
    *   -[1]: BOUND_VAR_LIST
-   *   -[2]: Hilbert choice body
+   *   -[2]: Witness body
    * Create with:
    *   mkTerm(Kind kind, Term child1, Term child2)
    *   mkTerm(Kind kind, const std::vector<Term>& children)
    */
-  CHOICE,
+  WITNESS,
 
   /* Boolean --------------------------------------------------------------- */
 
index 0fd5bb4fa755c589e65338b74dbab482a0687cff..16d66cf6ac57be3dfa7ff35857354028ce73ee1d 100644 (file)
@@ -523,7 +523,7 @@ private:
 
   /**
    * Create a new, fresh variable for use in a binder expression
-   * (the BOUND_VAR_LIST of a FORALL, EXISTS, LAMBDA, or CHOICE).  It is
+   * (the BOUND_VAR_LIST of a FORALL, EXISTS, LAMBDA, or WITNESS).  It is
    * an error for this bound variable to exist outside of a binder,
    * and it should also only be used in a single binder expression.
    * That is, two distinct FORALL expressions should use entirely
@@ -542,7 +542,7 @@ private:
 
   /**
    * Create a (nameless) new, fresh variable for use in a binder
-   * expression (the BOUND_VAR_LIST of a FORALL, EXISTS, LAMBDA, or CHOICE).
+   * expression (the BOUND_VAR_LIST of a FORALL, EXISTS, LAMBDA, or WITNESS).
    * It is an error for this bound variable to exist outside of a
    * binder, and it should also only be used in a single binder
    * expression.  That is, two distinct FORALL expressions should use
index 8ded28f0703c30aa9ae8c9534be42cf56a351840..2f9d0b0ac21987ba6e2e33f8ee4074c26a3dc0ea 100644 (file)
@@ -468,7 +468,7 @@ public:
   inline bool isClosure() const {
     assertTNodeNotExpired();
     return getKind() == kind::LAMBDA || getKind() == kind::FORALL
-           || getKind() == kind::EXISTS || getKind() == kind::CHOICE
+           || getKind() == kind::EXISTS || getKind() == kind::WITNESS
            || getKind() == kind::COMPREHENSION
            || getKind() == kind::MATCH_BIND_CASE;
   }
index e47029284b99f427c5beaf8e6d392a6159f21d84..5e042d5911ee8b94fb7957e92bd790058deb1531 100644 (file)
@@ -78,7 +78,7 @@ bool hasFreeVar(TNode n);
 
 /**
  * Returns true iff the node n contains a closure, that is, a node
- * whose kind is FORALL, EXISTS, CHOICE, LAMBDA, or any other closure currently
+ * whose kind is FORALL, EXISTS, WITNESS, LAMBDA, or any other closure currently
  * supported.
  * @param n The node under investigation
  * @return true iff this node contains a closure.
index 9f9d58aad8c570f308ffee6567b1896e380369d3..6ac5b0289e50123524b57d481bacfd392f7ecb84 100644 (file)
@@ -394,9 +394,9 @@ header = "options/smt_options.h"
   help       = "in models, output uninterpreted sorts as datatype enumerations"
 
 [[option]]
-  name       = "modelWitnessChoice"
+  name       = "modelWitnessValue"
   category   = "regular"
-  long       = "model-witness-choice"
+  long       = "model-witness-value"
   type       = "bool"
   default    = "false"
   read_only  = true
index 3f03ca43db38949e26a312e6612226c5c3beda17..7babf2e56007b3f179834d05cbea2322903366ce 100644 (file)
@@ -114,7 +114,6 @@ tokens {
 
   FORALL_TOK = 'FORALL';
   EXISTS_TOK = 'EXISTS';
-  CHOICE_TOK = 'CHOICE';
   PATTERN_TOK = 'PATTERN';
 
   LAMBDA_TOK = 'LAMBDA';
@@ -348,8 +347,7 @@ int getOperatorPrecedence(int type) {
   case IMPLIES_TOK: return 30;// right-to-left
   case IFF_TOK: return 31;
   case FORALL_TOK:
-  case EXISTS_TOK:
-  case CHOICE_TOK: return 32;
+  case EXISTS_TOK:return 32;
   case ASSIGN_TOK:
   case IN_TOK: return 33;
 
@@ -1471,7 +1469,7 @@ prefixFormula[CVC4::api::Term& f]
   api::Term ipl;
 }
     /* quantifiers */
-  : ( FORALL_TOK { k = api::FORALL; } | EXISTS_TOK { k = api::EXISTS; } | CHOICE_TOK { k = api::CHOICE; } )
+  : ( FORALL_TOK { k = api::FORALL; } | EXISTS_TOK { k = api::EXISTS; } )
     { PARSER_STATE->pushScope(); } LPAREN
     boundVarDecl[ids,t]
     { for(std::vector<std::string>::const_iterator i = ids.begin(); i != ids.end(); ++i) {
index 35227e7cece16156674e88fc88bd871b7ba38602..d591c29deb09edbe7d3c89041e4f37a6ff5b7558 100644 (file)
@@ -2254,7 +2254,6 @@ quantOp[CVC4::api::Kind& kind]
 }
   : EXISTS_TOK    { $kind = api::EXISTS; }
   | FORALL_TOK    { $kind = api::FORALL; }
-  | CHOICE_TOK    { $kind = api::CHOICE; }
   ;
 
 /**
@@ -2625,7 +2624,6 @@ ATTRIBUTE_INST_LEVEL : ':quant-inst-max-level';
 // operators (NOTE: theory symbols go here)
 EXISTS_TOK        : 'exists';
 FORALL_TOK        : 'forall';
-CHOICE_TOK        : { !PARSER_STATE->strictModeEnabled() }? 'choice';
 
 EMP_TOK : { PARSER_STATE->isTheoryEnabled(theory::THEORY_SEP) }? 'emp';
 CHAR_TOK : { PARSER_STATE->isTheoryEnabled(theory::THEORY_STRINGS) }? 'char';
index 2568101c43a422fd2c94506002438836cba95309..c2f4675b13c261ef115a5ff2e3d28f0137da1737 100644 (file)
@@ -926,7 +926,10 @@ thfQuantifier[CVC4::api::Kind& kind]
   : FORALL_TOK { kind = api::FORALL; }
   | EXISTS_TOK { kind = api::EXISTS; }
   | LAMBDA_TOK { kind = api::LAMBDA; }
-  | CHOICE_TOK { kind = api::CHOICE; }
+  | CHOICE_TOK
+    {
+        UNSUPPORTED("Choice operator");
+    }
   | DEF_DESC_TOK
     {
       UNSUPPORTED("Description quantifier");
@@ -1627,7 +1630,7 @@ NOT_TOK        : '~';
 FORALL_TOK     : '!';
 EXISTS_TOK     : '?';
 LAMBDA_TOK     : '^';
-CHOICE_TOK     : '@+';
+WITNESS_TOK     : '@+';
 DEF_DESC_TOK   : '@-';
 AND_TOK        : '&';
 IFF_TOK        : '<=>';
index 9edc73acd2abf9d0e1bd66dfcc357bc91c51e47d..0c0c4c3a825aaa48aee41a91e182bb2b19f5b34d 100644 (file)
@@ -545,7 +545,7 @@ void Smt2Printer::toStream(std::ostream& out,
   case kind::MATCH_CASE:
     // do nothing
     break;
-  case kind::CHOICE: out << smtKindString(k, d_variant) << " "; break;
+  case kind::WITNESS: out << smtKindString(k, d_variant) << " "; break;
 
   // arith theory
   case kind::PLUS:
@@ -1032,7 +1032,7 @@ static string smtKindString(Kind k, Variant v)
   case kind::LAMBDA:
     return "lambda";
   case kind::MATCH: return "match";
-  case kind::CHOICE: return "choice";
+  case kind::WITNESS: return "witness";
 
   // arith theory
   case kind::PLUS: return "+";
index d37ed05e159199418d13f16658581d9ff89f5e3e..1ae125e0319d54ad46ca1b8b7042428b0e6254c9 100644 (file)
@@ -138,9 +138,9 @@ Node RemoveTermFormulas::run(TNode node, std::vector<Node>& output,
       }
     }
   }
-  else if (node.getKind() == kind::CHOICE)
+  else if (node.getKind() == kind::WITNESS)
   {
-    // If a Hilbert choice function, witness the choice.
+    // If a witness choice
     //   For details on this operator, see
     //   http://planetmath.org/hilbertsvarepsilonoperator.
     if (!inQuant)
@@ -150,15 +150,15 @@ Node RemoveTermFormulas::run(TNode node, std::vector<Node>& output,
       {
         // Make the skolem to witness the choice
         skolem = nodeManager->mkSkolem(
-            "choiceK",
+            "witnessK",
             nodeType,
-            "a skolem introduced due to term-level Hilbert choice removal");
+            "a skolem introduced due to term-level witness removal");
         d_skolem_cache.insert(node, skolem);
 
         Assert(node[0].getNumChildren() == 1);
 
         // The new assertion is the assumption that the body
-        // of the choice operator holds for the Skolem
+        // of the witness operator holds for the Skolem
         newAssertion = node[1].substitute(node[0][0], skolem);
       }
     }
index b6456bda6b7f986bac6ea754d020e8e1277edbea..3b72b46a5e7645b24261d18d3237da31b593b99b 100644 (file)
@@ -112,7 +112,7 @@ public:
    * This is sometimes called "lambda lifting"
    *
    * As an example of (4):
-   *   (choice x. P( x ) ) = t
+   *   (witness x. P( x ) ) = t
    * becomes
    *   P( k ) ^ k = t
    * where k is a fresh skolem constant.
index abb2a7921a1fd6f8b7b7e53e123e23618684fe5b..0d47c8874758f2ff71d981fd3fa88c7906231159 100644 (file)
@@ -1296,7 +1296,7 @@ void NlModel::getModelValueRepair(
       pred = nm->mkNode(AND, nm->mkNode(GEQ, v, l), nm->mkNode(GEQ, u, v));
       Trace("nl-model") << v << " approximated as " << pred << std::endl;
       Node witness;
-      if (options::modelWitnessChoice())
+      if (options::modelWitnessValue())
       {
         // witness is the midpoint
         witness = nm->mkNode(
@@ -1314,7 +1314,7 @@ void NlModel::getModelValueRepair(
     }
   }
   // Also record the exact values we used. An exact value can be seen as a
-  // special kind approximation of the form (choice x. x = exact_value).
+  // special kind approximation of the form (witness x. x = exact_value).
   // Notice that the above term gets rewritten such that the choice function
   // is eliminated.
   for (size_t i = 0, num = d_check_model_vars.size(); i < num; i++)
index 374de85621908cc08e60107776406b0c050a31a1..0f2f4bbf4798cd70257cd9d72d6fbcd19c94011a 100644 (file)
@@ -5151,7 +5151,7 @@ Node TheoryArithPrivate::expandDefinition(Node node)
               kind::AND, nm->mkNode(kind::MULT, var, var).eqNode(node[0]), uf);
 
           // sqrt(x) reduces to:
-          // choice y. ite(x >= 0.0, y * y = x ^ Uf(x), Uf(x))
+          // witness y. ite(x >= 0.0, y * y = x ^ Uf(x), Uf(x))
           //
           // Uf(x) makes sure that the reduction still behaves like a function,
           // otherwise the reduction of (x = 1) ^ (sqrt(x) != sqrt(1)) would be
@@ -5202,7 +5202,7 @@ Node TheoryArithPrivate::expandDefinition(Node node)
           lem = nm->mkNode(AND, rlem, invTerm.eqNode(node[0]));
         }
         Assert(!lem.isNull());
-        Node ret = nm->mkNode(CHOICE, nm->mkNode(BOUND_VAR_LIST, var), lem);
+        Node ret = nm->mkNode(WITNESS, nm->mkNode(BOUND_VAR_LIST, var), lem);
         d_nlin_inverse_skolem[node] = ret;
         return ret;
       }
index 4d5e95119712a5ecc56cc796da36c9d8e291abda..a11354b1a006b07131d85b22e5b4551bf7d6cdf0 100644 (file)
@@ -298,7 +298,7 @@ operator SEXPR 0: "a symbolic expression (any arity)"
 
 operator LAMBDA 2 "a lambda expression; first parameter is a BOUND_VAR_LIST, second is lambda body"
 
-operator CHOICE 2 "a Hilbert choice (epsilon) expression; first parameter is a BOUND_VAR_LIST, second is the Hilbert choice body"
+operator WITNESS 2 "a witness expression; first parameter is a BOUND_VAR_LIST, second is the witness body"
 
 constant TYPE_CONSTANT \
     ::CVC4::TypeConstant \
@@ -329,7 +329,7 @@ typerule EQUAL ::CVC4::theory::builtin::EqualityTypeRule
 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 WITNESS ::CVC4::theory::builtin::WitnessTypeRule
 
 # lambda expressions that are isomorphic to array constants can be considered constants
 construle LAMBDA ::CVC4::theory::builtin::LambdaTypeRule
index b9d05b833c9d80f6e05b2ca15c4b63a4d18c8728..1667e55056dddd02234db55fcef8f8412b6fbbbd 100644 (file)
@@ -46,7 +46,7 @@ void TheoryBuiltin::finishInit()
   // choice nodes are not evaluated in getModelValue
   TheoryModel* theoryModel = d_valuation.getModel();
   Assert(theoryModel != nullptr);
-  theoryModel->setUnevaluatedKind(kind::CHOICE);
+  theoryModel->setUnevaluatedKind(kind::WITNESS);
 }
 
 }  // namespace builtin
index dd6d434ca95951873602b8165e703a9a2b144e33..d8175dd60ee9b92c93a46cd97c1a109cb79cb917 100644 (file)
@@ -92,7 +92,7 @@ RewriteResponse TheoryBuiltinRewriter::postRewrite(TNode node) {
     }
     return RewriteResponse(REWRITE_DONE, node);
   }
-  else if (node.getKind() == kind::CHOICE)
+  else if (node.getKind() == kind::WITNESS)
   {
     if (node[1].getKind() == kind::EQUAL)
     {
index a3d1776e1d64a561be9a29eeba80b0528edc55e9..28d6c90371b513b9bd868a6f334390f0cc47fd30 100644 (file)
@@ -159,7 +159,7 @@ class LambdaTypeRule {
   }
 };/* class LambdaTypeRule */
 
-class ChoiceTypeRule
+class WitnessTypeRule
 {
  public:
   inline static TypeNode computeType(NodeManager* nodeManager,
@@ -169,14 +169,14 @@ class ChoiceTypeRule
     if (n[0].getType(check) != nodeManager->boundVarListType())
     {
       std::stringstream ss;
-      ss << "expected a bound var list for CHOICE expression, got `"
+      ss << "expected a bound var list for WITNESS expression, got `"
          << n[0].getType().toString() << "'";
       throw TypeCheckingExceptionPrivate(n, ss.str());
     }
     if (n[0].getNumChildren() != 1)
     {
       std::stringstream ss;
-      ss << "expected a bound var list with one argument for CHOICE expression";
+      ss << "expected a bound var list with one argument for WITNESS expression";
       throw TypeCheckingExceptionPrivate(n, ss.str());
     }
     if (check)
@@ -185,14 +185,14 @@ class ChoiceTypeRule
       if (!rangeType.isBoolean())
       {
         std::stringstream ss;
-        ss << "expected a body of a CHOICE expression to have Boolean type";
+        ss << "expected a body of a WITNESS expression to have Boolean type";
         throw TypeCheckingExceptionPrivate(n, ss.str());
       }
     }
-    // The type of a choice function is the type of its bound variable.
+    // The type of a witness function is the type of its bound variable.
     return n[0][0].getType();
   }
-}; /* class ChoiceTypeRule */
+}; /* class WitnessTypeRule */
 
 class SortProperties {
  public:
index 3756c6b4b79d98b6a3bcfb75593cd457b865ff2e..5417ce4552519219482cc1346acb58f4d2f0029d 100644 (file)
@@ -85,7 +85,7 @@ Node BvInverter::getInversionNode(Node cond, TypeNode tn, BvInverterQuery* m)
     {
       Node x = m->getBoundVariable(tn);
       Node ccond = new_cond.substitute(solve_var, x);
-      c = nm->mkNode(kind::CHOICE, nm->mkNode(BOUND_VAR_LIST, x), ccond);
+      c = nm->mkNode(kind::WITNESS, nm->mkNode(BOUND_VAR_LIST, x), ccond);
       Trace("cegqi-bv-skvinv")
           << "SKVINV : Make " << c << " for " << new_cond << std::endl;
     }
@@ -397,9 +397,9 @@ Node BvInverter::solveBvLit(Node sv,
 
     if (!ic.isNull())
     {
-      /* We generate a choice term (choice x0. ic => x0 <k> s <litk> t) for
-       * x <k> s <litk> t. When traversing down, this choice term determines
-       * the value for x <k> s = (choice x0. ic => x0 <k> s <litk> t), i.e.,
+      /* We generate a witness term (witness x0. ic => x0 <k> s <litk> t) for
+       * x <k> s <litk> t. When traversing down, this witness term determines
+       * the value for x <k> s = (witness x0. ic => x0 <k> s <litk> t), i.e.,
        * from here on, the propagated literal is a positive equality. */
       litk = EQUAL;
       pol = true;
index 746bfba9a4e15d139f361570a63db9e9dd61c304..2afb505a8b30dc4c9deb619814cdfdc43b5054c0 100644 (file)
@@ -85,8 +85,8 @@ class BvInverter
    * non-null node t, then sv = t is the solved form of lit.
    *
    * If the BvInverterQuery provided to this function call is null, then
-   * the solution returned by this call will not contain CHOICE expressions.
-   * If the solved form for lit requires introducing a CHOICE expression,
+   * the solution returned by this call will not contain WITNESS expressions.
+   * If the solved form for lit requires introducing a WITNESS expression,
    * then this call will return null.
    */
   Node solveBvLit(Node sv,
@@ -112,7 +112,7 @@ class BvInverter
    * is a BV tautology where x is getSolveVariable( tn ).
    *
    * It returns a term of the form:
-   *   (choice y. cond { x -> y })
+   *   (witness y. cond { x -> y })
    * where y is a bound variable and x is getSolveVariable( tn ).
    *
    * In some cases, we may return a term t if cond implies an equality on
index 2d43e63dc25bd6befeb4a89299bb11f404208e5a..fd06f9be404650c9b41e901a98d5179b83eb3286 100644 (file)
@@ -407,7 +407,7 @@ Node BvInstantiator::rewriteAssertionForSolvePv(CegInstantiator* ci,
       }
       else
       {
-        if (cur.getKind() == CHOICE)
+        if (cur.getKind() == WITNESS)
         {
           // must replace variables of choice functions
           // with new variables to avoid variable
@@ -418,7 +418,7 @@ Node BvInstantiator::rewriteAssertionForSolvePv(CegInstantiator* ci,
           Assert(curr_subs.find(cur[0][0]) == curr_subs.end());
           curr_subs[cur[0][0]] = bv;
           // we cannot cache the results of subterms
-          // of this choice expression since we are
+          // of this witness expression since we are
           // now in the context { cur[0][0] -> bv },
           // hence we push a context here
           visited.push(std::unordered_map<TNode, Node, TNodeHashFunction>());
@@ -483,8 +483,8 @@ Node BvInstantiator::rewriteAssertionForSolvePv(CegInstantiator* ci,
         visited_contains_pv[ret] = contains_pv;
       }
 
-      // if was choice, pop context
-      if (cur.getKind() == CHOICE)
+      // if was witness, pop context
+      if (cur.getKind() == WITNESS)
       {
         Assert(curr_subs.find(cur[0][0]) != curr_subs.end());
         curr_subs.erase(cur[0][0]);
index 6b625fc735c96904b7fbedc3796f96276ba5115e..18602421920a3795b59b14ed9765824c3e836591 100644 (file)
@@ -207,7 +207,7 @@ CegInstantiator::~CegInstantiator() {
 void CegInstantiator::computeProgVars( Node n ){
   if( d_prog_var.find( n )==d_prog_var.end() ){
     d_prog_var[n].clear();
-    if (n.getKind() == kind::CHOICE)
+    if (n.getKind() == kind::WITNESS)
     {
       Assert(d_prog_var.find(n[0][0]) == d_prog_var.end());
       d_prog_var[n[0][0]].clear();
@@ -235,7 +235,7 @@ void CegInstantiator::computeProgVars( Node n ){
     {
       d_prog_var[n].insert(n);
     }
-    if (n.getKind() == kind::CHOICE)
+    if (n.getKind() == kind::WITNESS)
     {
       d_prog_var.erase(n[0][0]);
     }
@@ -284,7 +284,7 @@ CegHandledStatus CegInstantiator::isCbqiTerm(Node n)
       visited.insert(cur);
       if (cur.getKind() != BOUND_VARIABLE && TermUtil::hasBoundVarAttr(cur))
       {
-        if (cur.getKind() == FORALL || cur.getKind() == CHOICE)
+        if (cur.getKind() == FORALL || cur.getKind() == WITNESS)
         {
           visit.push_back(cur[1]);
         }
index b4aa38c078c84d96f5b6974c7cfe2420631edd6b..7351e60f0826a867528c8c8fe67eabe1c49964c2 100644 (file)
@@ -276,7 +276,7 @@ class CegInstantiator {
    *
    * This gets the next (canonical) bound variable of
    * type tn. This can be used for instance when
-   * constructing instantiations that involve choice expressions.
+   * constructing instantiations that involve witness expressions.
    */
   Node getBoundVariable(TypeNode tn);
   /** has this assertion been marked as solved? */
index 601452c1fee344acdc25b7f8b9fb8b791f7dadaf..ef572ace7fcce7dc50dc144c20664234bac3a325 100644 (file)
@@ -670,7 +670,7 @@ Node BoundedIntegers::getSetRangeValue( Node q, Node v, RepSetIterator * rsi ) {
       choices.pop_back();
       Node bvl = nm->mkNode(BOUND_VAR_LIST, choice_i);
       Node cMinCard = nm->mkNode(LEQ, srCardN, nm->mkConst(Rational(i)));
-      choice_i = nm->mkNode(CHOICE, bvl, nm->mkNode(OR, cMinCard, cBody));
+      choice_i = nm->mkNode(WITNESS, bvl, nm->mkNode(OR, cMinCard, cBody));
       d_setm_choice[sro].push_back(choice_i);
     }
     Assert(i < d_setm_choice[sro].size());
@@ -690,8 +690,8 @@ Node BoundedIntegers::getSetRangeValue( Node q, Node v, RepSetIterator * rsi ) {
   //   e.g.
   // singleton(0) union singleton(1)
   //   becomes
-  // C1 union ( choice y. card(S)<=1 OR ( y in S AND distinct( y, C1 ) ) )
-  // where C1 = ( choice x. card(S)<=0 OR x in S ).
+  // C1 union ( witness y. card(S)<=1 OR ( y in S AND distinct( y, C1 ) ) )
+  // where C1 = ( witness x. card(S)<=0 OR x in S ).
   Trace("bound-int-rsi") << "...reconstructed " << nsr << std::endl;
   return nsr;
 }
index 1333af61cb9bd54b0eebc77e6677316be2ddb00b..2180a7270867ae0569bd5f77e555fcfffe0859d2 100644 (file)
@@ -72,7 +72,7 @@ private:
    *
    * For each set S and integer n, d_setm_choice[S][n] is the canonical
    * representation for the (n+1)^th member of set S. It is of the form:
-   * choice x. (|S| <= n OR ( x in S AND
+   * witness x. (|S| <= n OR ( x in S AND
    *   distinct( x, d_setm_choice[S][0], ..., d_setm_choice[S][n-1] ) ) )
    */
   std::map<Node, std::vector<Node> > d_setm_choice;
index d6eec382197a29eab72ea23ee379fcef69d5180f..fbf1e6fcf5664f5f60871555a0498ec2fdc84577 100644 (file)
@@ -1510,7 +1510,7 @@ Node TheorySetsPrivate::expandDefinition(Node node)
     Node memberAndEqual = member.andNode(equal);
     Node ite = nm->mkNode(kind::ITE, isEmpty, equal, memberAndEqual);
     Node witnessVariables = nm->mkNode(BOUND_VAR_LIST, witnessVariable);
-    Node witness = nm->mkNode(CHOICE, witnessVariables, ite);
+    Node witness = nm->mkNode(WITNESS, witnessVariables, ite);
     return witness;
   }
 
index 5b7c383613d6ab680f42de0c3dcdaea5d632008b..b98bd1dea5d658cbe048b5b47cdd9ca10702502d 100644 (file)
@@ -580,7 +580,7 @@ Node TheoryStrings::expandDefinition(Node node)
   if (node.getKind() == STRING_FROM_CODE)
   {
     // str.from_code(t) --->
-    //   choice k. ite(0 <= t < |A|, t = str.to_code(k), k = "")
+    //   witness k. ite(0 <= t < |A|, t = str.to_code(k), k = "")
     NodeManager* nm = NodeManager::currentNM();
     Node t = node[0];
     Node card = nm->mkConst(Rational(utils::getAlphabetCardinality()));
@@ -590,7 +590,7 @@ Node TheoryStrings::expandDefinition(Node node)
     Node bvl = nm->mkNode(BOUND_VAR_LIST, k);
     Node emp = Word::mkEmptyWord(node.getType());
     node = nm->mkNode(
-        CHOICE,
+        WITNESS,
         bvl,
         nm->mkNode(
             ITE, cond, t.eqNode(nm->mkNode(STRING_TO_CODE, k)), k.eqNode(emp)));
index 10e57e7949d6c36321e78f0d0e6976d3096ab917..f24e4fc669304e8ef3bbe04f4bde1856cea4a516 100644 (file)
@@ -266,10 +266,10 @@ Node TheoryModel::getModelValue(TNode n) const
   if (ita != d_approximations.end())
   {
     // If the value of n is approximate based on predicate P(n), we return
-    // choice z. P(z).
+    // witness z. P(z).
     Node v = nm->mkBoundVar(n.getType());
     Node bvl = nm->mkNode(BOUND_VAR_LIST, v);
-    Node answer = nm->mkNode(CHOICE, bvl, ita->second.substitute(n, v));
+    Node answer = nm->mkNode(WITNESS, bvl, ita->second.substitute(n, v));
     d_modelCache[n] = answer;
     return answer;
   }
index 9f9f36c8f2eee16e0e1ac2e37ad9ddfaffa84437..336bbdd3249e5d494b3a365f177d89031574d09c 100644 (file)
@@ -616,8 +616,6 @@ set(regress_0_tests
   regress0/parser/as.smt2
   regress0/parser/bv_arity_smt2.6.smt2
   regress0/parser/bv_nat.smt2
-  regress0/parser/choice.cvc
-  regress0/parser/choice.smt2
   regress0/parser/constraint.smt2
   regress0/parser/declarefun-emptyset-uf.smt2
   regress0/parser/force_logic_set_logic.smt2
index 649a792bec0db400d4c83fe540b914b411ec8561..6c3cd378a2d2d01bad3d0e8a19fd89f0da4483ad 100644 (file)
@@ -1,6 +1,6 @@
-; SCRUBBER: sed -e 's/choice.*/choice/'
+; SCRUBBER: sed -e 's/witness.*/witness/'
 ; EXPECT: sat
-; EXPECT: ((x (choice
+; EXPECT: ((x (witness
 (set-option :produce-models true)
 (set-logic ALL)
 (declare-fun x () Real)
diff --git a/test/regress/regress0/parser/choice.cvc b/test/regress/regress0/parser/choice.cvc
deleted file mode 100644 (file)
index e0ebac0..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-% EXPECT: sat
-
-a : INT;
-b : INT;
-c : INT;
-
-ASSERT (CHOICE(x: INT): x = a) = 1;
-ASSERT (CHOICE(x: INT): x = b) = 2;
-
-CHECKSAT;
\ No newline at end of file
diff --git a/test/regress/regress0/parser/choice.smt2 b/test/regress/regress0/parser/choice.smt2
deleted file mode 100644 (file)
index 19763e2..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-(set-logic ALL)
-(set-info :status sat)
-(declare-fun a () Int)
-(declare-fun b () Int)
-(declare-fun c () Int)
-(assert (= (choice ((x Int)) (= x a)) 1))
-(assert (= (choice ((x Int)) (= x b)) 2))
-;(assert (let ((x (choice ((x Int)) true))) (and (distinct a b x)(= x c))))
-(check-sat)
-
index 9bc47f925dcb4cec35d794f56e06b61e53feaa1b..3a4332176230889960a7cd01322ba43dceb5373a 100644 (file)
@@ -1,5 +1,5 @@
-; SCRUBBER: sed -e 's/BOUND_VARIABLE_[0-9]*/BOUND_VARIABLE/; s/((x (choice ((BOUND_VARIABLE Real)) (or (= BOUND_VARIABLE.*/SUCCESS/'
-; COMMAND-LINE: --produce-models --model-witness-choice --no-check-models
+; SCRUBBER: sed -e 's/BOUND_VARIABLE_[0-9]*/BOUND_VARIABLE/; s/((x (witness ((BOUND_VARIABLE Real)) (or (= BOUND_VARIABLE.*/SUCCESS/'
+; COMMAND-LINE: --produce-models --model-witness-value --no-check-models
 ; EXPECT: sat
 ; EXPECT: SUCCESS
 (set-logic QF_NRA)