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 SetVar z) {
00053 Set::Limits::check(y, "Set::rel");
00054 ConstantView yv(home, y);
00055
00056 if (op==SOT_MINUS) {
00057 switch (r) {
00058 case SRT_EQ:
00059 {
00060 GlbRanges<ConstantView> yr(yv);
00061 RangesCompl<GlbRanges<ConstantView> > yrc(yr);
00062 IntSet yc(yrc);
00063 ConstantView cy(home, yc);
00064 GECODE_ES_FAIL(
00065 (Intersection<ConstantView,
00066 SetView,SetView>
00067 ::post(home,cy,x,z)));
00068 }
00069 break;
00070 case SRT_NQ:
00071 {
00072 SetVar tmp(home);
00073 GECODE_ES_FAIL(
00074 (Distinct<SetView,SetView>
00075 ::post(home,z,tmp)));
00076 GlbRanges<ConstantView> yr(yv);
00077 RangesCompl<GlbRanges<ConstantView> > yrc(yr);
00078 IntSet yc(yrc);
00079 ConstantView cy(home, yc);
00080 GECODE_ES_FAIL(
00081 (Intersection<ConstantView,
00082 SetView,SetView>
00083 ::post(home,cy,x,tmp)));
00084 }
00085 break;
00086 case SRT_SUB:
00087 {
00088 GlbRanges<ConstantView> yr(yv);
00089 RangesCompl<GlbRanges<ConstantView> > yrc(yr);
00090 IntSet yc(yrc);
00091 ConstantView cy(home, yc);
00092 GECODE_ES_FAIL(
00093 (SuperOfInter<ConstantView,SetView,SetView>
00094 ::post(home,cy,x,z)));
00095
00096 }
00097 break;
00098 case SRT_SUP:
00099 {
00100 SetVar tmp(home);
00101 GECODE_ES_FAIL(
00102 (Subset<SetView,SetView>::post(home,z,tmp)));
00103
00104 GlbRanges<ConstantView> yr(yv);
00105 RangesCompl<GlbRanges<ConstantView> > yrc(yr);
00106 IntSet yc(yrc);
00107 ConstantView cy(home, yc);
00108
00109 SetView xv(x);
00110 GECODE_ES_FAIL(
00111 (Intersection<ConstantView,
00112 SetView,SetView>
00113 ::post(home,cy,xv,tmp)));
00114 }
00115 break;
00116 case SRT_DISJ:
00117 {
00118 SetVar tmp(home);
00119 EmptyView emptyset;
00120 GECODE_ES_FAIL((SuperOfInter<SetView,SetView,EmptyView>
00121 ::post(home, z, tmp, emptyset)));
00122
00123 GlbRanges<ConstantView> yr(yv);
00124 RangesCompl<GlbRanges<ConstantView> > yrc(yr);
00125 IntSet yc(yrc);
00126 ConstantView cy(home, yc);
00127 GECODE_ES_FAIL(
00128 (Intersection<ConstantView,
00129 SetView,SetView>
00130 ::post(home,cy,x,tmp)));
00131 }
00132 break;
00133 case SRT_CMPL:
00134 {
00135 SetView xv(x);
00136 ComplementView<SetView> cx(xv);
00137 GECODE_ES_FAIL(
00138 (Union<ConstantView,
00139 ComplementView<SetView>,
00140 SetView>::post(home, yv, cx, z)));
00141 }
00142 break;
00143 default:
00144 throw UnknownRelation("Set::rel");
00145 }
00146 } else {
00147 rel(home, y, op, x, r, z);
00148 }
00149 }
00150 }
00151
00152