summaryrefslogtreecommitdiff
path: root/test/unit/theory/theory_sets_rewriter_white.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/theory/theory_sets_rewriter_white.cpp')
-rw-r--r--test/unit/theory/theory_sets_rewriter_white.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/test/unit/theory/theory_sets_rewriter_white.cpp b/test/unit/theory/theory_sets_rewriter_white.cpp
new file mode 100644
index 000000000..49dbe0c73
--- /dev/null
+++ b/test/unit/theory/theory_sets_rewriter_white.cpp
@@ -0,0 +1,93 @@
+/******************************************************************************
+ * Top contributors (to current version):
+ * Mudathir Mohamed
+ *
+ * This file is part of the cvc5 project.
+ *
+ * Copyright (c) 2009-2021 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.
+ * ****************************************************************************
+ *
+ * White box testing of sets rewriter
+ */
+
+#include "expr/dtype.h"
+#include "expr/emptyset.h"
+#include "test_smt.h"
+#include "theory/sets/theory_sets_rewriter.h"
+#include "util/rational.h"
+#include "util/string.h"
+
+namespace cvc5 {
+
+using namespace theory;
+using namespace kind;
+using namespace theory::sets;
+
+namespace test {
+
+typedef expr::Attribute<Node, Node> attribute;
+
+class TestTheoryWhiteSetsRewriter : public TestSmt
+{
+ protected:
+ void SetUp() override
+ {
+ TestSmt::SetUp();
+ d_rewriter.reset(new TheorySetsRewriter());
+ }
+ std::unique_ptr<TheorySetsRewriter> d_rewriter;
+};
+
+TEST_F(TestTheoryWhiteSetsRewriter, map)
+{
+ Node one = d_nodeManager->mkConst(CONST_RATIONAL, Rational(1));
+ TypeNode stringType = d_nodeManager->stringType();
+ TypeNode integerType = d_nodeManager->integerType();
+ Node emptysetInteger =
+ d_nodeManager->mkConst(EmptySet(d_nodeManager->mkSetType(integerType)));
+ Node emptysetString =
+ d_nodeManager->mkConst(EmptySet(d_nodeManager->mkSetType(stringType)));
+ Node x = d_nodeManager->mkBoundVar("x", stringType);
+ Node bound = d_nodeManager->mkNode(kind::BOUND_VAR_LIST, x);
+ Node lambda = d_nodeManager->mkNode(LAMBDA, bound, one);
+
+ // (set.map (lambda ((x U)) t) (as set.empty (Set String)) =
+ // (as set.empty (Set Int))
+ Node n1 = d_nodeManager->mkNode(SET_MAP, lambda, emptysetString);
+ RewriteResponse response1 = d_rewriter->postRewrite(n1);
+ ASSERT_TRUE(response1.d_node == emptysetInteger
+ && response1.d_status == REWRITE_DONE);
+
+ Node a = d_nodeManager->mkConst(String("a"));
+ Node b = d_nodeManager->mkConst(String("b"));
+ Node A = d_nodeManager->mkSingleton(d_nodeManager->stringType(), a);
+ Node B = d_nodeManager->mkSingleton(d_nodeManager->stringType(), b);
+ Node unionAB = d_nodeManager->mkNode(SET_UNION, A, B);
+
+ // (set.map
+ // (lambda ((x String)) 1)
+ // (set.union (set.singleton "a") (set.singleton "b"))) = (set.singleton 1))
+ Node n2 = d_nodeManager->mkNode(SET_MAP, lambda, unionAB);
+ Node rewritten2 = Rewriter::rewrite(n2);
+ Node bag = d_nodeManager->mkSingleton(d_nodeManager->integerType(), one);
+ ASSERT_TRUE(rewritten2 == bag);
+
+ // - (set.map f (set.union K1 K2)) =
+ // (set.union (set.map f K1) (set.map f K2))
+ Node k1 = d_skolemManager->mkDummySkolem("K1", A.getType());
+ Node k2 = d_skolemManager->mkDummySkolem("K2", A.getType());
+ Node f = d_skolemManager->mkDummySkolem("f", lambda.getType());
+ Node unionK1K2 = d_nodeManager->mkNode(SET_UNION, k1, k2);
+ Node n3 = d_nodeManager->mkNode(SET_MAP, f, unionK1K2);
+ Node rewritten3 = Rewriter::rewrite(n3);
+ Node mapK1 = d_nodeManager->mkNode(SET_MAP, f, k1);
+ Node mapK2 = d_nodeManager->mkNode(SET_MAP, f, k2);
+ Node unionMapK1K2 = d_nodeManager->mkNode(SET_UNION, mapK1, mapK2);
+ ASSERT_TRUE(rewritten3 == unionMapK1K2);
+}
+
+} // namespace test
+} // namespace cvc5
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback