Remove tester name from APIs (#3929)
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Fri, 6 Mar 2020 20:27:10 +0000 (14:27 -0600)
committerGitHub <noreply@github.com>
Fri, 6 Mar 2020 20:27:10 +0000 (14:27 -0600)
This removes the field "tester name" from the Expr-level and Term-level APIs. This field is an artifact of parsing and thus should be handled in the parsers.

This refactor uncovered an issue in our regressions, namely our smt version >= 2.6 was not strictly complaint, since the symbol is-cons was being automatically defined for testers of constructors cons. This disables this behavior when strict mode is enabled. It updates the regressions with this issue.

This is work towards parser migration.

20 files changed:
src/api/cvc4cpp.cpp
src/api/cvc4cpp.h
src/expr/datatype.cpp
src/expr/datatype.h
src/parser/cvc/Cvc.g
src/parser/cvc/cvc.cpp
src/parser/cvc/cvc.h
src/parser/parser.cpp
src/parser/parser.h
src/parser/smt2/Smt2.g
src/parser/smt2/smt2.cpp
src/parser/smt2/smt2.h
test/regress/regress0/datatypes/data-nested-codata.smt2
test/regress/regress0/datatypes/is_test.smt2
test/regress/regress0/quantifiers/simp-len.smt2
test/regress/regress0/smtlib/global-decls.smt2
test/regress/regress1/push-pop/bug-fmf-fun-skolem.smt2
test/regress/regress2/bug674.smt2
test/unit/api/datatype_api_black.h
test/unit/util/datatype_black.h

index 63ebdbea64e38f45dec4182c50e31b2fe9de3f1f..3b28e2f5cd4b2a40c5a35d9f5237e6fcd869585a 100644 (file)
@@ -1959,11 +1959,6 @@ Term DatatypeConstructor::getTesterTerm() const
   return tst;
 }
 
