00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "gecode/set.hh"
00026 #include "gecode/iter.hh"
00027 #include "gecode/set/rel.hh"
00028 #include "gecode/set/rel-op.hh"
00029
00030 namespace Gecode {
00031 using namespace Gecode::Set;
00032 using namespace Gecode::Set::Rel;
00033 using namespace Gecode::Set::RelOp;
00034
00035 void
00036 rel(Space* home, const IntSet& x, SetOpType op, SetVar y, SetRelType r,
00037 SetVar z) {
00038 ConstantView xv(home, x);
00039 rel_op_post<ConstantView,SetView,SetView>(home, xv, op, y, r, z);
00040 }
00041
00042 void
00043 rel(Space* home, SetVar x, SetOpType op, const IntSet& y, SetRelType r,
00044 SetVar z) {
00045 ConstantView yv(home, y);
00046
00047 if (op==SOT_MINUS) {
00048 switch(r) {
00049 case SRT_EQ:
00050 {
00051 ComplementView<ConstantView> cy(yv);
00052 GECODE_ES_FAIL(home,
00053 (Intersection<ComplementView<ConstantView>,
00054 SetView,SetView>
00055 ::post(home,cy,x,z)));
00056 }
00057 break;
00058 case SRT_NQ:
00059 {
00060 SetVar tmp(home);
00061 GECODE_ES_FAIL(home,
00062 (Distinct<SetView,SetView>
00063 ::post(home,z,tmp)));
00064 ComplementView<ConstantView> cy(yv);
00065 GECODE_ES_FAIL(home,
00066 (Intersection<ComplementView<ConstantView>,
00067 SetView,SetView>
00068 ::post(home,cy,x,tmp)));
00069 }
00070 break;
00071 case SRT_SUB:
00072 {
00073 ComplementView<ConstantView> cy(yv);
00074 GECODE_ES_FAIL(home,
00075 (SuperOfInter<SetView,
00076 ComplementView<ConstantView>,SetView>
00077 ::post(home,x,cy,z)));
00078
00079 }
00080 break;
00081 case SRT_SUP:
00082 {
00083 SetVar tmp(home);
00084 GECODE_ES_FAIL(home,
00085 (SubSet<SetView,SetView>::post(home,z,tmp)));
00086
00087 SetView xv(x);
00088 ComplementView<SetView> cx(xv);
00089 GECODE_ES_FAIL(home,
00090 (Intersection<ConstantView,
00091 ComplementView<SetView>,SetView>
00092 ::post(home,yv,cx,tmp)));
00093 }
00094 break;
00095 case SRT_DISJ:
00096 {
00097 SetVar tmp(home);
00098 EmptyView emptyset;
00099 GECODE_ES_FAIL(home,(SuperOfInter<SetView,SetView,EmptyView>
00100 ::post(home, z, tmp, emptyset)));
00101
00102 ComplementView<ConstantView> cy(yv);
00103 GECODE_ES_FAIL(home,
00104 (Intersection<ComplementView<ConstantView>,
00105 SetView,SetView>
00106 ::post(home,cy,x,tmp)));
00107 }
00108 break;
00109 case SRT_CMPL:
00110 {
00111 SetView xv(x);
00112 ComplementView<SetView> cx(xv);
00113 GECODE_ES_FAIL(home,
00114 (Union<ConstantView,
00115 ComplementView<SetView>,
00116 SetView>::post(home, yv, cx, z)));
00117 }
00118 break;
00119 }
00120 } else {
00121 rel_op_post<ConstantView,SetView,SetView>(home, yv, op, x, r, z);
00122 }
00123 }
00124
00125 void
00126 rel(Space* home, SetVar x, SetOpType op, SetVar y, SetRelType r,
00127 const IntSet& z) {
00128 ConstantView zv(home, z);
00129 rel_op_post<SetView,SetView,ConstantView>(home, x, op, y, r, zv);
00130 }
00131
00132 void
00133 rel(Space* home, const IntSet& x, SetOpType op, const IntSet& y,
00134 SetRelType r, SetVar z) {
00135 ConstantView xv(home, x);
00136 ConstantView yv(home, y);
00137 rel_op_post<ConstantView,ConstantView,SetView>(home, xv, op, yv, r, z);
00138 }
00139
00140 void
00141 rel(Space* home, const IntSet& x, SetOpType op, SetVar y, SetRelType r,
00142 const IntSet& z) {
00143 ConstantView xv(home, x);
00144 ConstantView zv(home, z);
00145 rel_op_post<ConstantView,SetView,ConstantView>(home, xv, op, y, r, zv);
00146 }
00147
00148 void
00149 rel(Space* home, SetVar x, SetOpType op, const IntSet& y, SetRelType r,
00150 const IntSet& z) {
00151 ConstantView yv(home, y);
00152 ConstantView zv(home, z);
00153
00154 if (op==SOT_MINUS) {
00155 switch(r) {
00156 case SRT_EQ:
00157 {
00158 ComplementView<ConstantView> cy(yv);
00159 GECODE_ES_FAIL(home,
00160 (Intersection<ComplementView<ConstantView>,
00161 SetView,ConstantView>
00162 ::post(home,cy,x,zv)));
00163 }
00164 break;
00165 case SRT_NQ:
00166 {
00167 SetVar tmp(home);
00168 GECODE_ES_FAIL(home,
00169 (Distinct<ConstantView,SetView>
00170 ::post(home,zv,tmp)));
00171 ComplementView<ConstantView> cy(yv);
00172 GECODE_ES_FAIL(home,
00173 (Intersection<ComplementView<ConstantView>,
00174 SetView,SetView>
00175 ::post(home,cy,x,tmp)));
00176 }
00177 break;
00178 case SRT_SUB:
00179 {
00180 ComplementView<ConstantView> cy(yv);
00181 GECODE_ES_FAIL(home,
00182 (SuperOfInter<SetView,
00183 ComplementView<ConstantView>,ConstantView>
00184 ::post(home,x,cy,zv)));
00185
00186 }
00187 break;
00188 case SRT_SUP:
00189 {
00190
00191 SetVar tmp(home,z,Limits::Set::int_min, Limits::Set::int_max);
00192 SetView xv(x);
00193 ComplementView<SetView> cx(xv);
00194
00195 GECODE_ES_FAIL(home,
00196 (Intersection<ConstantView,
00197 ComplementView<SetView>,SetView>
00198 ::post(home,yv,cx,tmp)));
00199 }
00200 break;
00201 case SRT_DISJ:
00202 {
00203 SetVar tmp(home);
00204 SetView tmpv(tmp);
00205 IntSetRanges zi(z);
00206 GECODE_ME_FAIL(home, tmpv.excludeI(home, zi));
00207
00208 ComplementView<ConstantView> cy(yv);
00209 GECODE_ES_FAIL(home,
00210 (Intersection<ComplementView<ConstantView>,
00211 SetView,SetView>
00212 ::post(home,cy,x,tmp)));
00213 }
00214 break;
00215 case SRT_CMPL:
00216 {
00217 SetView xv(x);
00218 ComplementView<SetView> cx(xv);
00219 GECODE_ES_FAIL(home,
00220 (Union<ConstantView,
00221 ComplementView<SetView>,
00222 ConstantView>::post(home, yv, cx, zv)));
00223 }
00224 break;
00225 }
00226 } else {
00227 rel_op_post<ConstantView,SetView,ConstantView>(home, yv, op, x, r, zv);
00228 }
00229 }
00230
00231 }
00232
00233