1 /********************* */
2 /*! \file theory_sets_rewriter.cpp
4 ** Original author: Kshitij Bansal
5 ** Major contributors: none
6 ** Minor contributors (to current version): none
7 ** This file is part of the CVC4 project.
8 ** Copyright (c) 2013-2014 New York University and The University of Iowa
9 ** See the file COPYING in the top-level source directory for licensing
10 ** information.\endverbatim
12 ** \brief Sets theory rewriter.
14 ** Sets theory rewriter.
17 #include "theory/sets/theory_sets_rewriter.h"
23 bool checkConstantMembership(TNode elementTerm
, TNode setTerm
)
25 switch(setTerm
.getKind()) {
28 case kind::SET_SINGLETON
:
29 return elementTerm
== setTerm
[0];
31 return checkConstantMembership(elementTerm
, setTerm
[0]) ||
32 checkConstantMembership(elementTerm
, setTerm
[1]);
33 case kind::INTERSECTION
:
34 return checkConstantMembership(elementTerm
, setTerm
[0]) &&
35 checkConstantMembership(elementTerm
, setTerm
[1]);
37 return checkConstantMembership(elementTerm
, setTerm
[0]) &&
38 !checkConstantMembership(elementTerm
, setTerm
[1]);
45 RewriteResponse
TheorySetsRewriter::postRewrite(TNode node
) {
46 NodeManager
* nm
= NodeManager::currentNM();
48 switch(node
.getKind()) {
51 if(!node
[0].isConst() || !node
[1].isConst())
55 bool isMember
= checkConstantMembership(node
[0], node
[1]);
56 return RewriteResponse(REWRITE_DONE
, nm
->mkConst(isMember
));
60 // rewrite (A subset-or-equal B) as (A union B = B)
63 return RewriteResponse(REWRITE_AGAIN
,
64 nm
->mkNode(kind::EQUAL
,
65 nm
->mkNode(kind::UNION
, A
, B
),
71 //rewrite: t = t with true (t term)
72 //rewrite: c = c' with c different from c' false (c, c' constants)
73 //otherwise: sort them
74 if(node
[0] == node
[1]) {
75 Trace("sets-postrewrite") << "Sets::postRewrite returning true" << std::endl
;
76 return RewriteResponse(REWRITE_DONE
, nm
->mkConst(true));
78 else if (node
[0].isConst() && node
[1].isConst()) {
79 Trace("sets-postrewrite") << "Sets::postRewrite returning false" << std::endl
;
80 return RewriteResponse(REWRITE_DONE
, nm
->mkConst(false));
82 else if (node
[0] > node
[1]) {
83 Node newNode
= nm
->mkNode(node
.getKind(), node
[1], node
[0]);
84 Trace("sets-postrewrite") << "Sets::postRewrite returning " << newNode
<< std::endl
;
85 return RewriteResponse(REWRITE_DONE
, newNode
);
91 case kind::INTERSECTION
: {
92 if(node
[0] == node
[1]) {
93 Trace("sets-postrewrite") << "Sets::postRewrite returning " << node
[0] << std::endl
;
94 return RewriteResponse(REWRITE_DONE
, node
[0]);
95 } else if (node
[0] > node
[1]) {
96 Node newNode
= nm
->mkNode(node
.getKind(), node
[1], node
[0]);
97 Trace("sets-postrewrite") << "Sets::postRewrite returning " << newNode
<< std::endl
;
98 return RewriteResponse(REWRITE_DONE
, newNode
);
106 }//switch(node.getKind())
108 // This default implementation
109 return RewriteResponse(REWRITE_DONE
, node
);
113 RewriteResponse
TheorySetsRewriter::preRewrite(TNode node
) {
114 NodeManager
* nm
= NodeManager::currentNM();
117 if(node
.getKind() == kind::EQUAL
&& node
[0] == node
[1])
118 return RewriteResponse(REWRITE_DONE
, nm
->mkConst(true));
119 // Further optimization, if constants but differing ones
121 return RewriteResponse(REWRITE_DONE
, node
);
124 }/* CVC4::theory::sets namespace */
125 }/* CVC4::theory namespace */
126 }/* CVC4 namespace */