-std::string DatatypeConstructor::getTesterName() const
-{
-  return d_ctor->getTesterName();
-}
-
 size_t DatatypeConstructor::getNumSelectors() const
 {
   return d_ctor->getNumArgs();
index 3317348fe092e23f1f1fa157e1f3bfa9a96032a9..db29359c5cd1c4f8f6c11c9dc649a93454d369ba 100644 (file)
@@ -1411,11 +1411,6 @@ class CVC4_PUBLIC DatatypeConstructor
    */
   Term getTesterTerm() const;
 
-  /**
-   * @return the tester name for this Datatype constructor.
-   */
-  std::string getTesterName() const;
-
   /**
    * @return the number of selectors (so far) of this Datatype constructor.
    */
index dd5f12b287661c277d0869bfcd95131c706a45f0..3925e1434689a53f68eb564a3e98ebedffac4dbf 100644 (file)
@@ -273,10 +273,8 @@ void Datatype::addSygusConstructor(Expr op,
   std::stringstream ss;
   ss << getName() << "_" << getNumConstructors() << "_" << cname;
   std::string name = ss.str();
-  std::string testerId("is-");
-  testerId.append(name);
   unsigned cweight = weight >= 0 ? weight : (cargs.empty() ? 0 : 1);
-  DatatypeConstructor c(name, testerId, cweight);
+  DatatypeConstructor c(name, cweight);
   c.setSygus(op, spc);
   for( unsigned j=0; j<cargs.size(); j++ ){
     Debug("parser-sygus-debug") << "  arg " << j << " : " << cargs[j] << std::endl;
@@ -515,21 +513,10 @@ const std::vector<DatatypeConstructor>* Datatype::getConstructors() const
   return &d_constructors;
 }
 
-DatatypeConstructor::DatatypeConstructor(std::string name)
-    : d_internal(nullptr),
-      d_testerName("is_" + name)  // default tester name is "is_FOO"
-{
-  PrettyCheckArgument(name != "", name, "cannot construct a datatype constructor without a name");
-  d_internal = std::make_shared<DTypeConstructor>(name, 1);
-}
-
-DatatypeConstructor::DatatypeConstructor(std::string name,
-                                         std::string tester,
-                                         unsigned weight)
-    : d_internal(nullptr), d_testerName(tester)
+DatatypeConstructor::DatatypeConstructor(std::string name, unsigned weight)
+    : d_internal(nullptr)
 {
   PrettyCheckArgument(name != "", name, "cannot construct a datatype constructor without a name");
-  PrettyCheckArgument(!tester.empty(), tester, "cannot construct a datatype constructor without a tester");
   d_internal = std::make_shared<DTypeConstructor>(name, weight);
 }
 
@@ -594,12 +581,6 @@ std::string DatatypeConstructor::getName() const
   return d_internal->getName();
 }
 
-std::string DatatypeConstructor::getTesterName() const
-{
-  // not stored internally, since tester names only pertain to parsing
-  return d_testerName;
-}
-
 Expr DatatypeConstructor::getConstructor() const {
   PrettyCheckArgument(isResolved(), this, "this datatype constructor is not yet resolved");
   return d_constructor;
index f9edb998fe2b7fd2c258bc35b16414759f2be8be..0f99499ce6c044a9cb56a6f026184dd2979bfd31 100644 (file)
@@ -213,24 +213,14 @@ class CVC4_PUBLIC DatatypeConstructor {
 
   /**
    * Create a new Datatype constructor with the given name for the
-   * constructor and the same name (prefixed with "is_") for the
-   * tester.  The actual constructor and tester (meaning, the Exprs
+   * constructor.  The actual constructor and tester (meaning, the Exprs
    * representing operators for these entities) aren't created until
    * resolution time.
-   */
-  explicit DatatypeConstructor(std::string name);
-
-  /**
-   * Create a new Datatype constructor with the given name for the
-   * constructor and the given name for the tester.  The actual
-   * constructor and tester aren't created until resolution time.
    * weight is the value that this constructor carries when computing size.
    * For example, if A, B, C have weights 0, 1, and 3 respectively, then
    * C( B( A() ), B( A() ) ) has size 5.
    */
-  DatatypeConstructor(std::string name,
-                      std::string tester,
-                      unsigned weight = 1);
+  explicit DatatypeConstructor(std::string name, unsigned weight = 1);
 
   ~DatatypeConstructor() {}
   /**
@@ -309,11 +299,6 @@ class CVC4_PUBLIC DatatypeConstructor {
    */
   unsigned getWeight() const;
 
-  /**
-   * Get the tester name for this Datatype constructor.
-   */
-  std::string getTesterName() const;
-
   /**
    * Get the number of arguments (so far) of this Datatype constructor.
    */
@@ -456,8 +441,6 @@ class CVC4_PUBLIC DatatypeConstructor {
  private:
   /** The internal representation */
   std::shared_ptr<DTypeConstructor> d_internal;
-  /** the name of the tester */
-  std::string d_testerName;
   /** The constructor */
   Expr d_constructor;
   /** the arguments of this constructor */
index ffdef5ba28593db9828493737d6a6c2831723b04..e3d0e0696694c9b3d5d222a4a1bf8a23ac4f2801 100644 (file)
@@ -2354,11 +2354,8 @@ constructorDef[CVC4::Datatype& type]
   std::unique_ptr<CVC4::DatatypeConstructor> ctor;
 }
   : identifier[id,CHECK_UNDECLARED,SYM_SORT]
-    { // make the tester
-      std::string testerId("is_");
-      testerId.append(id);
-      PARSER_STATE->checkDeclaration(testerId, CHECK_UNDECLARED, SYM_SORT);
-      ctor.reset(new CVC4::DatatypeConstructor(id, testerId));
+    {
+      ctor.reset(new CVC4::DatatypeConstructor(id));
     }
     ( LPAREN
       selector[&ctor]
index 9b7e1f403542cbaf6499a2c12e2632b3c892af71..f312fe13cf2c991cbb280a68bacbba89881beec5 100644 (file)
@@ -25,5 +25,13 @@ void Cvc::forceLogic(const std::string& logic)
   preemptCommand(new SetBenchmarkLogicCommand(logic));
 }
 
+bool Cvc::getTesterName(api::Term cons, std::string& name)
+{
+  std::stringstream ss;
+  ss << "is_" << cons;
+  name = ss.str();
+  return true;
+}
+
 }  // namespace parser
 }  // namespace CVC4
index feb962a09e75dfa9f7e21cc74cce131e69e063d5..58d387ca81cee3f7b7c574dc787f2a9686c9320b 100644 (file)
@@ -34,6 +34,9 @@ class Cvc : public Parser
  public:
   void forceLogic(const std::string& logic) override;
 
+  /** Updates name to the tester name of cons, e.g. "is_cons" */
+  bool getTesterName(api::Term cons, std::string& name) override;
+
  protected:
   Cvc(api::Solver* solver,
       Input* input,
index 55a52e8d6d7b75d06b28e3b159daf14aeb577649..f4ea6d56cacace6452ababde61f2f9d19d4132c3 100644 (file)
@@ -143,6 +143,8 @@ api::Term Parser::getExpressionForNameAndType(const std::string& name,
   return expr;
 }
 
+bool Parser::getTesterName(api::Term cons, std::string& name) { return false; }
+
 api::Kind Parser::getKindForFunction(api::Term fun)
 {
   api::Sort t = fun.getSort();
@@ -447,13 +449,17 @@ std::vector<DatatypeType> Parser::mkMutualDatatypeTypes(
         }else{
           throw ParserException(constructorName + " already declared in this datatype");
         }
-        api::Term tester = ctor.getTesterTerm();
-        Debug("parser-idt") << "+ define " << tester << std::endl;
-        string testerName = ctor.getTesterName();
-        if(!doOverload) {
-          checkDeclaration(testerName, CHECK_UNDECLARED);
+        std::string testerName;
+        if (getTesterName(constructor, testerName))
+        {
+          api::Term tester = ctor.getTesterTerm();
+          Debug("parser-idt") << "+ define " << testerName << std::endl;
+          if (!doOverload)
+          {
+            checkDeclaration(testerName, CHECK_UNDECLARED);
+          }
+          defineVar(testerName, tester, d_globalDeclarations, doOverload);
         }
-        defineVar(testerName, tester, d_globalDeclarations, doOverload);
         for (size_t k = 0, nargs = ctor.getNumSelectors(); k < nargs; k++)
         {
           const api::DatatypeSelector& sel = ctor[k];
index 373da6c47312b8033025da540f299291b35da825..3237c28937f1799008a56618125cf0290d64f259 100644 (file)
@@ -367,6 +367,22 @@ public:
   virtual api::Term getExpressionForNameAndType(const std::string& name,
                                                 api::Sort t);
 
+  /**
+   * If this method returns true, then name is updated with the tester name
+   * for constructor cons.
+   *
+   * In detail, notice that (user-defined) datatypes associate a unary predicate
+   * for each constructor, called its "tester". This symbol is automatically
+   * defined when a datatype is defined. The tester name for a constructor
+   * (e.g. "cons") depends on the language:
+   * - In smt versions < 2.6, the (non-standard) syntax is "is-cons",
+   * - In smt versions >= 2.6, the indexed symbol "(_ is cons)" is used. Thus,
+   * no tester symbol is necessary, since "is" is a builtin symbol. We still use
+   * the above syntax if strict mode is disabled.
+   * - In cvc, the syntax for testers is "is_cons".
+   */
+  virtual bool getTesterName(api::Term cons, std::string& name);
+
   /**
    * Returns the kind that should be used for applications of expression fun.
    * This is a generalization of ExprManager::operatorToKind that also
index 14396c771327e36043026b81f649659fce945fd4..d1544f03cc02cf0cb6c7f000cb0601dc17d4e260 100644 (file)
@@ -2548,10 +2548,8 @@ constructorDef[CVC4::Datatype& type]
   CVC4::DatatypeConstructor* ctor = NULL;
 }
   : symbol[id,CHECK_NONE,SYM_VARIABLE]
-    { // make the tester
-      std::string testerId("is-");
-      testerId.append(id);
-      ctor = new CVC4::DatatypeConstructor(id, testerId);
+    {
+      ctor = new CVC4::DatatypeConstructor(id);
     }
     ( LPAREN_TOK selector[*ctor] RPAREN_TOK )*
     { // make the constructor
index 73be8910fed2ffb352e642ed8db6c7a523579411..2df73d9e48769b6f8dd536f582f605aef25ae60a 100644 (file)
@@ -505,6 +505,20 @@ api::Term Smt2::getExpressionForNameAndType(const std::string& name,
   return Parser::getExpressionForNameAndType(name, t);
 }
 
+bool Smt2::getTesterName(api::Term cons, std::string& name)
+{
+  if (v2_6() && strictModeEnabled())
+  {
+    // 2.6 or above uses indexed tester symbols, if we are in strict mode,
+    // we do not automatically define is-cons for constructor cons.
+    return false;
+  }
+  std::stringstream ss;
+  ss << "is-" << cons;
+  name = ss.str();
+  return true;
+}
+
 api::Term Smt2::mkIndexedConstant(const std::string& name,
                                   const std::vector<uint64_t>& numerals)
 {
index afa60bf2ff250240e714d74c28ad2113370676c8..bf4b231b14dcc353dffbbef4b618052d9266ef94 100644 (file)
@@ -150,6 +150,12 @@ class Smt2 : public Parser
   api::Term getExpressionForNameAndType(const std::string& name,
                                         api::Sort t) override;
 
+  /**
+   * If we are in a version < 2.6, this updates name to the tester name of cons,
+   * e.g. "is-cons".
+   */
+  bool getTesterName(api::Term cons, std::string& name) override;
+
   /** Make function defined by a define-fun(s)-rec command.
    *
    * fname : the name of the function.
index 159ae4ae9948fbea5f3dd2fbe6abffc720927365..6a571612358175d56a469b2a5b970a076f0ee9f1 100644 (file)
@@ -8,14 +8,14 @@
 
 
 (declare-fun x () Stream)
-(assert (not (is-nil (shead x))))
-(assert (not (is-nil (tail (shead x)))))
+(assert (not ((_ is nil) (shead x))))
+(assert (not ((_ is nil) (tail (shead x)))))
 (declare-fun y () Stream)
-(assert (not (is-nil (shead y))))
-(assert (not (is-nil (tail (shead y)))))
+(assert (not ((_ is nil) (shead y))))
+(assert (not ((_ is nil) (tail (shead y)))))
 (declare-fun z () Stream)
-(assert (not (is-nil (shead z))))
-(assert (not (is-nil (tail (shead z)))))
+(assert (not ((_ is nil) (shead z))))
+(assert (not ((_ is nil) (tail (shead z)))))
 (assert (distinct x y z))
 
 (check-sat)
index f13a4f21f0a6b9571a38ac575cf97598fca9da79..c54a848595da3f9a6f98a2b0adc7317d9ca2f06e 100644 (file)
@@ -2,5 +2,5 @@
 (set-info :status unsat)
 (declare-datatypes ((Unit 0)) (((u))))
 (declare-fun x () Unit)
-(assert (not (is-u x)))
+(assert (not ((_ is u) x)))
 (check-sat)
index 0a736d7b3b9b942758a9a3533d13c7c1e9b4a6b9..06ae23f8d1cb2fa05606b3cc3a2f39e0c5d2e593 100644 (file)
@@ -3,7 +3,7 @@
 
 (declare-datatypes ((Lst 0)) (((cons (head Int) (tail Lst)) (nil))))
 
-(define-fun-rec len ((x Lst)) Int (ite (is-cons x) (+ 1 (len (tail x))) 0))
+(define-fun-rec len ((x Lst)) Int (ite ((_ is cons) x) (+ 1 (len (tail x))) 0))
 
 (assert (= (len (cons 0 nil)) 0))
 (check-sat)
index a8b6c17b271c669f1a0e41ae829207c40e65be66..4b1c8a0ae0e5d00d11e932c2bfb1088ae8bede5f 100644 (file)
@@ -16,8 +16,8 @@
 (define-fun y () (Struct1 Bool) (mk-struct1 true))
 (declare-const z Unit)
 (assert (= u u))
-(assert (is-mk-struct1 y))
-(assert (is-u z))
+(assert ((_ is mk-struct1) y))
+(assert ((_ is u) z))
 
 (declare-fun size (Tree) Int)
 (assert (= (size nil) 0))
index 229a5e17a1d96c88959490cce6fb2f10c861a01c..01a274e8aeb148023bc749a10b236641edd4a011 100644 (file)
@@ -1,7 +1,7 @@
 ; COMMAND-LINE: --incremental --fmf-fun
 (set-logic ALL_SUPPORTED)
 (declare-datatypes ((Lst 0)) (((cons (head Int) (tail Lst)) (nil))))
-(define-fun-rec sum ((l Lst)) Int (ite (is-nil l) 0 (+ (head l) (sum (tail l)))))
+(define-fun-rec sum ((l Lst)) Int (ite ((_ is nil) l) 0 (+ (head l) (sum (tail l)))))
 
 (declare-fun input () Int)
 (declare-fun p () Bool)
index fccde862a13f431edeafede1283dc8d36c784432..31eaa5aba26c7c556de21de2ed92a50e603cc036 100644 (file)
@@ -1,8 +1,8 @@
 ; COMMAND-LINE: --quant-ind --incremental --rewrite-divk
 (set-logic ALL_SUPPORTED)
 (declare-datatypes ((Lst 0)) (((cons (head Int) (tail Lst)) (nil))))
-(define-fun-rec app ((l1 Lst) (l2 Lst)) Lst (ite (is-nil l1) l2 (cons (head l1) (app (tail l1) l2))))
-(define-fun-rec rev ((l Lst)) Lst (ite (is-nil l) nil (app (rev (tail l)) (cons (head l) nil))))
+(define-fun-rec app ((l1 Lst) (l2 Lst)) Lst (ite ((_ is nil) l1) l2 (cons (head l1) (app (tail l1) l2))))
+(define-fun-rec rev ((l Lst)) Lst (ite ((_ is nil) l) nil (app (rev (tail l)) (cons (head l) nil))))
 ; EXPECT: unsat
 (push 1)
 (assert (not (=> true (and (forall (($l1$0 Lst) ($l2$0 Lst) ($l3$0 Lst)) (= (app $l1$0 (app $l2$0 $l3$0)) (app (app $l1$0 $l2$0) $l3$0)))))))
index 2d7a9c12b170e8812652d87f66ac164db5c4321c..dcccd2628b05840bf7bb33fadd8fc8e8fe1bf17f 100644 (file)
@@ -83,9 +83,6 @@ void DatatypeBlack::testDatatypeStructs()
   DatatypeConstructor dcons = dt[0];
   Term consTerm = dcons.getConstructorTerm();
   TS_ASSERT(dcons.getNumSelectors() == 2);
-  // get tester name: notice this is only to support the Z3-style datatypes
-  // prior to SMT-LIB 2.6 where testers where changed to indexed symbols.
-  TS_ASSERT_THROWS_NOTHING(dcons.getTesterName());
 
   // create datatype sort to test
   DatatypeDecl dtypeSpecEnum = d_solver.mkDatatypeDecl("enum");
index e81caf36fb4e7066d47b882bb5c91554092e9c44..5b98f4d13349a62212a526f780aaf216ab9028c7 100644 (file)
@@ -49,10 +49,10 @@ class DatatypeBlack : public CxxTest::TestSuite {
   void testEnumeration() {
     Datatype colors(d_em, "colors");
 
-    DatatypeConstructor yellow("yellow", "is_yellow");
-    DatatypeConstructor blue("blue", "is_blue");
-    DatatypeConstructor green("green", "is_green");
-    DatatypeConstructor red("red", "is_red");
+    DatatypeConstructor yellow("yellow");
+    DatatypeConstructor blue("blue");
+    DatatypeConstructor green("green");
+    DatatypeConstructor red("red");
 
     colors.addConstructor(yellow);
     colors.addConstructor(blue);
@@ -87,11 +87,11 @@ class DatatypeBlack : public CxxTest::TestSuite {
   void testNat() {
     Datatype nat(d_em, "nat");
 
-    DatatypeConstructor succ("succ", "is_succ");
+    DatatypeConstructor succ("succ");
     succ.addArg("pred", DatatypeSelfType());
     nat.addConstructor(succ);
 
-    DatatypeConstructor zero("zero", "is_zero");
+    DatatypeConstructor zero("zero");
     nat.addConstructor(zero);
 
     Debug("datatypes") << nat << std::endl;
@@ -115,12 +115,12 @@ class DatatypeBlack : public CxxTest::TestSuite {
     Datatype tree(d_em, "tree");
     Type integerType = d_em->integerType();
 
-    DatatypeConstructor node("node", "is_node");
+    DatatypeConstructor node("node");
     node.addArg("left", DatatypeSelfType());
     node.addArg("right", DatatypeSelfType());
     tree.addConstructor(node);
 
-    DatatypeConstructor leaf("leaf", "is_leaf");
+    DatatypeConstructor leaf("leaf");
     leaf.addArg("leaf", integerType);
     tree.addConstructor(leaf);
 
@@ -147,12 +147,12 @@ class DatatypeBlack : public CxxTest::TestSuite {
     Datatype list(d_em, "list");
     Type integerType = d_em->integerType();
 
-    DatatypeConstructor cons("cons", "is_cons");
+    DatatypeConstructor cons("cons");
     cons.addArg("car", integerType);
     cons.addArg("cdr", DatatypeSelfType());
     list.addConstructor(cons);
 
-    DatatypeConstructor nil("nil", "is_nil");
+    DatatypeConstructor nil("nil");
     list.addConstructor(nil);
 
     Debug("datatypes") << list << std::endl;
@@ -172,12 +172,12 @@ class DatatypeBlack : public CxxTest::TestSuite {
     Datatype list(d_em, "list");
     Type realType = d_em->realType();
 
-    DatatypeConstructor cons("cons", "is_cons");
+    DatatypeConstructor cons("cons");
     cons.addArg("car", realType);
     cons.addArg("cdr", DatatypeSelfType());
     list.addConstructor(cons);
 
-    DatatypeConstructor nil("nil", "is_nil");
+    DatatypeConstructor nil("nil");
     list.addConstructor(nil);
 
     Debug("datatypes") << list << std::endl;
@@ -197,12 +197,12 @@ class DatatypeBlack : public CxxTest::TestSuite {
     Datatype list(d_em, "list");
     Type booleanType = d_em->booleanType();
 
-    DatatypeConstructor cons("cons", "is_cons");
+    DatatypeConstructor cons("cons");
     cons.addArg("car", booleanType);
     cons.addArg("cdr", DatatypeSelfType());
     list.addConstructor(cons);
 
-    DatatypeConstructor nil("nil", "is_nil");
+    DatatypeConstructor nil("nil");
     list.addConstructor(nil);
 
     Debug("datatypes") << list << std::endl;
@@ -227,24 +227,24 @@ class DatatypeBlack : public CxxTest::TestSuite {
      *   END;
      */
     Datatype tree(d_em, "tree");
-    DatatypeConstructor node("node", "is_node");
+    DatatypeConstructor node("node");
     node.addArg("left", DatatypeSelfType());
     node.addArg("right", DatatypeSelfType());
     tree.addConstructor(node);
 
-    DatatypeConstructor leaf("leaf", "is_leaf");
+    DatatypeConstructor leaf("leaf");
     leaf.addArg("leaf", DatatypeUnresolvedType("list"));
     tree.addConstructor(leaf);
 
     Debug("datatypes") << tree << std::endl;
 
     Datatype list(d_em, "list");
-    DatatypeConstructor cons("cons", "is_cons");
+    DatatypeConstructor cons("cons");
     cons.addArg("car", DatatypeUnresolvedType("tree"));
     cons.addArg("cdr", DatatypeSelfType());
     list.addConstructor(cons);
 
-    DatatypeConstructor nil("nil", "is_nil");
+    DatatypeConstructor nil("nil");
     list.addConstructor(nil);
 
     Debug("datatypes") << list << std::endl;
@@ -281,27 +281,27 @@ class DatatypeBlack : public CxxTest::TestSuite {
   void testMutualListTrees2()
   {
     Datatype tree(d_em, "tree");
-    DatatypeConstructor node("node", "is_node");
+    DatatypeConstructor node("node");
     node.addArg("left", DatatypeSelfType());
     node.addArg("right", DatatypeSelfType());
     tree.addConstructor(node);
 
-    DatatypeConstructor leaf("leaf", "is_leaf");
+    DatatypeConstructor leaf("leaf");
     leaf.addArg("leaf", DatatypeUnresolvedType("list"));
     tree.addConstructor(leaf);
 
     Datatype list(d_em, "list");
-    DatatypeConstructor cons("cons", "is_cons");
+    DatatypeConstructor cons("cons");
     cons.addArg("car", DatatypeUnresolvedType("tree"));
     cons.addArg("cdr", DatatypeSelfType());
     list.addConstructor(cons);
 
-    DatatypeConstructor nil("nil", "is_nil");
+    DatatypeConstructor nil("nil");
     list.addConstructor(nil);
 
     // add another constructor to list datatype resulting in an
     // "otherNil-list"
-    DatatypeConstructor otherNil("otherNil", "is_otherNil");
+    DatatypeConstructor otherNil("otherNil");
     list.addConstructor(otherNil);
 
     vector<Datatype> dts;
@@ -329,7 +329,7 @@ class DatatypeBlack : public CxxTest::TestSuite {
   void testNotSoWellFounded() {
     Datatype tree(d_em, "tree");
 
-    DatatypeConstructor node("node", "is_node");
+    DatatypeConstructor node("node");
     node.addArg("left", DatatypeSelfType());
     node.addArg("right", DatatypeSelfType());
     tree.addConstructor(node);