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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <gecode/set.hh>
00042 #include <gecode/set/rel.hh>
00043 #include <gecode/set/rel-op.hh>
00044
00045 namespace Gecode {
00046 using namespace Gecode::Set;
00047 using namespace Gecode::Set::Rel;
00048 using namespace Gecode::Set::RelOp;
00049
00050 void
00051 rel(Home home, SetVar x, SetOpType op, const IntSet& y, SetRelType r,
00052 const IntSet& z) {
00053 Set::Limits::check(y, "Set::rel");
00054 Set::Limits::check(z, "Set::rel");
00055 ConstSetView yv(home, y);
00056 ConstSetView zv(home, z);
00057
00058 if (op==SOT_MINUS) {
00059 switch (r) {
00060 case SRT_EQ:
00061 {
00062 GlbRanges<ConstSetView> yr(yv);
00063 RangesCompl<GlbRanges<ConstSetView> > yrc(yr);
00064 IntSet yc(yrc);
00065 ConstSetView cy(home, yc);
00066 GECODE_ES_FAIL(
00067 (Intersection<ConstSetView,
00068 SetView,ConstSetView>
00069 ::post(home,cy,x,zv)));
00070 }
00071 break;
00072 case SRT_NQ:
00073 {
00074 SetVar tmp(home);
00075 GECODE_ES_FAIL(
00076 (Distinct<SetView,ConstSetView>
00077 ::post(home,tmp,zv)));
00078 GlbRanges<ConstSetView> yr(yv);
00079 RangesCompl<GlbRanges<ConstSetView> > yrc(yr);
00080 IntSet yc(yrc);
00081 ConstSetView cy(home, yc);
00082 GECODE_ES_FAIL(
00083 (Intersection<ConstSetView,
00084 SetView,SetView>
00085 ::post(home,cy,x,tmp)));
00086 }
00087 break;
00088 case SRT_SUB:
00089 {
00090 GlbRanges<ConstSetView> yr(yv);
00091 RangesCompl<GlbRanges<ConstSetView> > yrc(yr);
00092 IntSet yc(yrc);
00093 ConstSetView cy(home, yc);
00094 GECODE_ES_FAIL(
00095 (SuperOfInter<ConstSetView,SetView,ConstSetView>
00096 ::post(home,cy,x,zv)));
00097
00098 }
00099 break;
00100 case SRT_SUP:
00101 {
00102
00103 SetVar tmp(home,z,Limits::min, Limits::max);
00104 SetView xv(x);
00105
00106 GlbRanges<ConstSetView> yr(yv);
00107 RangesCompl<GlbRanges<ConstSetView> > yrc(yr);
00108 IntSet yc(yrc);
00109 ConstSetView cy(home, yc);
00110
00111 GECODE_ES_FAIL(
00112 (Intersection<ConstSetView,
00113 SetView,SetView>
00114 ::post(home,cy,xv,tmp)));
00115 }
00116 break;
00117 case SRT_DISJ:
00118 {
00119 SetVar tmp(home);
00120 SetView tmpv(tmp);
00121 IntSetRanges zi(z);
00122 GECODE_ME_FAIL( tmpv.excludeI(home, zi));
00123
00124 GlbRanges<ConstSetView> yr(yv);
00125 RangesCompl<GlbRanges<ConstSetView> > yrc(yr);
00126 IntSet yc(yrc);
00127 ConstSetView cy(home, yc);
00128 GECODE_ES_FAIL(
00129 (Intersection<ConstSetView,
00130 SetView,SetView>
00131 ::post(home,cy,x,tmp)));
00132 }
00133 break;
00134 case SRT_CMPL:
00135 {
00136 SetView xv(x);
00137 ComplementView<SetView> cx(xv);
00138 GECODE_ES_FAIL(
00139 (Union<ConstSetView,
00140 ComplementView<SetView>,
00141 ConstSetView>::post(home, yv, cx, zv)));
00142 }
00143 break;
00144 default:
00145 throw UnknownRelation("Set::rel");
00146 }
00147 } else {
00148 rel(home, y, op, x, r, z);
00149 }
00150 }
00151
00152 }
00153
00154