Add is_singleton operator to the theory of sets (#5033)
authormudathirmahgoub <mudathirmahgoub@gmail.com>
Wed, 9 Sep 2020 18:19:40 +0000 (13:19 -0500)
committerGitHub <noreply@github.com>
Wed, 9 Sep 2020 18:19:40 +0000 (13:19 -0500)
commitb115aecf296b8d712363c506daecfab364f71712
tree17d88f6733011fdf3eda136be71524d9f497e79d
parent1d3bb6048085342e2d85bf5193367afcd96885fa
Add is_singleton operator to the theory of sets (#5033)

This pull request adds a new operator is_singleton for sets to determine whether a set is a singleton.
Before this operator, the user either uses an existential quantifier or the cardinality operator in smtlib. The former affects the performance especially when polarity is negative. The latter requires the cardinality extension in sets theory.
The implementation of is_singleton only uses an internal existential quantifier with the hope of optimizing it later.
New rewriting rules:

(is_singleton (singleton x)) is rewritten as true.
(is_singleton A) is rewritten as (= A (singleton x)) where x is a fresh skolem of the same type of elements of A.
(choose (singleton x)) is rewritten as x.
src/api/cvc4cpp.cpp
src/api/cvc4cppkind.h
src/parser/smt2/smt2.cpp
src/printer/smt2/smt2_printer.cpp
src/theory/sets/kinds
src/theory/sets/theory_sets_private.cpp
src/theory/sets/theory_sets_private.h
src/theory/sets/theory_sets_rewriter.cpp
src/theory/sets/theory_sets_type_rules.h
test/regress/CMakeLists.txt
test/regress/regress1/sets/is_singleton1.smt2 [new file with mode: 0644]