7 #include "normalizer.h"
9 char * Action::calculatebound(Constraint *c, Label *clabel) {
10 return getset(c,clabel->label());
13 char * Action::getset(Constraint *c, char *v) {
17 for(int i=0;i<c->numquants();i++) {
18 if(equivalentstrings(c->getquant(i)->getlabel()->label(),v)) {
19 if (c->getquant(i)->getset()->gettype()==SET_label)
20 set=c->getquant(i)->getset()->getname();
27 bool Action::possiblysameset(char *v1, Constraint *c1, char *v2, Constraint *c2) {
28 return possiblysameset(getset(c1,v1),getset(c2,v2));
31 bool Action::comparepredicates(Constraint *c1, CoercePredicate *cp1, Constraint *c2, CoercePredicate *cp2) {
32 if (cp1->getcoercebool()!=cp2->getcoercebool())
34 Predicate *p1=cp1->getpredicate();
35 Predicate *p2=cp2->getpredicate();
36 if (p1->gettype()!=p2->gettype())
38 int type=p1->gettype();
39 if (type==PREDICATE_LT ||
40 type==PREDICATE_LTE ||
41 type==PREDICATE_EQUALS ||
42 type==PREDICATE_GTE ||
44 char *v1=p1->getvalueexpr()->getlabel()->label();
45 char *v2=p2->getvalueexpr()->getlabel()->label();
46 if (!equivalentstrings(p1->getvalueexpr()->getrelation()->getname(),
47 p2->getvalueexpr()->getrelation()->getname()))
49 if (!(compareee(p1->geteleexpr(),v1,p2->geteleexpr(),v2)))
54 if (type==PREDICATE_SET) {
55 char *v1=p1->getlabel()->label();
56 char *v2=p2->getlabel()->label();
57 return comparesetexpr(p1->getsetexpr(),v1,p2->getsetexpr(),v2);
59 if (type==PREDICATE_EQ1||type==PREDICATE_GTE1) {
60 if(p1->getsetexpr()->gettype()!=p2->getsetexpr()->gettype())
62 switch(p1->getsetexpr()->gettype()) {
64 return equivalentstrings(p1->getsetexpr()->getsetlabel()->getname(), p2->getsetexpr()->getsetlabel()->getname());
67 case SETEXPR_INVREL: {
68 /* these can't interfere....*/
69 return equivalentstrings(p1->getsetexpr()->getrelation()->getname(), p2->getsetexpr()->getrelation()->getname());
73 return false; /* by default */
76 bool Action::comparesetexpr(Setexpr *s1,char *v1,Setexpr *s2,char *v2) {
77 if (s1->gettype()!=s2->gettype())
79 switch(s1->gettype()) {
81 if (!equivalentstrings(s1->getsetlabel()->getname(),
82 s2->getsetlabel()->getname()))
87 if (!equivalentstrings(v1, s1->getlabel()->label()))
89 if (!equivalentstrings(v2, s2->getlabel()->label()))
91 if (!equivalentstrings(s1->getrelation()->getname(),
92 s2->getrelation()->getname()))
100 bool Action::compareee(Elementexpr *ee1,char *v1,Elementexpr *ee2,char *v2) {
101 if (ee1->gettype()!=ee2->gettype())
103 switch(ee1->gettype()) {
104 case ELEMENTEXPR_LABEL:
105 if (!equivalentstrings(ee1->getlabel()->label(),v1))
107 if (!equivalentstrings(ee2->getlabel()->label(),v2))
110 case ELEMENTEXPR_SUB:
111 if (compareee(ee1->getleft(),v1,ee2->getleft(),v2) &&
112 compareee(ee1->getright(),v1,ee2->getright(),v2))
115 case ELEMENTEXPR_RELATION:
116 if (compareee(ee1->getleft(),v1,ee2->getleft(),v2) &&
117 equivalentstrings(ee1->getrelation()->getname(),ee2->getrelation()->getname()))
120 case ELEMENTEXPR_ADD:
121 case ELEMENTEXPR_MULT:
122 if ((compareee(ee1->getleft(),v1,ee2->getleft(),v2) &&
123 compareee(ee1->getright(),v1,ee2->getright(),v2))||
124 (compareee(ee1->getleft(),v1,ee2->getright(),v2) &&
125 compareee(ee1->getright(),v1,ee2->getleft(),v2)))
128 case ELEMENTEXPR_LIT:
129 if (ee1->getliteral()->gettype()!=
130 ee2->getliteral()->gettype())
132 switch(ee1->getliteral()->gettype()) {
134 return (ee1->getliteral()->number()==ee2->getliteral()->number());
136 return (equivalentstrings(ee1->getliteral()->token(),ee2->getliteral()->token()));
140 case ELEMENTEXPR_SETSIZE:
141 return comparesetexpr(ee1->getsetexpr(),v1,ee2->getsetexpr(),v2);
147 bool Action::possiblysameset(char *set1, char *v2, Constraint *c2) {
148 return possiblysameset(set1,getset(c2,v2));
151 bool Action::possiblysameset(char *set1,char *set2) {
152 if (set1==NULL||set2==NULL)
153 return true; /* At least one variable isn't spanning over a set...could be from any set*/
154 DomainSet *dset1=domrelation->getset(set1);
155 DomainSet *dset2=domrelation->getset(set2);
156 WorkSet *ws=new WorkSet(true);
158 ws->addobject(dset1);
159 dset1=domrelation->getsuperset(dset1);
162 if (!ws->contains(dset2)) {
164 if (ws->contains(dset2)) {
165 if (dset2->gettype()==DOMAINSET_PARTITION&&
172 dset2=domrelation->getsuperset(dset2);
179 bool Action::conflictwithaddtoset(char *set, Constraint *c, CoercePredicate *p) {
180 /* Test for conflict with abstraction function */
182 equivalentstrings(p->gettriggerset(),set))
185 /* Test for add new constraint */
187 for(int i=0;i<c->numquants();i++) {
188 if (c->getquant(i)->getset()->gettype()==SET_label)
189 if (equivalentstrings(c->getquant(i)->getset()->getname(),set)) {
190 return true; /*we're adding this constraint because of inclusion*/
194 /* Test for conflict with a \notin set */
196 (p->getcoercebool()==false)&&
197 (p->getpredicate()->gettype()==PREDICATE_SET)&&
198 (p->getpredicate()->getsetexpr()->gettype()==SETEXPR_LABEL)) {
199 char *psetname=p->getpredicate()->getsetexpr()->getsetlabel()->getname();
200 if (equivalentstrings(psetname,set)) {
204 /* Test for conflict with setsize=1 */
206 (p->getcoercebool()==true)&&
207 (p->getpredicate()->gettype()==PREDICATE_EQ1)&&
208 (p->getpredicate()->getsetexpr()->gettype()==SETEXPR_LABEL)) {
209 char *psetname=p->getpredicate()->getsetexpr()->getsetlabel()->getname();
210 if (equivalentstrings(psetname,set))
216 bool Action::conflictwithremovefromset(WorkSet * checkother,char *set, Constraint *c, CoercePredicate *p) {
217 /* Check for conflict with set size predicate */
219 (p->getcoercebool()==true)&&
220 ((p->getpredicate()->gettype()==PREDICATE_EQ1)||
221 (p->getpredicate()->gettype()==PREDICATE_GTE1)) &&
222 (p->getpredicate()->getsetexpr()->gettype()==SETEXPR_LABEL)) {
223 char *psetname=p->getpredicate()->getsetexpr()->getsetlabel()->getname();
224 if (equivalentstrings(psetname,set))
228 /* Check for conflict with a in SET */
230 (p->getcoercebool()==true)&&
231 (p->getpredicate()->gettype()==PREDICATE_SET)&&
232 (p->getpredicate()->getsetexpr()->gettype()==SETEXPR_LABEL)) {
233 char *psetname=p->getpredicate()->getsetexpr()->getsetlabel()->getname();
234 if (equivalentstrings(psetname,set))
238 /* Check for domain's of relation */
239 DomainRelation *domrelation=globalmodel->getdomainrelation();
240 for(int i=0;i<domrelation->getnumrelation();i++) {
241 DRelation *drelation=domrelation->getrelation(i);
242 char *domain=drelation->getdomain();
243 if(equivalentstrings(domain,set)) {
244 testforconflictremove(set,NULL,drelation->getname(),c,p);
245 if(drelation->isstatic()) {
247 if(checkother==NULL) {
249 checkother=new WorkSet((unsigned int (*)(void *)) & hashstring,(int (*)(void *,void *)) &equivalentstrings);
251 if(!checkother->contains(drelation->getrange())) {
252 checkother->addobject(drelation->getrange());
253 if (conflictwithremovefromset(checkother, drelation->getrange(),c,p))
255 checkother->removeobject(drelation->getrange());
262 /* Check for range's of relation */
263 for(int i=0;i<domrelation->getnumrelation();i++) {
264 DRelation *drelation=domrelation->getrelation(i);
265 char *range=drelation->getrange();
266 if (equivalentstrings(range,set)) {
267 testforconflictremove(NULL,set,drelation->getname(),c,p);
273 /* remove <v,a> from r */
274 bool Action::testforconflictremove(char *setv, char *seta, char *rel, Constraint *c, CoercePredicate *p) {
275 /* check for conflict with v.r=? */
277 int type=p->getpredicate()->gettype();
278 if ((type==PREDICATE_LT||type==PREDICATE_LTE||type==PREDICATE_EQUALS||type==PREDICATE_GT||type==PREDICATE_GTE) &&
279 possiblysameset(setv,p->getpredicate()->getvalueexpr()->getlabel()->label(),c) &&
280 equivalentstrings(rel,p->getpredicate()->getvalueexpr()->getrelation()->getname()))
283 /* check for conflict with |v'.r|?=1 */
284 if ((p->getpredicate()->gettype()==PREDICATE_EQ1||p->getpredicate()->gettype()==PREDICATE_GTE1)&&
285 p->getpredicate()->getsetexpr()->gettype()==SETEXPR_REL&&
286 possiblysameset(setv,p->getpredicate()->getsetexpr()->getlabel()->label(),c)&&
287 equivalentstrings(rel,p->getpredicate()->getsetexpr()->getrelation()->getname()))
290 /* check for conflict with |a'.~r|?=1 */
291 if ((p->getpredicate()->gettype()==PREDICATE_EQ1||p->getpredicate()->gettype()==PREDICATE_GTE1) &&
292 p->getpredicate()->getsetexpr()->gettype()==SETEXPR_INVREL &&
293 possiblysameset(seta,p->getpredicate()->getsetexpr()->getlabel()->label(),c)&&
294 equivalentstrings(rel,p->getpredicate()->getsetexpr()->getrelation()->getname()))
297 /* check for conflit with (a' in v'.r)*/
298 if (p->getcoercebool()&&
299 p->getpredicate()->gettype()==PREDICATE_SET&&
300 p->getpredicate()->getsetexpr()->gettype()==SETEXPR_REL&&
301 possiblysameset(seta,p->getpredicate()->getlabel()->label(),c)&&
302 possiblysameset(setv,p->getpredicate()->getsetexpr()->getlabel()->label(),c)&&
303 equivalentstrings(rel,p->getpredicate()->getsetexpr()->getrelation()->getname()))
306 /* check for conflict with (a' in v'.~r)*/
307 if (p->getcoercebool()&&
308 p->getpredicate()->gettype()==PREDICATE_SET&&
309 p->getpredicate()->getsetexpr()->gettype()==SETEXPR_INVREL &&
310 possiblysameset(seta,p->getpredicate()->getsetexpr()->getlabel()->label(),c) &&
311 possiblysameset(setv,p->getpredicate()->getlabel()->label(),c) &&
312 equivalentstrings(rel,p->getpredicate()->getsetexpr()->getrelation()->getname()))
320 bool Action::testforconflict(char *setv, char *seta, char *rel, Constraint *c, CoercePredicate *p) {
321 /* check for conflict with valueexpr*/
323 (p->getpredicate()->gettype()==PREDICATE_LT ||
324 p->getpredicate()->gettype()==PREDICATE_LTE ||
325 p->getpredicate()->gettype()==PREDICATE_EQUALS ||
326 p->getpredicate()->gettype()==PREDICATE_GTE ||
327 p->getpredicate()->gettype()==PREDICATE_GT) &&
328 possiblysameset(setv,p->getpredicate()->getvalueexpr()->getlabel()->label(),c) &&
329 equivalentstrings(rel,p->getpredicate()->getvalueexpr()->getrelation()->getname()))
332 /* check for conflict with |v'.r'|=1 */
334 p->getpredicate()->gettype()==PREDICATE_EQ1&&
335 p->getpredicate()->getsetexpr()->gettype()==SETEXPR_REL&&
336 possiblysameset(setv,p->getpredicate()->getsetexpr()->getlabel()->label(),c)&&
337 equivalentstrings(rel,p->getpredicate()->getsetexpr()->getrelation()->getname()))
340 /* try to catch case of |a'.~r|=1 */
342 p->getpredicate()->gettype()==PREDICATE_EQ1 &&
343 p->getpredicate()->getsetexpr()->gettype()==SETEXPR_INVREL &&
344 possiblysameset(seta,p->getpredicate()->getsetexpr()->getlabel()->label(),c)&&
345 equivalentstrings(rel,p->getpredicate()->getsetexpr()->getrelation()->getname()))
348 /* try to catch case of !(a' in v'.r)*/
350 !p->getcoercebool()&&
351 p->getpredicate()->gettype()==PREDICATE_SET&&
352 p->getpredicate()->getsetexpr()->gettype()==SETEXPR_REL&&
353 possiblysameset(seta,p->getpredicate()->getlabel()->label(),c)&&
354 possiblysameset(setv,p->getpredicate()->getsetexpr()->getlabel()->label(),c)&&
355 equivalentstrings(rel,p->getpredicate()->getsetexpr()->getrelation()->getname()))
359 /* try to catch case of !(a' in v'.~r)*/
361 !p->getcoercebool()&&
362 p->getpredicate()->gettype()==PREDICATE_SET&&
363 p->getpredicate()->getsetexpr()->gettype()==SETEXPR_INVREL&&
364 possiblysameset(seta,p->getpredicate()->getsetexpr()->getlabel()->label(),c)&&
365 possiblysameset(setv,p->getpredicate()->getlabel()->label(),c)&&
366 equivalentstrings(rel,p->getpredicate()->getsetexpr()->getrelation()->getname()))